保护jar文件的问题,如何找到丢失的jar?
当我尝试使用Proguard导出我的apk时,我收到了很多类似于以下内容的错误(超过400个):
Warning: org.codehaus.jackson.jaxrs.JsonMappingExceptionMapper: can't find superclass or interface javax.ws.rs.ext.ExceptionMapper
和
org.codehaus.jackson.xc.DataHandlerJsonDeserializer$1: can't find superclass or interface javax.activation.DataSource
我正在使用Jackson Json库,错误似乎与此有关。
研究此错误,我从Proguards FAQ中发现了以下内容:
如果存在对类或接口的未解析引用,则很可能忘记指定基本库。为了正确处理,必须指定代码引用的所有库,包括 Java 运行时库。要指定库,请使用 -libraryjars 选项。
在SO上搜索,我发现了很多与此相关的未解答问题,但一般的感觉是,我正在使用的jar文件(在本例中为Jackon JSON)依赖于更多的库,并且需要以某种方式将它们添加到Proguard的配置文件中。
但是,我无法弄清楚如何确定需要哪些罐子以及它们在哪里。警告提到了许多不同的软件包,例如javax.ws.rs.ext,org.joda.time,org.codehaus.stax2,javax.xml.stream等。
- 如何确定哪些罐子包含这些包?例如,javax.ws.rs.ext.** 类需要什么 jar?
- 我如何弄清楚这些jar在哪里,以及Proguard中的-libraryjars将使用什么路径?
非常感谢
编辑:我还应该提到我正在使用Android库项目设置。jar 位于主库项目中,实际工作项目具有其构建路径,包括库项目中的 jar。不知道这是否有所作为,但认为我应该提到它。
更新为了进行测试,我完全删除了远离构建路径和代码的jackson,现在Proguard成功完成。问题仍然存在...处理这些错误的正确方法是什么?
Eclipse 中的 Android 导出向导是否会自动将 /lib/ jar 添加到 proguard 中,或者它们都必须手动添加到 proguard 配置文件中,如下所示:
-libraryjars C:/Project/lib/somjar.jar
我确实为杰克逊尝试了一下,但它没有任何区别。这是否意味着我还必须找到警告中提到的类所需的所有jar并添加这些jar?它们是在 sdk 中还是在 Java 安装中?
抱歉,如果这些是愚蠢的问题,但我一直在努力解决这个问题,在过去的几个小时里,我不知道该怎么办。
再次感谢
再次更新
因此,在更多的搜索中,结合Benjamin的建议,我发现一些缺失的类在rt.jar中,它位于jdk的lib文件夹中。所以我最终添加了
-libraryjars <java.home>/lib/rt.jar
对于proguard.cfg文件,并将警告从485降至204。嘿,我想那是什么东西...其余的警告描述了我根本找不到的类。该应用程序无需运行proguard即可正常工作,因此这些类必须在某个地方对吗?还是我应该使用这些警告?-dontwarn
其余类位于以下包中:
org.joda.time.
org.codehaus.stax2.
javax.ws.rs.
所以现在我只需要一种方法来弄清楚:
- 哪些罐子有这些类
- 这些jar在哪里,所以我可以将它们包含在proguard配置文件中