2011-12-06 120 views
19

在使用Proguard浏览各种有关问题和混淆的查询后使用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

回答

38

这不是从堆栈跟踪显而易见的,但杰克逊需要一些注释,其中的ProGuard删除默认。 (CFR)。 ProGuard的手册>实施例>Processing annotations

-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

随着杰克逊2.1.4我需要这些除了上述属性:'-keepattributes Signature','-keepnames class com.fasterxml.jackson。** {*; }','-dontwarn com.fasterxml.jackson.databind。**' – ashughes

+0

好评。我也需要这个: -keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect $ Visibility { public static final org.codehaus.jackson.annotate.JsonAutoDetect $ Visibility *; } – Sean