如何告诉ProGuard将所有内容保存在特定的软件包中?
我的应用程序有很多活动,也使用本地库。 使用Eclipse生成的默认ProGuardconfiguration,ProGuard删除了很多东西 – OnClick方法,静态成员,我的本机库使用的callback方法…是否有一个简单的方法来指示ProGuard不从我的包中删除任何东西? 删除东西只能节省大约2.5%的应用程序大小,但完全打破了我的应用程序。 在ProGuardconfiguration中按类进行configuration,testing和维护是一件痛苦的事情。
我认为你至less需要添加这些标志(修改你的个人软件包名称):
-keep class javax.** { *; } -keep class org.** { *; } -keep class twitter4j.** { *; }
另外,添加这些标志:
-dontshrink -dontoptimize -dontpreverify
这是我的整个configuration文件:我的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 *; }
作为最后的结果,我发现只保留所有的class级成员是不够的,我的申请正确的工作,也没有必要的。 我添加到这个设置文件:
-keepclasseswithmembers class * { void onClick*(...); } -keepclasseswithmembers class * { *** *Callback(...); }
onClick *的情况是我在android中处理的所有方法:在.xml布局文件中的onClick属性(我用'onClick'开始所有这些方法的名字)。
*callback的情况是我从我的本地代码(通过JNI)调用的所有callback方法。 我为每个这样的方法的名称后缀“callback”。
此外,我添加了一些特殊的情况下使用我从本地代码使用的variables行,如:
-keep class com.myapp.mypackage.SomeMyClass { *** position; }
(对于包名com.myapp.mypackage中的名为“SomeMyClass”的类中名称为'position'的variables)
所有这一切都是因为这些onClick,callback等不仅要在场,而且要保留原来的名字。 ProGuard的其他function可以自由优化。
本地方法的情况也很重要,但是在Eclipse文件中生成了一个声明:
-keepclasseswithmembernames class * { native <methods>; }