Error working with Jackson library post-obfuscation using Proguard

只愿长相守 提交于 2019-12-03 04:21:02

问题


after scouring through all sorts of queries related to issues w/ obfuscation using Proguard, I've come to the point where I feel I might be the only one having this particular issue. Hence, the post.

I have a fairly standard android app which makes use of JSON-based REST calls to exchange data. I make use of the Jackson library to parse the JSON data. Everything had been working flawlessly, until we decided to incorporate obfuscation for our release builds using Proguard. After sorting out a world of callback related problems, I'm finally stuck with a problem related to the Jackson library.

basically, the line ObjectMapper om = new ObjectMapper() - just doesn't work! I keep getting the following error at that line:

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

After reading a host of other posts related to including external libraries, making proguard ignore the Jackson library classes, turning on and off optimization and shrinking flags, I'm just clueless right now.

The various things I've included in my proguard.cfg file for Jackson's sake -

-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

amongst these, I've toggled the dontoptimize and dontshrink flags. However, the result has always been the same.

In all the time I've spent in trying to solve this issue, I've come to be amazed and awed by the kind of effort gone into the Proguard library. It's just that when things don't work, they're a bit obfuscated.

Proguard version - 4.6


回答1:


It's not obvious from the stack trace, but Jackson needs some annotations, which ProGuard removes by default. Cfr. ProGuard manual > Examples > Processing annotations:

-keepattributes *Annotation*,EnclosingMethod

Furthermore, as the ominous package name 'org.codehaus.jackson.map.introspect' suggests, Jackson performs introspection on parsed classes to find getters and setters. Without knowing any better, ProGuard may be removing or renaming these, because your code might not use them explictly. You may have to keep them explicitly, e.g.:

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


来源:https://stackoverflow.com/questions/8405225/error-working-with-jackson-library-post-obfuscation-using-proguard

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!