使用 Proguard 处理 Jackson 库后混淆时出错

Posted

技术标签:

【中文标题】使用 Proguard 处理 Jackson 库后混淆时出错【英文标题】:Error working with Jackson library post-obfuscation using Proguard 【发布时间】:2012-01-14 08:50:55 【问题描述】:

在使用 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 忽略 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】:

从堆栈跟踪中看不出来,但是 Jackson 需要一些注释,ProGuard 默认会删除这些注释。参照。 ProGuard 手册 > 示例 > Processing annotations:

-keepattributes *Annotation*,EnclosingMethod

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

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

【讨论】:

eric lafortune - 非常感谢您非常!对于其他面临这种情况的人,请在 sourceforge 论坛上从整个邮件链中寻求解决方案 - sourceforge.net/projects/proguard/forums/forum/182456/topic/… 对于 Jackson 2.1.4,除了上述属性之外,我还需要这些:-keepattributes Signature-keepnames class com.fasterxml.jackson.** *; -dontwarn com.fasterxml.jackson.databind.** 伟大的 cmets。我还需要这个:-keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; 以上代码不会保留布尔 getter,您必须将 public boolean is*(); 添加到 getters/setters 配置中。

以上是关于使用 Proguard 处理 Jackson 库后混淆时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 Proguard 时使用 jackson-json 库的问题

gson 和 jackson 的 Proguard 问题

如何配置 ProGuard 以尊重 Jackson 模型?

Proguard 导致 100 个“找不到引用的类”警告,忽略 springframework 和 jackson 的保留规则

启用 proguard 时出现杰克逊错误(缩小)

Proguard 因 Google Play 服务库而失败