我的应用程序有许多活动,也使用本机库。在Eclipse生成的默认ProGuard配置中,ProGuard删除了很多东西——OnClick方法、静态成员、我的原生库使用的回调方法……是否有一种简单的方法来指示ProGuard不从我的包中删除任何东西?删除东西只节省了大约2.5%的应用程序大小,但完全破坏了我的应用程序。在ProGuard配置中一个类一个类地配置、测试和维护它将是一件痛苦的事情。
EDIT这个答案是10年前的了-它可能不适用于较新的proguard版本。
我认为你至少需要添加这些标志(修改你的个人包名):
-keep class javax.** { *; }
-keep class org.** { *; }
-keep class twitter4j.** { *; }
同时,添加以下标志:
-dontshrink
-dontoptimize
-dontpreverify
这是我的Proguard.cfg的整个配置文件:
-dontshrink
-dontoptimize
-dontpreverify
-verbose
-dontwarn javax.management.**
-dontwarn java.lang.management.**
-dontwarn org.apache.log4j.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.slf4j.**
-dontwarn org.json.**
-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
-keep class javax.** { *; }
-keep class org.** { *; }
-keep class twitter4j.** { *; }
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
作为最后的结果,我发现仅仅保留所有的类成员对于我的应用程序的正确工作是不够的,也不是必要的。我在设置文件中添加了如下内容:
-keepclasseswithmembers class * {
void onClick*(...);
}
-keepclasseswithmembers class * {
*** *Callback(...);
}
的情况下,onClick*是所有的方法,我地址在android:onClick属性在。xml布局文件(我开始与'onClick'所有这样的方法的名称)。
带有*Callback的情况适用于我从本机代码(通过JNI)调用的所有回调方法。我在每个这样的方法的名字后面加了一个'Callback'后缀。
我还为一些特殊情况添加了几行我从本地代码中使用的变量,如:
-keep class com.myapp.mypackage.SomeMyClass {
*** position;
}
(对于包com.myapp.mypackage中名称为'SomeMyClass'类中名称为'position'的变量)
这一切都是因为这些onClick, callback等不仅必须存在,而且要保持其原始名称。ProGuard可以自由优化的其他东西
本机方法的情况也很重要,但是在Eclipse文件中生成了一个声明:-keepclasseswithmembernames class * {
native <methods>;
}
我知道这是一个古老的问题,但我希望下面的信息可以帮助其他人。
你可以像下面这样阻止ProGuard删除某个包中的任何东西;
-keep,allowoptimization,allowobfuscation class com.example.mypackage.** { *; }
使用修饰符allowoptimization
和allowobfuscation
将确保ProGuard仍然混淆和优化代码。收缩当然会被禁用。
你可以很容易地验证这些-keep
规则如何影响代码,而不需要使用ProGuard Playground(重新)构建。