jar 文件的 Proguard 问题,如何找到丢失的 jar?

Posted

技术标签:

【中文标题】jar 文件的 Proguard 问题,如何找到丢失的 jar?【英文标题】:Proguard issues with jar files, how to find the missing jar? 【发布时间】: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 没有其他库我正在使用给出警告。不过,在回答您的问题时,不,我不确定问题出在杰克逊身上。目前我没有其他线索。 【参考方案1】:

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

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

org.joda.time (罐子在拉链里面)

org.codehaus.stax2.

javax.ws.rs.

【讨论】:

成功了,谢谢!我将它们下载到我项目之外的目录中,并在 proguard.cfg 文件中添加了它们的完整路径,例如 -libraryjars C:/FullPathTo/JarLocations/jar.jar ,它终于能够完全的。我将在剩下的时间里不回答这个问题,以防其他人对此问题有更多补充。再次感谢。【参考方案2】:

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

http://www.findjar.com

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

【讨论】:

没问题!它是清理短链接的bigger project 的一部分。我很高兴有人终于承认了我的一位 cmets。【参考方案3】:

您不需要包含 Proguard 的库;您需要指示 Proguard 保留类名和其他一些内容。我自己玩弄了一下,最终得到了类似于this discussion的东西:

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

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

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

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

【讨论】:

以上是关于jar 文件的 Proguard 问题,如何找到丢失的 jar?的主要内容,如果未能解决你的问题,请参考以下文章

带有外部 jar 的 Android Proguard

在proguard Android中保留资产文件夹

如何防止 ProGuard 在输出 jar 中包含引用的库

如何告诉 sbt-proguard 包含 java *.jars?

Java:如何使用自定义 Ant build.xml 将 ProGuard 集成到 Jar 项目中

如何让 Proguard 用优化的 jar 覆盖原始 jar?