13

当我尝试使用 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 等。

  1. 我如何确定哪些 jar 包含这些包?例如,javax.ws.rs.ext.** 类需要什么 jar?
  2. 我如何确定这些罐子在哪里以及 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.

所以现在我只需要一种方法来弄清楚:

  1. 什么罐子有这些类
  2. 这些罐子在哪里,所以我可以将它们包含在 proguard 配置文件中
4

3 回答 3

5

我在使用 Proguard 时遇到过类似的问题以及类似的错误,我使用的是 osmdroid.jar,它构建了 OK 未混淆。这个 jar 必须具有我的应用程序不需要的外部依赖项。幸运的是,作者列出了所需的 jar,一旦我下载了它们并通过 -libraryjars 选项告诉 Proguard,Proguard 构建就可以了。

重新找到您丢失的罐子(您可能并不真正需要,但 Proguard 认为您可能需要!),您应该在以下位置找到它们:

org.joda.time (罐子在 zip 里面)

org.codehaus.stax2.

javax.ws.rs。

于 2011-02-09T23:07:39.587 回答
3

我只能为第一部分提供答案:给

http://www.findjar.com

试一试,在那里你可能会找到所需的 jar 文件的名称, 如下所示

于 2011-02-09T20:07:58.657 回答
0

你不需要包含 Proguard 的库;您需要指示 Proguard 保留类名和其他一些内容。我自己玩弄了一点,最终得到了类似于此讨论的内容:

-keepnames class org.codehaus.** { *; }
-keepattributes *Annotation*,EnclosingMethod
-dontwarn org.codehaus.jackson.**

如果您仍然遇到崩溃——我建议您积极测试!——您可能希望通过以下方式保持杰克逊完好无损:

-keep class org.codehaus.** { *; }
-keepattributes *Annotation*,EnclosingMethod
-dontwarn org.codehaus.jackson.**

(请注意,后者会生成更大的文件。)

于 2012-11-08T15:34:53.690 回答