android - 在 android 库项目中停止混淆破坏注释

标签 android annotations proguard

我在我的游戏中使用 GREE sdk 进行社交 Activity 。在导出已签名的 apk 时,proguard 弄乱了 GREE sdk 中的一些自定义注释。 (我在我的游戏中使用 GREE sdk 作为库项目)

如果我不向 proguard 配置添加任何内容。它也混淆了 GREE SDK,当我尝试安装和运行游戏时,它抛出“注入(inject)(gree sdk 中的自定义注释)”缺少注释异常。

首先我添加了这个 keep 语句来跳过整个 GREE SDK 的混淆。

-keep class net.gree.** {
  public protected private *;
}

这帮助我避免了 sdk 代码被混淆,但“注释”仍然被删除,我仍然收到同样的异常。

然后我尝试一个一个地添加这个 -keepattributes 语句,但没有一个对我有帮助。

a) -keepattributes *Annotation*
b) -keepattributes Inject
c) -keepattributes net.gree.asdk.core.inject.Inject
d) -keepattributes @net.gree.asdk.core.inject.Inject

(d) 选项抛出找不到文件/CLASSPATH OF PRJECT/net.gree.asdk.core.inject.Inject

这是我的 proguard 配置文件:

-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 *;
}

我试图摆脱的异常:

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)

最佳答案

您应该在混淆器文件中添加一些配置,以使用 Inject 注释保留带注释的类(构造函数和字段):

 # keeps all fields and Constructors with @Inject
 -keepclassmembers,allowobfuscation class * {
    @com.google.inject.Inject <fields>;
    @com.google.inject.Inject <init>(...);
 }

关于android - 在 android 库项目中停止混淆破坏注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13216882/

相关文章:

Android 自定义对话框不会填充大型设备中的父级

android - 无法访问 com.google.android.gms.internal.zzbfm 的 zzbfm 类文件未找到

java - 运行程序时如何重置 TestNG 中测试方法组的值

android - 如何避免 APK 文件的逆向工程

android - 使用 EncryptedSharedPreferences 时是否应使用任何 proguard 规则?

android - Picasso Android 不加载类型 "content://"的 Uri

android - 当设备进入休眠状态时服务会发生什么

java - 调用带注释的方法时运行另一个函数

java - 奇怪的注释错误

java - 使用 [java/lang/String] 进行混淆警告