使用Proguard在使用Jackson库进行混淆后使用时出错

时间:2011-12-06 18:54:55

标签: android obfuscation jackson proguard

在仔细研究了与使用Proguard进行混淆的问题相关的各种查询之后,我已经到了我觉得自己可能只是只有这个问题的问题。因此,帖子。

我有一个相当标准的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

其中,我切换了dontoptimizedontshrink标志。但是,结果总是一样的。

在我试图解决这个问题的所有时间里,我对Proguard图书馆的努力感到惊讶和敬畏。只是当事情不起作用时,他们会有点混淆

Proguard版本 - 4.6

1 个答案:

答案 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*();
}