Android上的Proguard破了?

时间:2011-11-15 18:48:43

标签: android ant obfuscation proguard

我曾经能够按照指南here设置和运行Proguard作为构建的一部分,没有任何问题。但是,由于更新到最新版本的ADT工具,我遇到了麻烦。我遇到的第一个问题是:

BUILD FAILED
/home/myhome/projects/myapp/add-proguard-release.xml:14:
/home/myhome/projects/myapp/${out.classes.dir} does not exist.

所以我最终必须在local.properties或project.properties中手动定义$ {out.classes.dir}。不是世界末日,而是有点痛苦。

第二个更激烈的问题与外部罐子有关。我在一个外部罐子里有一个小班。当应用程序在设备上启动时,应用程序崩溃:

11-15 18:35:30.090: E/AndroidRuntime(28258): java.lang.NoClassDefFoundError: com.mysoftware.informaltimeprovider.InformalTimeProvider
11-15 18:35:30.090: E/AndroidRuntime(28258):    at com.mysoftware.pagemonitor.PrintableTimeProvider.getInformalTime(PrintableTimeProvider.java:14)

在尝试创建InformalTimeProvider实例时崩溃,但是通过logcat输出判断,这个类没有被混淆,所以我不知道为什么会出现问题。

构建过程中出现警告:

[proguard]   Copying resources from program jar [/home/myhome/projects/pagemonitor/libs/InformalTimeProvider.jar]
[proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [InformalTimeProvider.jar:META-INF/MANIFEST.MF])

这只是一个警告 - 我不希望发生崩溃。

感激不尽的任何帮助。

百里

1 个答案:

答案 0 :(得分:1)

Proguard最小化的应用程序大多数都不是开箱即用的。在大多数情况下,您必须手动指定需要保留的其他类。

在你的情况下,我将首先添加配置行

-keep class com.mysoftware.informaltimeprovider.InformalTimeProvider

这明确告诉proguard这个类是必需的,不能删除。如果之后你的应用程序错过了另一个课程,请告诉proguard保留它。

您将逐步接近完全正常运行的应用。我知道这种尝试和错误的方法并不好,但优化Java应用程序并不是那么简单,它可以完全自动化。特别是Strings和其他与运行时相关的技巧的加载类与proguard冲突。