为什么proguard不知道应该自动保存哪些文件

时间:2015-07-17 22:01:48

标签: android android-studio proguard

为什么android studio不能推断我们需要哪些类,所以可以使用shrink删除其他类?

为什么我们需要手动编写应该保留哪些类?

2 个答案:

答案 0 :(得分:2)

ProGuard是一种通用的Java开发工具。它对于可能从Android清单,布局资源,菜单资源,首选项XML等引用的类一无所知。

更一般地说,ProGuard无法可靠地确定通过反射加载哪些类,这就是上述所有类的实现方式。对于这些课程,您需要教ProGuard保留它们。

答案 1 :(得分:1)

"更新项目"来自/ ANDROID_SDK / tools / android的命令将生成一个带有应该保留的公共类的proguard。

默认设置足以满足大多数应用程序的需求。 您应该在WebViews上添加用作JavaScript侦听器的Innerclasses。 你发现你需要名字(反思或其他)的案例

默认的proguard.cfg如下所示:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}