如何判断Proguard是否已经完成了它的工作

24

我下载了一个压缩在zip文件中的ProGuard,并将其解压到了硬盘上。我没有以任何方式进行安装(因为我不知道该如何安装)。然后我在项目属性文件中添加了proguard.config=proguard.cfg。接着我执行了“导出 Android 应用程序”,完全期望Eclipse会抱怨它不知道我的ProGuard安装在哪里,但是并没有抱怨。实际上,在我的密钥库中出现了一个新的apk文件,而在我的应用程序的ProGuard子目录中出现了一组文件(dump.txt等)。mapping.txt看起来像是从我的长变量名到一个或两个字母变量的映射的好列表。这应该是ProGuard已经生效的强有力证据--我唯一的担心是apk比以前几乎没有缩小。有没有办法检查apk是否包含ProGuard的混淆?

2个回答

45

通常大小会显示ProGuard是否起作用,但您可以:

  1. 使用Dex2Jar将apk转换为jar文件
  2. 使用Jd-Gui打开生成的Jar文件以查看其中包含的代码

1
对于Mac OSX系统,可以通过brew install dex2jar命令安装dex2jar,然后使用/usr/local/Cellar/dex2jar/2.0/bin/d2j-dex2jar命令来运行classes.dex文件。将apk文件重命名为.zip扩展名,然后解压缩并进入文件夹,应该会有一个classes.dex文件,可以在其上运行dex2jar。 - Doug Voss

1

除了@Kuffs的方法,您还可以将新APK与旧APK进行比较。使用7zip或您喜欢的工具打开它们并比较每个文件中classes.dex文件的大小。

以下是您可能没有看到太多节省空间的几个简单原因:

  • 未混淆的classes.dex文件可以被压缩得比混淆后的文件更多。这在某种程度上总是正确的。
  • 您没有进行发布构建。Proguard仅在发布构建上运行,因为调试混淆代码是一场噩梦。
  • 您正在使用的Proguard设置对于您的项目来说(至少在代码大小方面)没有太大好处。我实际上曾经看到过Proguard的代码内联设置增加了jar文件的大小!

未经混淆的 classes.dex 文件能够被压缩比经过混淆处理的文件更多,这是否意味着未经混淆的 classes.dex 文件比经过混淆处理的文件更小? - Rendy
2
@Rendy 我总是期望混淆后的.dex文件大小比未混淆的小。但是,我也希望在压缩之后的大小差异要比压缩之前的小得多。这是因为混淆和压缩有一些相同的工作——即用更短的字符串(类/方法/字段名称)替换长字符串。 - vaughandroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接