使用Proguard混淆后使用Jackson库出现错误

20

在浏览了与使用Proguard进行混淆相关问题的各种查询之后,我开始感到可能只有我遇到了这个特定的问题。因此,才发表了这篇帖子。

我有一个相当标准的Android应用程序,它使用基于JSON的REST调用来交换数据。 我使用Jackson库解析JSON数据。 一切都工作得很好,直到我们决定在发布版本中使用Proguard进行混淆。 解决了许多回调相关的问题后,我现在卡在了与Jackson库相关的问题上。

基本上,这行代码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忽略Jackson库类, 开启和关闭优化和收缩标志后,我现在一无所知。

为了使用Jackson,在我的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个回答

40

从堆栈跟踪中并不明显,但是Jackson需要一些注释,而ProGuard默认会删除这些注释。参见ProGuard手册 > Examples > 处理注释:

-keepattributes *Annotation*,EnclosingMethod

此外,正如恐怖的包名称“org.codehaus.jackson.map.introspect”所示,Jackson对解析的类执行内省操作以查找getter和setter。如果没有更好的了解,ProGuard可能会删除或重命名这些内容,因为您的代码可能不会明确使用它们。您可能需要显式保留它们,例如:

-keep public class mydatapackage.** {
  public void set*(***);
  public *** get*();
} 

5
Eric LaFortune - 非常感谢! 对于其他面临类似问题的人,请在SourceForge论坛上查找整个邮件链以获取解决方案- https://sourceforge.net/projects/proguard/forums/forum/182456/topic/4867948/index/page/1 - anirvan
22
在使用Jackson 2.1.4时,除了以上属性外,我还需要添加以下这些:-keepattributes Signature-keepnames class com.fasterxml.jackson.** { *; }-dontwarn com.fasterxml.jackson.databind.** - ashughes
很好的评论。我也需要这个:-keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility { public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; } - Sean
2
以上代码将不会保留布尔值的getter方法,您需要在getter/setter配置中添加“public boolean is*();”。 - Denys Kniazhev-Support Ukraine

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