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

ani*_*van 20 obfuscation android proguard jackson

在仔细研究了与使用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
Run Code Online (Sandbox Code Playgroud)

在阅读了许多与包括外部库相关的其他帖子之后,让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
Run Code Online (Sandbox Code Playgroud)

其中,我已经切换了dontoptimizedontshrink旗帜.但是,结果总是一样的.

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

Proguard版本 - 4.6

Eri*_*une 39

从堆栈跟踪来看并不明显,但Jackson需要一些注释,默认情况下ProGuard会删除它们.(CFR).ProGuard手册>示例> 处理注释:

-keepattributes *Annotation*,EnclosingMethod
Run Code Online (Sandbox Code Playgroud)

此外,正如不祥的包名'org.codehaus.jackson.map.introspect'所暗示的那样,Jackson对已解析的类执行内省以查找getter和setter.在不知情的情况下,ProGuard可能正在删除或重命名这些,因为您的代码可能不会明确地使用它们.您可能必须明确地保留它们,例如:

-keep public class mydatapackage.** {
  public void set*(***);
  public *** get*();
} 
Run Code Online (Sandbox Code Playgroud)

  • 使用Jackson 2.1.4除了上述属性之外我还需要这些:`-keepattributes Signature`,`-keepnames class com.fasterxml.jackson.**{*; }`,`-dontwarn com.fasterxml.jackson.databind.**` (22认同)
  • 埃里克lafortune - 非常感谢****!对于任何面临这种情况的人,请在sourceforge论坛上寻求整个邮件链的解决方案 - https://sourceforge.net/projects/proguard/forums/forum/182456/topic/4867948/index/page/1 (5认同)
  • 上面的代码不会保留布尔getter,你必须将`public boolean is*();`添加到getters/setters配置中. (2认同)