我曾经能够按照指南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])
这只是一个警告 - 我不希望发生崩溃。
感激不尽的任何帮助。
百里
答案 0 :(得分:1)
Proguard最小化的应用程序大多数都不是开箱即用的。在大多数情况下,您必须手动指定需要保留的其他类。
在你的情况下,我将首先添加配置行
-keep class com.mysoftware.informaltimeprovider.InformalTimeProvider
这明确告诉proguard这个类是必需的,不能删除。如果之后你的应用程序错过了另一个课程,请告诉proguard保留它。
您将逐步接近完全正常运行的应用。我知道这种尝试和错误的方法并不好,但优化Java应用程序并不是那么简单,它可以完全自动化。特别是Strings和其他与运行时相关的技巧的加载类与proguard冲突。