Reputation: 3521
I am using GREE sdk for social stuff in my game. While exporting signed apk, proguard messes up some custom annotations in GREE sdk. (I am using GREE sdk as a library project in my game)
If I add nothing to proguard config. It obfuscate GREE SDK as well and it throws me "Inject (Custom annotation in gree sdk)" missing annotation exception, when I try to install and run game.
First I added this keep statement to skip obfuscation of whole GREE SDK.
-keep class net.gree.** {
public protected private *;
}
This helped me avoiding sdk code from being obfuscate but 'Annotations' were still removed and I am still receiving same exception.
then I tried adding this -keepattributes
statements one by one but non of them helped me.
a) -keepattributes *Annotation*
b) -keepattributes Inject
c) -keepattributes net.gree.asdk.core.inject.Inject
d) -keepattributes @net.gree.asdk.core.inject.Inject
(d) option throws cannot find file /CLASSPATH OF PRJECT/net.gree.asdk.core.inject.Inject
Here is my proguard config file:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keepattributes *Annotation*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-dontwarn org.mockito.cglib.**
-dontwarn sun.reflect.**
-dontwarn android.test.**
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keep class net.gree.** {
public protected private *;
}
Exception that I am trying to get rid of:
11-06 12:25:41.718: E/AndroidRuntime(10764): java.lang.RuntimeException: Unable to create application com.mygame.Application: java.lang.RuntimeException: Could not find a suitable constructor in net.gree.asdk.core.track.TrackItemStorageImpl. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
11-06 12:25:41.718: E/AndroidRuntime(10764): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4154)
11-06 12:25:41.718: E/AndroidRuntime(10764): at android.app.ActivityThread.access$1300(ActivityThread.java:130)
11-06 12:25:41.718: E/AndroidRuntime(10764): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
11-06 12:25:41.718: E/AndroidRuntime(10764): at android.os.Handler.dispatchMessage(Handler.java:99)
11-06 12:25:41.718: E/AndroidRuntime(10764): at android.os.Looper.loop(Looper.java:137)
11-06 12:25:41.718: E/AndroidRuntime(10764): at android.app.ActivityThread.main(ActivityThread.java:4745)
11-06 12:25:41.718: E/AndroidRuntime(10764): at java.lang.reflect.Method.invokeNative(Native Method)
11-06 12:25:41.718: E/AndroidRuntime(10764): at java.lang.reflect.Method.invoke(Method.java:511)
11-06 12:25:41.718: E/AndroidRuntime(10764): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-06 12:25:41.718: E/AndroidRuntime(10764): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-06 12:25:41.718: E/AndroidRuntime(10764): at dalvik.system.NativeStart.main(Native Method)
11-06 12:25:41.718: E/AndroidRuntime(10764): Caused by: java.lang.RuntimeException: Could not find a suitable constructor in net.gree.asdk.core.track.TrackItemStorageImpl. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
11-06 12:25:41.718: E/AndroidRuntime(10764): at net.gree.asdk.core.inject.Binder.getConstructorOf(Unknown Source)
11-06 12:25:41.718: E/AndroidRuntime(10764): at net.gree.asdk.core.inject.Binder.createInstance(Unknown Source)
11-06 12:25:41.718: E/AndroidRuntime(10764): at net.gree.asdk.core.inject.Binder.getOrCreateInstance(Unknown Source)
11-06 12:25:41.718: E/AndroidRuntime(10764): at net.gree.asdk.core.inject.Binder.createInstance(Unknown Source)
11-06 12:25:41.718: E/AndroidRuntime(10764): at net.gree.asdk.core.inject.Binder.finishBinding(Unknown Source)
11-06 12:25:41.718: E/AndroidRuntime(10764): at net.gree.asdk.core.inject.InternalInjector.createInjector(Unknown Source)
11-06 12:25:41.718: E/AndroidRuntime(10764): at net.gree.asdk.core.Injector.init(Unknown Source)
11-06 12:25:41.718: E/AndroidRuntime(10764): at net.gree.asdk.core.Core.initialize(Unknown Source)
11-06 12:25:41.718: E/AndroidRuntime(10764): at net.gree.asdk.api.GreePlatform.initialize(Unknown Source)
11-06 12:25:41.718: E/AndroidRuntime(10764): at com.aqif.speedymind.application.SpeedyApplication.onCreate(Unknown Source)
11-06 12:25:41.718: E/AndroidRuntime(10764): at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999)
11-06 12:25:41.718: E/AndroidRuntime(10764): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151)
Upvotes: 3
Views: 2629
Reputation: 685
This worked for me
################### GREE SDK ##################
-keepclassmembers,allowobfuscation class * {
@net.gree.asdk.core.inject.Inject <fields>;
@net.gree.asdk.core.inject.Inject <init>(...);
}
##################### GSON #####################
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
# Model classes parsed by GSON
-keep class net.gree.asdk.** {
public protected private *;
}
It is similar to another response but using GREE specific annotation.
Upvotes: 3
Reputation: 38168
You should add some configuration in your proguard file to keep annotated classes (both constructors and fields) using the Inject annotation :
# keeps all fields and Constructors with @Inject
-keepclassmembers,allowobfuscation class * {
@com.google.inject.Inject <fields>;
@com.google.inject.Inject <init>(...);
}
Upvotes: 5
Reputation: 3521
instead of doing this -keep class net.gree.** { public protected private *; }
I had to do this
-keep class net.gree.** {
*;
}
Upvotes: 0