我需要在proguard.cfg中添加什么来实现混淆?

时间:2011-08-10 01:45:18

标签: android google-play proguard

我的应用程序proguard.cfg中有以下代码(是的,我在proguard.config=proguard.cfg中也有build.properties):

-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>;
}

-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 *;
}

然而,我很惊讶地看到来自Android电子市场的错误报告在堆栈跟踪中包含未经模糊处理的符号。

我知道我上传了一个ProGuard导出版本,所以我错过了什么?

1 个答案:

答案 0 :(得分:2)

如果您的堆栈跟踪包含proguard.cfgproguard/mapping.txt语句中指定的未经模糊处理的类名称和方法,那么答案就在您的问题正文中......

另请注意,由于--keep带来的挑战,ProGuard会自动保留以下内容:

  • 的Class.forName( “SomeClass的”)
  • SomeClass.class
  • SomeClass.class.getField( “someField”)
  • SomeClass.class.getDeclaredField( “someField”)
  • SomeClass.class.getMethod(“someMethod”,new Class [] {})
  • SomeClass.class.getMethod(“someMethod”,new Class [] {A.class})
  • SomeClass.class.getMethod(“someMethod”,new Class [] {A.class,B.class})
  • SomeClass.class.getDeclaredMethod(“someMethod”,new Class [] {})
  • SomeClass.class.getDeclaredMethod(“someMethod”,new Class [] {A.class})
  • SomeClass.class.getDeclaredMethod(“someMethod”,new Class [] {A.class,B.class})
  • AtomicIntegerFieldUpdater.newUpdater(SomeClass.class,“someField”)
  • AtomicLongFieldUpdater.newUpdater(SomeClass.class,“someField”)
  • AtomicReferenceFieldUpdater.newUpdater(SomeClass.class,SomeType.class,“someField”)

另外reflection如果您以某种方式提供ProGuard生成的文件{{1}},则工具note可以取消对所有内容的混淆。

简而言之,您不需要在proguard.cfg中添加任何内容来启用模糊处理。默认选项就足够了。从理论上讲,您可能希望删除一些默认的--keep选项,但ProGuard的文档明确指出:

  

为了获得正确的结果,你至少应该对此有所了解   您正在处理的代码。混淆执行大量代码的代码   反射可能需要反复试验,尤其是没有   关于代码内部的必要信息。