我有一个相当标准的Android应用程序,它使用基于JSON的REST调用来交换数据。我使用Jackson
库来解析JSON数据。一切都运行得很完美,直到我们决定使用Proguard为我们的发布版本加入混淆。在整理出回调相关问题的世界之后,我终于遇到了与杰克逊图书馆相关的问题。
基本上,行ObjectMapper om = new ObjectMapper()
- 只是不起作用!我一直在该行收到以下错误:
Caused by: java.lang.ExceptionInInitializerError
at org.codehaus.jackson.map.ObjectMapper.<clinit>(Unknown Source)
... 8 more
Caused by: java.lang.NullPointerException
at org.codehaus.jackson.map.introspect.VisibilityChecker$Std.<init>(Unknown Source)
at org.codehaus.jackson.map.introspect.VisibilityChecker$Std.<clinit>(Unknown Source)
... 9 more
在阅读了与包括外部图书馆相关的大量其他帖子后,让proguard忽略杰克逊图书馆课程,打开和关闭优化以及缩小旗帜,我现在只是无能为力。
我在proguard.cfg
文件中为杰克逊提供的各种内容 -
-dontskipnonpubliclibraryclassmembers
-dontoptimize
-dontshrink
-libraryjars xtraLibs/joda-time-1.6.2.jar;xtraLibs/xml-apis.jar;xtraLibs/jsr311-api-0.8.jar;xtraLibs/stax2-api-3.0.0.jar;xtraLibs/httpmime-4.0.1.jar
其中,我切换了dontoptimize
和dontshrink
标志。但是,结果总是一样的。
在我试图解决这个问题的所有时间里,我对Proguard图书馆的努力感到惊讶和敬畏。只是当事情不起作用时,他们会有点混淆。
Proguard版本 - 4.6
答案 0 :(得分:39)
从堆栈跟踪中看并不明显,但Jackson需要一些注释,ProGuard默认删除。 (CFR)。 ProGuard手册&gt;例子&gt; Processing annotations:
-keepattributes *Annotation*,EnclosingMethod
此外,正如不祥的包名'org.codehaus.jackson.map.introspect'所暗示的那样,Jackson对已解析的类执行内省以查找getter和setter。在不知情的情况下,ProGuard可能正在删除或重命名这些,因为您的代码可能不会明确地使用它们。您可能必须明确地保留它们,例如:
-keep public class mydatapackage.** {
public void set*(***);
public *** get*();
}