我的应用程序有很多活动,也使用本机库。使用Eclipse生成的默认ProGuard配置ProGuard删除了很多东西--OnClick方法,静态成员,我的本机库使用的回调方法......是否有一种简单的方法来指示ProGuard不从我的包中删除任何东西?删除东西只能节省大约2.5%的应用程序大小,但会完全破坏我的应用程序。在ProGuard配置中逐类配置,测试和维护它将是一件痛苦的事。
答案 0 :(得分:49)
我认为您至少需要添加这些标志(修改各个包名称):
-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 *;
}
答案 1 :(得分:20)
作为最终结果,我发现只保留所有班级成员不足以完成我的申请的正确工作,也没有必要。我添加到设置文件中:
-keepclasseswithmembers class * {
void onClick*(...);
}
-keepclasseswithmembers class * {
*** *Callback(...);
}
onClick *的情况适用于我在android中的所有方法:onClick atribute in .xml布局文件(我用'onClick'开始所有这些方法的名称)。
* Callback的情况适用于我从本机代码(通过JNI)调用的所有回调方法。我将后缀'Callback'放在每个这样的方法的名称上。
此外,我为一些特殊情况添加了几行,其中包含我从本机代码中使用的变量,例如:
-keep class com.myapp.mypackage.SomeMyClass {
*** position;
}
(对于com.myapp.mypackage包中名为'SomeMyClass'的类中名称为'position'的变量)
所有这一切都是因为这些onClick,回调等不仅必须存在,还要保留其原始名称。 ProGuard可以自由优化的其他内容。
使用本机方法的情况也很重要,但是对于它来说,在Eclipse文件中生成了一个声明:
-keepclasseswithmembernames class * {
native <methods>;
}
答案 2 :(得分:0)
我知道这是一个老问题,但我希望以下信息可以帮助其他人。
您可以通过以下方式阻止 ProGuard 删除某个包中的任何内容;
-keep,allowoptimization,allowobfuscation class com.example.mypackage.** { *; }
使用修饰符 allowoptimization
和 allowobfuscation
将确保 ProGuard 仍然混淆和优化代码。收缩当然会按预期禁用。
您可以轻松验证这些 -keep
规则如何影响代码,而无需使用 ProGuard Playground 进行(重新)构建。