Xamarin.Android Proguard - Unsupported class version number 52.0 - xamarin

I'm trying to use Proguard in my Xamarin.Android project, yet the compilation fails with the error Unsupported class version number [52.0] (maximum 51.0, Java 1.7)
I saw from those two questions that it may be a mismatch between Java 7 and Java 8, more precisely some versions of proguard don't support Java 8. However in Xamarin Preferences -> SDK Location, Java SDK points to JDK 7 : /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
Is there any place where proguard can be configured more precisely ? Any other idea ?
Here's the failure log :
java.io.IOException: Can't read
[/Library/Frameworks/Xamarin.Android.framework/Versions/7.0.0-18/lib/xbuild-frameworks/MonoAndroid/v7.0/mono.android.jar]
(Can't process class [android/app/ActivityTracker.class] (Unsupported
class version number [52.0] (maximum 51.0, Java 1.7))) at
proguard.InputReader.readInput(InputReader.java:230) at
proguard.InputReader.readInput(InputReader.java:200) at
proguard.InputReader.readInput(InputReader.java:178) at
proguard.InputReader.execute(InputReader.java:78) at
proguard.ProGuard.readInput(ProGuard.java:196) at
proguard.ProGuard.execute(ProGuard.java:78) at
proguard.ProGuard.main(ProGuard.java:492) Caused by:
java.io.IOException: Can't process class
[android/app/ActivityTracker.class] (Unsupported class version number
[52.0] (maximum 51.0, Java 1.7)) at
proguard.io.ClassReader.read(ClassReader.java:112) at
proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
at proguard.io.JarReader.read(JarReader.java:65) at
proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65) at
proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53) at
proguard.InputReader.readInput(InputReader.java:226) ... 6 more
Caused by: java.lang.UnsupportedOperationException: Unsupported class
version number [52.0] (maximum 51.0, Java 1.7) at
proguard.classfile.util.ClassUtil.checkVersionNumbers(ClassUtil.java:140)
at
proguard.classfile.io.ProgramClassReader.visitProgramClass(ProgramClassReader.java:88)
at proguard.classfile.ProgramClass.accept(ProgramClass.java:346) at
proguard.io.ClassReader.read(ClassReader.java:91) ... 11 more
9 Warning(s) 1 Error(s)

You need to update the default Android SDK proguard.jar with the latest version of Proguard found here:
https://sourceforge.net/projects/proguard/files/
I would recommend that you install this on the side of the default version that Android ships in android-sdk\tools\proguard. Simply rename the existing folder to something else and add the new version of proguard.
This is listed in the Xamarin.Android 7.0 release notes:
https://developer.xamarin.com/releases/android/xamarin.android_7/xamarin.android_7.0/
In which the following bug was logged as well:
https://bugzilla.xamarin.com/show_bug.cgi?id=44187
Which is coordinated with a Pull Request in the Xamarin.Android repository:
https://github.com/xamarin/xamarin-android/pull/209

I had a problem where Proguard was removing the Google Play Services libraries from my app.
In addition to following #Jon Douglas' answer above, I had to add the following lines of text to the proguard-android.txt file found in this folder:
/(Path to your Android SDK Folder)/tools/proguard
-keep public class com.google.android.gms.* { public *; }
-dontwarn com.google.android.gms.**
Complete proguard-android.txt File
-keep public class com.google.android.gms.* { public *; }
-dontwarn com.google.android.gms.**
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
# Understand the #Keep support annotation.
-keep class android.support.annotation.Keep
-keep #android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
#android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
#android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
#android.support.annotation.Keep <init>(...);
}

Simple Answer
According to documentation you need update proguard version (starting from version 5 it support Java 8 ) and make sure you are using jdk1.8
JDK 1.8 - up to API 24+
JDK 1.7 - up to API 23
JDK 1.6 - up to API 20
how to update from package console write this command
PM> Install-Package name.atsushieno.proguard.facebook
https://www.nuget.org/packages/name.atsushieno.proguard.facebook
or download proguard manually and replace it with current version
YOUR_SDK --> tools --> proguard --> (delete all old files , unzip new version )
Detailed Answer if you enable target android Nogut and you enable Multi-Dex or ProGuard you need use proper ProGuard version (as ToolMakerSteve said they have dependency on ProGuard)
so make sure you target java 8 from tools ->options ->xamarin ->java and update ProGuard version
Update Answer
make sure your support library version compatible with target version , if you target
Android 7 (api 24) mean your support library should be 24
Android 7.1 (api 25 ) mean your support library should be 25
to all support library and if you using google play services as well

I was also facing the same issue on my Windows 10 x64 and visual studio 2015. I have set the JDK path to JDK 1.8 under android settings in Visual studio
tools ->options ->xamarin ->java development kit location. it was pointing to "C:\Program Files (x86)\Java\jdk1.7.0_55" and I made it to "C:\Program Files\Java\jdk1.8.0_31", and issue has been fixed.

Using Visual Studio
If you are using Visual Studio 2017 or 2019, please note that these applications pack their proguard. For 2019, proguard version: 5.3.2. For me, I needed version 6.0.3, so I made a backup of the proguard.jar file at:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Xamarin\Android\proguard\lib
And copied the latest one from zip from the sourceforge site.

To get ProGuard work, you have to follow few steps
First Download latest ProGuard file from here, unzip and paste in your android-sdk\tools\proguard folder
First you need to add proguard.cfg to your android project level.
Change proguard.cfg file build action to ProguardConfiguration Change
proguard.cfg file Encoding using Notepad++ to UTF-8
If you are getting warnings then you need to use -dontwarn attribute like below
-dontwarn com.symbol.emdk.**
-dontwarn org.apache.http.**
-dontwarn com.appdynamics.eumagent.runtime.**
You must need to remove/solve warning because that cause errors. Above code will remove all of your warnings.
If you are getting exception after executing your application you need to use -keep attribute. like below for required classes
-keep public class android.support.v7.widget.** { *; }

Related

Use withType() for configuring Gradle task not compiling in IntelliJ

I'm trying to configure the Test task inside a custom Gradle plugin written in Java.
Applying the plugins I need like so in build.gradle.kts:
plugins {
`java-gradle-plugin`
`maven-publish`
}
I can compile the code successfully through the command line as in ./gradlew clean build
But, IntelliJ complains about Test.class in the following code:
public static void configureTesting(final Project project) {
project.getTasks().withType(Test.class).configureEach(task -> {
});
}
Saying:
Required type: java.lang.Class <S>
Provided: java.lang.Class <Test>
reason: no instance(s) of type variable(s) exist so that T conforms to Task
I import the Test class like this:
import org.gradle.api.tasks.testing.Test;
Gradle version: 6.7.1
IntelliJ: 2020.2.3
I spent some (a lot of) time googling this. Eventually I found a comment somewhere saying that one could try to use the internal SDK (jbr) that ships with IntelliJ instead of a manually downloaded SDK. That made it work. The internal SDK is Java 11 and I've also installed the latest version of Java 11 from Oracle. Even though they are both Java 11, the internal SDK (jbr) is working as it should, but not the external SDK. For other projects the external SDK is working fine, but not for building a Gradle plugin.

Class TimeSheetEntryField missing from WorkforceTimesheet in S4 SDK

I am updating one of our S4 SDK projects to use the latest version of the SDK and I noticed then when I try to build the project I got the error:
cannot find symbol> [ERROR] symbol: class TimeSheetEntryField
When I look at the Javadocs I can see that this class existed in version 2.7.0 but is missing in the next version 2.8.0
This import throws an error as it cannot find the class in the newer version:
com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.workforcetimesheet.TimeSheetEntryField;
I can't see any notice of deprecation. Can you help?
Thanks,
Simon
This class has been moved to a new package com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.workforcetimesheet.field (see Javadoc) with version 2.8.0. Please update your import accordingly by adding .field to the package name.
As mentioned in the release notes, this was necessary to avoid potential name clashes in the virtual data model of the SAP S/4HANA Cloud SDK.

How to resolve D8 warning: D8: Type `org.conscrypt.Conscrypt` was not found

/Volumes/SSD/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3/okhttp/3.10.0/7ef0f1d95bf4c0b3ba30bbae25e0e562b05cf75e/okhttp-3.10.0.jar: D8: Type `org.conscrypt.Conscrypt` was not found, it is required for default or static interface methods desugaring of `okhttp3.internal.platform.Platform okhttp3.internal.platform.ConscryptPlatform.buildIfSupported()`
I was able to solve the problem with adding:
-dontwarn okhttp3.internal.platform.ConscryptPlatform
to the proguard-rules.pro file.
According to https://github.com/square/okhttp/issues/3922, it is safe to ignore these warnings.
If the build does not succeed, I suppose there is another problem.
Probably https://github.com/square/okhttp/issues/4604 will help, but I didn't try.
buildscript {
...
repositories {
...
maven {
url 'http://storage.googleapis.com/r8-releases/raw'
}
}
dependencies {
classpath 'com.android.tools:r8:1.4.57' // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:3.3.1' // You don't need to upgrade this to use a newer R8 version.
...
}
}
In my case I added OkHttp library and it's Proguard rules. Then removed the library but forgot to remove rules. You can comment or remove these lines from proguard-rules.pro if you removed OkHttp from build.gradle:
### OkHttp.
# JSR 305 annotations are for embedding nullability information.
-dontwarn javax.annotation.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
-dontwarn org.codehaus.mojo.animal_sniffer.*
# OkHttp platform used only on JVM and when Conscrypt dependency is available.
-dontwarn okhttp3.internal.platform.ConscryptPlatform
From ./gradlew assemble
R8 is the new Android code shrinker. If you experience any issues,
please file a bug at https://issuetracker.google.com, using 'Shrinker
(R8)' as component name. You can disable R8 by updating
gradle.properties with 'android.enableR8=false'. Current version is:
1.4.94 (build 390954928f0db9c3b888a367f7f128ce3bbfb160 from go/r8bot (luci-r8-ci-archive-0-5g74)).

Android Studio NDK error, couldn't find GLES3/gl3.h although it exist

I'm trying to make an app on Android Studio that use the NDK and OpenGL ES 3.0.When I #include < GLES3/gl3.h >, the IDE has auto completion as I typing, I think it's a sign meaning that the IDE can find it
However, I got the error : "Error:(22, 10) fatal error: 'GLES3/gl3.h' file not found" when I build the project. I check the NDK path in Project Structure, which is :
sdk\ndk-bundle\platforms\android-21\arch-arm64\usr\include\GLES3
it's correct and the GLES3/gl3.h does exist there.
I have declared my CMakeList with GLESv3 already:
cmake_minimum_required(VERSION 3.4.1)
# now build app's shared lib
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
add_library(gl3jni SHARED
gl_code.cpp
stb_image.cpp
)
# add lib dependencies
target_link_libraries(gl3jni
android
log
EGL
GLESv3)
I also declare the OpenGL ES version in the Manifest.xml with:
<uses-feature android:glEsVersion="0x00030000" android:required="true"/>
What am I doing wrong?
Android ndk-bundle has openglES3 since api 18, but in arm platform.
I mean, if you are going to compile your project in armV8_64, you must set your min sdk to 21. But if you are going to use armeabi or armeabiV7 the minimum api will be 18.
So change your minSDK dependig on your preferences in the app/build.gradle file.
I suggest you to define the API 21 and define your product flavours to support for all architectures, besides you can make other 3rdparty library linkings, the code should be something like this:
android.productFlavors {
// for detailed abiFilter descriptions, refer to "Supported ABIs" #
// https://developer.android.com/ndk/guides/abis.html#sa
create("arm") {
ndk.abiFilters.add("armeabi")
ndk.ldFlags.add("-L${file(''your_libraries_path'')}".toString())
ndk.ldLibs.addAll(["your_armeabi_library"])
}
create("arm7") {
ndk.abiFilters.add("armeabi-v7a")
ndk.ldFlags.add("-L${file('your_libraries_path')}".toString())
ndk.ldLibs.addAll(["your_armv7_library"])
}
create("arm8") {
ndk.abiFilters.add("arm64-v8a")
ndk.ldFlags.add("-L${file(''your_libraries_path')}".toString())
ndk.ldLibs.addAll(["your_armv8_library"])
}
}
This gradle code is from the gradle 0.8.3 experimental plugin, so if you have not this version, you need to make some changes to fit into your gradle version.
For me I only have to change the minSdkVersion in build.gradle to 19.
do not forget to set
APP_PLATFORM := android-23 (or other depending on uelordi answer)
to application.mk

Does proguard support GCM?

I receive this error when I try to rebuild app with proguard: (I tried all the solutions suggested for the error MSB6006: "java.exe" exited with code 1, but in my case, it seems have some conflicts with GCM )
19>PROGUARD : warning :
com.google.android.gms.common.GooglePlayServicesUtil: can't find
referenced method 'void
setLatestEventInfo(android.content.Context,java.lang.CharSequence,java.lang.CharSequence,android.app.PendingIntent)'
in class android.app.Notification 19>PROGUARD : warning :
com.google.android.gms.gcm.zza: can't find referenced method 'void
setLatestEventInfo(android.content.Context,java.lang.CharSequence,java.lang.CharSequence,android.app.PendingIntent)'
in class android.app.Notification 19> You should check if you
need to specify additional program jars. 19>PROGUARD : warning : there
were 2 unresolved references to program class members. 19>
Your input classes appear to be inconsistent. 19> You may
need to recompile them and try again. 19> Alternatively, you
may have to specify the option 19>
'-dontskipnonpubliclibraryclassmembers'. 19> java.io.IOException:
Please correct the above warnings first. 19> at
proguard.Initializer.execute(Initializer.java:321) 19> at
proguard.ProGuard.initialize(ProGuard.java:211) 19> at
proguard.ProGuard.execute(ProGuard.java:86) 19> at
proguard.ProGuard.main(ProGuard.java:492) 19> Picked up
JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 19>C:\Program Files
(x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(2118,3):
error MSB6006: "java.exe" exited with code 1.
The Google GMS libraries sometimes try to access library methods that are not available for a given target SDK version and gracefully handle errors at runtime. So it is usually required and safe to add something like this to ignore such warnings:
-dontwarn com.google.android.gms.**
-dontnote com.google.android.gms.**
These rules will ignore all warnings and notes from the gms libraries.
I solved it with this solution from Xamarin forum:
Create file named proguard.cfg inside Android project in the solution. Right click and set Build Action to ProguardConfig.
Add the following lines:
-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**
Amend the above according to type of errors you're getting
Make sure you save file as UTF-8 and NOT UTF-8 BOM
Compile version: 6.0
Min target: 5.1
Target version: 6.0

Resources