Android上的Proguard坏了吗?

Android上的Proguard坏了吗?,android,ant,obfuscation,proguard,Android,Ant,Obfuscation,Proguard,我曾经能够按照指南作为构建的一部分来设置和运行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.proper

我曾经能够按照指南作为构建的一部分来设置和运行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中有一个小类。当应用程序在设备上启动时,应用程序崩溃:

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])
不过,这只是一个警告——我不认为会发生撞车

感谢您的帮助


Barry

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

在您的情况下,我将从添加配置行开始

-keep class com.mysoftware.informaltimeprovider.InformalTimeProvider
这明确地告诉proguard这个类是必需的,不能删除。如果之后你的应用程序错过了另一个类,告诉proguard也保留它


一步一步地,你将更接近一个完全工作的应用程序。我知道这种尝试和错误的方法并不好,但优化Java应用程序并不是那么简单,它可以完全自动化。尤其是通过字符串加载类和其他与运行时相关的技巧会与proguard发生冲突。

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

在您的情况下,我将从添加配置行开始

-keep class com.mysoftware.informaltimeprovider.InformalTimeProvider
这明确地告诉proguard这个类是必需的,不能删除。如果之后你的应用程序错过了另一个类,告诉proguard也保留它


一步一步地,你将更接近一个完全工作的应用程序。我知道这种尝试和错误的方法并不好,但优化Java应用程序并不是那么简单,它可以完全自动化。尤其是通过字符串加载类和其他与运行时相关的技巧会与proguard发生冲突。

谢谢Robert,我将玩一下这个。知道清单警告是否值得担心吗?发生这种情况是因为每个库都有自己的清单,如果您将所有库合并到一个proguard中,proguard不知道该做什么。Proguard保留它遇到的第一个清单。因此,请确保您自己的JAR文件包含您想要保留的清单,它是输入JAR列表中的第一个。谢谢。两个问题,一个人如何决定他们想要保留哪一份清单?另外,输入jar列表在哪里?谢谢你的帮助。我也对这个警告感兴趣。对于您的问题:AFAIK外部jar是从
libs\
目录中列出的,没有受控顺序(在C:\Android\tools\ant\build.xml中搜索
id=“jar.libs.ref”
)。Android库项目来自同一个定义。谢谢Robert,我将玩一下这个。知道清单警告是否值得担心吗?发生这种情况是因为每个库都有自己的清单,如果您将所有库合并到一个proguard中,proguard不知道该做什么。Proguard保留它遇到的第一个清单。因此,请确保您自己的JAR文件包含您想要保留的清单,它是输入JAR列表中的第一个。谢谢。两个问题,一个人如何决定他们想要保留哪一份清单?另外,输入jar列表在哪里?谢谢你的帮助。我也对这个警告感兴趣。对于您的问题:AFAIK外部jar是从
libs\
目录中列出的,没有受控顺序(在C:\Android\tools\ant\build.xml中搜索
id=“jar.libs.ref”
)。Android库项目来自同一个定义。你能告诉我你是如何手动响应的吗/home/myhome/projects/myapp/${out.classes.dir}不存在。我现在无法检查,但我有一种放弃proguard的感觉,因为那个特定的项目:-(你能告诉我你是如何手动响应的吗?/home/myhome/projects/myapp/${out.classes.dir}不存在。我现在无法检查,但我感觉放弃了proguard的特定项目:-(