如何告诉ProGuard将所有内容保存在特定包中?

时间:2011-09-18 19:52:58

标签: android proguard

我的应用程序有很多活动,也使用本机库。使用Eclipse生成的默认ProGuard配置ProGuard删除了很多东西--OnClick方法,静态成员,我的本机库使用的回调方法......是否有一种简单的方法来指示ProGuard不从我的包中删除任何东西?删除东西只能节省大约2.5%的应用程序大小,但会完全破坏我的应用程序。在ProGuard配置中逐类配置,测试和维护它将是一件痛苦的事。

3 个答案:

答案 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.** { *; }

使用修饰符 allowoptimizationallowobfuscation 将确保 ProGuard 仍然混淆和优化代码。收缩当然会按预期禁用。

您可以轻松验证这些 -keep 规则如何影响代码,而无需使用 ProGuard Playground 进行(重新)构建。