当我尝试使用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等。
非常感谢
修改:我还应该提一下我正在使用Android Library Project设置。这些罐子位于主库项目中,实际工作项目的构建路径包括库项目中的罐子。不知道这是否有所作为,但我想应该提一下。
更新为了测试,我完全删除了远离构建路径和我的代码的jackson,现在Proguard成功完成了。问题仍然存在......处理这些错误的正确方法是什么?
Eclipse中的Android导出向导是否会自动将/ lib / jars添加到proguard,还是必须在proguard配置文件中手动添加它们,如下所示:
-libraryjars C:/Project/lib/somjar.jar
我确实尝试过杰克逊的那个,但它没有任何区别。这是否意味着我还必须找到警告中提到的类所需的所有罐子并添加它们?他们会在sdk或java安装中吗?
很抱歉,如果这些都是愚蠢的问题,但我一直在努力解决这个问题,并且不知道该怎么做。
再次感谢
再次更新
如此多搜索,结合本杰明的建议,我发现一些缺失的类是在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.
所以现在我只需要一种方法来弄清楚:
答案 0 :(得分:5)
我和Proguard有类似的问题和我使用osmdroid.jar的类似错误,它构建了OK unobfuscated。这个jar必须具有我的应用程序不需要的外部依赖项。幸运的是,作者列出了所需的罐子,一旦我下载它们并通过-libraryjars选项告诉Proguard,Proguard构建就可以了。
你丢失的罐子(你可能不需要,但Proguard认为你可能!),你应该找到它们:
org.joda.time (罐子里面的拉链)
答案 1 :(得分:3)
答案 2 :(得分:0)
您不需要包含Proguard的库;你需要指示Proguard保留类名和其他一些东西。我自己玩弄了一下,最后得到了与this discussion类似的东西:
-keepnames class org.codehaus.** { *; }
-keepattributes *Annotation*,EnclosingMethod
-dontwarn org.codehaus.jackson.**
如果你还在经历崩溃 - 我会建议大力测试! - 你可能想让杰克逊保持完整:
-keep class org.codehaus.** { *; }
-keepattributes *Annotation*,EnclosingMethod
-dontwarn org.codehaus.jackson.**
(注意后者产生更大的文件。)