使用 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
其中,我切换了dontoptimize
和dontshrink
标志。但是,结果总是一样的。
在我试图解决这个问题的所有时间里,我对 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 库的问题
Proguard 导致 100 个“找不到引用的类”警告,忽略 springframework 和 jackson 的保留规则