当我尝试使用 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 等。
- 我如何确定哪些 jar 包含这些包?例如,javax.ws.rs.ext.** 类需要什么 jar?
- 我如何确定这些罐子在哪里以及 Proguard 中的 -libraryjars 将使用什么路径?
非常感谢
编辑: 我还应该提到我正在使用Android Library Project设置。jar 位于主 Library 项目中,实际工作项目具有其构建路径,包括 Library 项目中的 jar。不知道这是否有区别,但我想我应该提一下。
更新 只是为了测试,我从构建路径和我的代码中完全删除了杰克逊,现在 Proguard 成功完成。问题仍然存在......处理这些错误的正确方法是什么?
Eclipse 中的 Android 导出向导是否会自动将 /lib/ jar 添加到 proguard 中,还是必须手动将它们添加到 proguard 配置文件中,如下所示:
-libraryjars C:/Project/lib/somjar.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.
所以现在我只需要一种方法来弄清楚:
- 什么罐子有这些类
- 这些罐子在哪里,所以我可以将它们包含在 proguard 配置文件中