Android proguard - Proguard 对代码进行了混淆,但某些文件是可读格式

Posted

技术标签:

【中文标题】Android proguard - Proguard 对代码进行了混淆,但某些文件是可读格式【英文标题】:Android proguard - Proguard is obfuscated the code but some files are in readable format 【发布时间】:2013-04-12 11:31:59 【问题描述】:

我在我的应用程序中使用 Proguard,在导出构建后,我在 dex2jar 的帮助下对其执行了逆向工程,但一些 java 类名仍然是可读格式,但方法名被混淆了。 例如如果我在混淆之后的混淆之前有一个名为 TestClass.java 的类,它期望像 a.java 或 b.java ...

但它在我的项目中显示为 Activity 类的 TestClass.java。

有人知道我在哪里错了 Activity 类名称是可读格式吗?

提前致谢!

【问题讨论】:

【参考方案1】:

ProGuard 已集成到 android 构建系统中,因此您无需手动调用它。 ProGuard 仅在您以发布模式构建应用程序时运行,因此您在以调试模式构建应用程序时不必处理混淆代码。运行 ProGuard 是完全可选的,但强烈推荐。

在发布模式下构建应用程序时,通过运行 ant release 或在 Eclipse 中使用导出向导,构建系统会自动检查 proguard .config 属性已设置。如果是,ProGuard 会在将所有内容打包成 .apk 文件之前自动处理应用程序的字节码。 在调试模式下构建不会调用 ProGuard,因为它会使调试更加麻烦

http://developer.android.com/tools/help/proguard.html.

以上引用来自文档。您的应用程序是否处于发布模式?

http://developer.android.com/tools/publishing/app-signing.html#releasemode

编辑:

什么是混淆?

默认情况下,编译后的字节码仍然包含很多调试信息:源文件名、行号、字段名、方法名、参数名、变量名,等。这些信息可以直接反编译字节码并对整个程序进行逆向工程。有时,这是不可取的。诸如 ProGuard 之类的混淆器可以删除调试信息并用无意义的字符序列替换所有名称,从而使对代码进行逆向工程变得更加困难。它进一步压缩代码作为奖励。除了异常堆栈跟踪中给出的类名、方法名和行号之外,程序在功能上保持相同。

【讨论】:

感谢 Raghunandan,但我的问题是为什么我的 Activity 类的名称没有改变。 在发布模式下启用proguard并检查后,您是否解压缩了您的apk?检查.apk文件的内容,然后得出结论 是的,我使用 dex2jar 解压缩了我的 apk 并分析了它创建了许多包(如 a、b、c)的类,但创建了 my.package.name,其中仅包含 Activity 类,并且类的名称是可读的,但方法名称和逻辑被混淆了。 proguard 有什么限制不能混淆 Activity 类名吗? 你可以在这里proguard.sourceforge.net查看proguard的详细信息。检查编辑 根据这篇文章 - ***.com/questions/9614402/questions-about-proguard。然后必须完全保留活动包,因为任何活动类都不会被混淆。此外,com.mycompay.myapp 必须保留用于从 XML 引用的任何项目,以便系统可以正确找到清单中定义的条目。这是Activity名称没有改变的限制吗【参考方案2】:

因为在\sdk\tools\proguard\proguar-android 文件中,写了这样的东西 -保持公共类 * 扩展 android.app.Activity 所以这意味着当 proguard 运行时,这些类将保留它们的 CustomNames。否则程序找不到你的类

【讨论】:

以上是关于Android proguard - Proguard 对代码进行了混淆,但某些文件是可读格式的主要内容,如果未能解决你的问题,请参考以下文章

Android之代码混淆

在 proguard 之后,点击在发布 apk 中不起作用

Java 混淆 - ProGuard/yGuard/其他? [关闭]

播放 2 scala 路由控制器字节码与所有其他字节码不同

Android build.gradle 中的 proguard-android-optimize.txt 与 proguard-android.txt

Android:proguard 不会混淆源代码