我曾经能够按照指南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}。不是世界末日,只是有点痛。
第二个更严重的问题与外部 jar 有关。我在一个外部 jar 里有一堂小课。当应用程序在设备上启动时,应用程序崩溃:
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])
虽然这只是一个警告 - 我不希望发生崩溃。
感谢收到的任何帮助。
巴里
最佳答案
Proguard 最小化应用程序大多无法开箱即用。在大多数情况下,您必须手动指定需要保留的其他类。
在你的情况下,我将从添加配置行开始
-keep class com.mysoftware.informaltimeprovider.InformalTimeProvider
这明确地告诉混淆器这个类是必需的,不能被删除。如果之后您的应用程序错过了另一个类,请告诉混淆器也保留它。
您将逐步接近一个功能完备的应用程序。我知道这种尝试错误的方法并不好,但优化 Java 应用程序并不是那么简单,可以完全自动化。尤其是通过字符串加载类和其他与运行时相关的技巧会与混淆器发生冲突。
关于android - Android 上的 Proguard 坏了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8141473/