如何通过 Eclipse 使用 Proguard 混淆 apk?

Posted

技术标签:

【中文标题】如何通过 Eclipse 使用 Proguard 混淆 apk?【英文标题】:How to obfuscate an apk with Proguard through Eclipse? 【发布时间】:2011-06-16 10:56:00 【问题描述】:

我在我的 default.properties 文件中添加了proguard.config=proguard.cfg,并在我的项目根目录中有一个 proguard.cfg 文件。如果我现在在 Eclipse 中使用 Export as android Application,我会收到以下错误:

[2011-01-27 11:11:37 - Application] Warning: class [classes/com/package.Class.class] unexpectedly contains class [com/package.Class]
[2011-01-27 11:11:37 - Application] Warning: class [classes/com/package.Class2.class] unexpectedly contains class [com/package.Class2]
[2011-01-27 11:11:37 - Application] Note: there were 145 duplicate class definitions.
[2011-01-27 11:11:37 - Application] Warning: there were 146 classes in incorrectly named files.
[2011-01-27 11:11:37 - Application]          You should make sure all file names correspond to their class names.
[2011-01-27 11:11:37 - Application]          The directory hierarchies must correspond to the package hierarchies.
[2011-01-27 11:11:37 - Application]          If you don't mind the mentioned classes not being written out,
[2011-01-27 11:11:37 - Application]          you could try your luck using the '-ignorewarnings' option.
[2011-01-27 11:11:37 - Application] java.io.IOException: Please correct the above warnings first.
[2011-01-27 11:11:37 - Application]     at proguard.InputReader.execute(InputReader.java:133)
[2011-01-27 11:11:37 - Application]     at proguard.ProGuard.readInput(ProGuard.java:195)
[2011-01-27 11:11:37 - Application]     at proguard.ProGuard.execute(ProGuard.java:78)
[2011-01-27 11:11:37 - Application]     at proguard.ProGuard.main(ProGuard.java:499)

似乎我的类以某种方式保存在类子文件夹中,但 Proguard 将此类子文件夹用作包。因此,Proguard 无法理解类的定义。

这是我的 SDK 设置的问题吗?还是我的 Proguard 配置中有错误导致了这个问题?

【问题讨论】:

你需要发布你的 proguard.cfg 【参考方案1】:

我在去年 5 月对 proguard.cfg 进行了一些更改,现在它可以正常工作了:

来自

-injars bin

-injars bin/classes

我还必须清理一点——删除 Junit(本项目中没有使用)和兼容性库(我可能本可以忽略,但选择完全放弃)。

【讨论】:

【参考方案2】:

现在很方便,我刚刚更新到新的 ddms Eclipse 插件版本:Android DDMS 9.0.0.v201101191456-93220 并将我的 SDK 更新到包含 Honeycomb 的新版本,问题似乎消失了。

【讨论】:

现在你已经导出了它,你真的可以在模拟器以外的设备上运行 apk 吗?我正在考虑升级到 3.0,但发行说明说 apk 只能在模拟器上运行。 我不使用 sdk 编译蜂窝,因此我的应用程序肯定可以在普通设备上运行。 我只能通过命令行集成proguard和ant的使用;如果可以导出一个经过保护的 android 应用程序并跳过命令行,那么我很兴奋......【参考方案3】:

获取混淆apk的步骤:

1) 从“http://sourceforge.net/projects/proguard/files/”下载最新的proguard。当前最新版本是proguard4.7

2) 将“C:\Program Files (x86)\Android\android-sdk\tools\proguard”的“bin”和“lib”文件夹替换为最新下载的proguard文件夹。

3) 检查 Eclipse 中的 SDK 位置是否有空格,然后转到窗口 > 首选项 > Android。如果有空格,则将其替换为:

    c:\Progra~2\android\android-sdk (for windows 64-bit)
    c:\Progra~1\android\android-sdk (for windows 32-bit)

4) 检查 proguard.cfg 文件是否在您项目的根文件夹中,并在 android 项目的 project.properties 文件中添加“proguard.config=proguard.cfg”。

5) 现在导出您的项目以获取混淆 apk。

我希望它会有所帮助。

【讨论】:

在步骤 4) 检查 proguard.cfg 文件是否在项目的根文件夹中。你能解释一下,这个文件到底放在哪里?还有,如何知道项目是否被正确混淆了? 我找不到任何 proguard.cfg 并且我找到了 proguard-project.txt @Shrikant 您可以通过文件大小验证混淆的 apk,如果您在项目资源管理器的 progurad 文件夹中看到这些文件(dump.txt、mapping.txt、seeds.txt、usage.txt)意味着你可以说你的 apk 被混淆了。

以上是关于如何通过 Eclipse 使用 Proguard 混淆 apk?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Eclipse + Proguard“运行”导出的 Android 应用程序?

如何在 Eclipse 和调试模式下使用 proguard?

如何在 Eclipse 中使用 Proguard 混淆 Android 库(.jar 文件)

Android Proguard:如何在 Eclipse 中设置?

导出已签名、混淆的 Android 应用程序时,如何在 Eclipse 中设置 ProGuard?

在 Eclipse 中使用 Proguard for Android 出错