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