【问题标题】:What do I need to put in proguard.cfg to enable obfuscation?我需要在 proguard.cfg 中添加什么来启用混淆?
【发布时间】:2011-08-10 01:45:18
【问题描述】:

我的应用程序的proguard.cfg 中有以下代码(是的,我在build.properties 中也有proguard.config=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>;
}

-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 Market 的错误报告在堆栈跟踪中包含 未混淆 符号。

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

【问题讨论】:

  • 您真的在使用 ProGuard 进行构建吗?拥有该文件是不够的。您应该能够在构建日志中看到 ProGuard。您应该能够查看构建的应用程序并看到它被混淆了。
  • @ThomasW 是的,我是。我的项目中有一个 proguard 文件夹,其中包含 4 个文件:dump.txtmapping.txtseeds.txtusage.txt。文件mapping.txt 显示绝大多数符号被混淆为单个字母,除了几个类,例如 Activity 类和 Preferences 类。我现在注意到proguard.cfg-keep 的声明。这可能是原因吗? +1 回复。
  • 是的,为了让您的应用程序正常工作,某些类需要保持不混淆。例如,视图类需要保持不变,以便使用 xml 文件进行布局。与需要特定类或方法名称的其他代码交互的部分代码不能被混淆。可以混淆的是您内部使用的代码。也许这就是你所看到的?

标签: android google-play proguard


【解决方案1】:

如果您的堆栈跟踪包含在您的proguard.cfg 中的--keep 语句中指定的未混淆类名和方法,那么答案就在您的问题正文中...

还要注意,由于reflection 带来的挑战,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")

另外note,如果您以某种方式提供由 ProGuard 生成的文件 proguard/mapping.txt,则工具 ReTrace 可以取消混淆所有内容。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-17
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2021-12-01
    相关资源
    最近更新 更多