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

ggu*_*rov 49 android proguard

我的应用程序有很多活动,也使用本机库.使用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)

  • 我遇到了类似的问题,其中保留了课程,但没有内容.添加{*; },而不仅仅是{*}为我解决了它.谢谢! (4认同)

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)

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

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