【发布时间】:2011-06-24 09:42:26
【问题描述】:
当我尝试使用 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 library,错误似乎与此有关。
研究这个错误我从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?
- 如何确定这些 jar 在哪里以及 Proguard 中的 -libraryjars 将使用什么路径?
非常感谢
编辑:我还应该提到我正在使用Android Library Project 设置。 jar 位于主 Library 项目中,实际工作项目具有其构建路径,包括 Library 项目中的 jar。不知道这是否有区别,但我想我应该提一下。
更新只是为了测试,我从构建路径和我的代码中完全删除了 jackson,现在 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.
所以现在我只需要一种方法来弄清楚:
- 什么 jar 有这些类
- 这些 jar 在哪里,所以我可以将它们包含在 proguard 配置文件中
【问题讨论】:
-
您链接的杰克逊的第一页明确指出杰克逊有零外部依赖。你确定问题出在杰克逊 JSON 上吗?
-
@Syntax,这就是我的想法,但所有 485 个警告都是 org.codehaus.jackson.something: can't find referenced class something.else 没有其他库我正在使用给出警告。不过,在回答您的问题时,不,我不确定问题出在杰克逊身上。目前我没有其他线索。