混淆问题:如何找到缺失的jar文件?

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的配置文件中。

但是,我无法确定需要哪些JAR文件以及它们在哪里。警告提到了许多不同的包,例如javax.ws.rs.ext、org.joda.time、org.codehaus.stax2、javax.xml.stream等。

  1. 如何确定包含这些包的JAR文件?例如,javax.ws.rs.ext.**类需要哪个JAR文件?
  2. 如何找出那些JAR文件在哪里以及在Proguard中使用什么路径?

非常感谢


编辑:我还应该提到我正在使用Android库项目设置。 Jars在主要的库项目中,实际工作项目的构建路径包括库项目中的Jars。不知道这是否有所不同,但我想我应该提一下。


更新 仅为测试,我完全从构建路径和代码中移除了jackson,现在Proguard成功完成。问题仍然存在... 处理这些错误的正确方法是什么?

Android导出向导在Eclipse中是否自动将/lib/ jars添加到proguard中,还是所有jar都必须像这样在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. 哪些JAR文件包含这些类
  2. 这些JAR文件在哪里,以便我可以将它们包含在proguard配置文件中

Jackson的第一页明确指出,Jackson没有任何外部依赖。你确定问题是与Jackson JSON有关吗? - SyntaxT3rr0r
@Syntax,这正是我所想的,但所有的485个警告都是关于org.codehaus.jackson.something: can't find referenced class something.else。我使用的其他库没有任何警告。不过,回答你的问题,我不能确定问题是否出在Jackson上。目前我没有其他线索。 - cottonBallPaws
3个回答

5

我曾遇到过类似的问题,使用Proguard时出现了类似的错误。我使用了一个osmdroid.jar文件,它没有混淆也可以正常构建。但是这个jar文件可能有一些外部依赖项,而我的应用程序并不需要。幸运的是,作者列出了所需的jar文件,一旦我下载了它们并通过-libraryjars选项告诉了Proguard,Proguard的构建就没问题了。

关于您缺少的jar文件(您可能并不需要,但Proguard认为您需要!),您可以在以下链接找到它们:

org.joda.time (jar文件在zip包中)

org.codehaus.stax2.

javax.ws.rs.


这个方法有效,谢谢!我将它们下载到项目外的一个目录中,并在proguard.cfg文件中添加了它们的完整路径,如 -libraryjars C:/FullPathTo/JarLocations/jar.jar,最终成功完成。我会把这个问题留给今天剩下的时间,以防其他人有更多的补充意见。再次感谢。 - cottonBallPaws

3

没问题!这是一个更大的项目的一部分,旨在清理短链接。我很高兴有人终于注意到了我的评论。 - Laurel

0

您不需要包含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.**

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接