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?的主要内容,如果未能解决你的问题,请参考以下文章
如何告诉 sbt-proguard 包含 java *.jars?