I'm using vs 2017 and xamarin.forms.
I'm getting the error "java.exe exited with 1" in the release mode with ProGuard turned on. (in the debug & without proguard its doing fine) It's a common question, i know , but i've tried all the variants and it still doesnt work.
1.tried to update proguard to 5.3 version manualy
2.to update jdk 8, to install either x64 or x86 or both
3.to change the java memory to 1g , 4g, 500 m
4.to turn on multi-desk
to edit the proguard-android.txt by adding
-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**
(These just ignore proguard, google play doesnt accept it.)
ANY OTHER VARIANTS HERE?
com.google.android.gms.gcm.GcmNetworkManager: can't find referenced method 'java.lang.Object zzb(java.lang.Object,java.lang.Object)' in program class com.google.android.gms.common.internal.zzu
there were 3 unresolved references to program class members.
com.google.android.gms.gcm.GcmNetworkManager: can't find referenced method 'void zzb(boolean,java.lang.Object)' in program class com.google.android.gms.common.internal.zzu
there were 1 unresolved references to library class members.
com.google.android.gms.gcm.Task$Builder: can't find referenced method 'void zzb(boolean,java.lang.Object)' in program class com.google.android.gms.common.internal.zzu
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 library class android.app.Notification
Related
I have a CMake setup to link together 4 static libraries and 1 shared one into a top level shared library (Let's call it Top.dll). This will work fine except for one thing. I have a module definition file that expresses which symbols should be public. Top.dll builds and so far so good.
Now when I try to link an executable with Top.dll via CMake I get linker errors for every public symbol claiming it is defined in two places (Top.dll and the static library in which it was actually defined) even though Top.dll contains no original definitions of its own. If I remove the static library then as expected I get unresolved symbol errors. If I remove the module definition file, I get the same. It seems like it is either there zero times or twice. Is there some setting I am missing here? I don't think I'm using CMake in a non-basic way...
UPDATE An explanation via CMake
# setup the lib
add_subdirectory(vendor/A) #shared library
add_subdirectory(vendor/B) #static library
add_subdirectory(vendor/C) #static library
add_library(Top SHARED ${ALL_SRC_FILES})
target_link_libraries(Top A B C)
set_target_properties(Top PROPERTIES LINK_FLAGS
"/def:${PROJECT_SOURCE_DIR}/definitions.def") #contains symbols from B
add_subdirectory(C/Tests)
# CMakeLists.txt from C/Tests
add_executable(Tests ${SRC_FILES})
target_link_libraries(Tests Top)
The above is simplified, but I will get errors like the following at the point that the C/tests project is compiled:
B.lib(xxx.obj) : error LNK2005: _ABC already defined in Top.lib(Top.dll)
If I remove B.lib from the target_link_libraries call, then as expected I get unresolved symbols. If I remove the /def line, same result.
I've been able to get around this by setting the target_link_libraries of B and C to private. This may or may not be the correct solution and I will wait for other answers. If I don't do this it appears that the dependency is carried up to the final executable (So it links to both Top.dll and B.lib, etc).
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.** { *; }
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
I'm trying to use a Java library in my Kotlin project.
Creating variables in my project of types defined in the library works fine, e.g. val foo: Foo = fooProvider.get(), but introducing code that actually uses these types, e.g. foo.toString(), causes a compilation error:
Error:Kotlin: Supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
class com.example.Foo, unresolved supertypes: ajcMightHaveAspect
From what I have found so far my example Foo type implements ajcMightHaveAspect which is some type of AspectJ interface.
aspectjrt is on my classpath but I cannot find ajcMightHaveAspect defined anywhere.
Is this a Kotlin compiler bug? Am I doing something wrong?
Problem was fixed in AspectJ.
See https://bugs.eclipse.org/bugs/show_bug.cgi?id=493554 for more details .
Hope it will help.
I am building the analogClock (class AnalogClock : public QWidget) example application under qtbase/example/widgets, but with following undefined symbol: _ZTV11AnalogClock...
And I objdump -t analogClock.exe to try find who reference this symbol, but nothing found...
MORE INFO:
As long as the class inherit from QWidget, and construct a object, then there will be a undefined symbol _ZTVXYYY, where X is the length of the class name, YYY is the class name.
so could you someone help point out what's this _ZTVXYYY symbol ?
And how to avoid this situation ?
It's caused by the Makefile is not generated by the correct qmake tool.
Just as #thincal said, if Qt project is not properly configured, qmake will generate incorrect Makefile.
For example, if I'm writing a PLUGIN which inherits from QWidget, I have to:
Add Q_OBJECT macro in the top of class definition;
Add CONFIG += plugin in the project config file (with .pro suffix).