如何为 Jackson JSON 处理器设置 PROGUARD?

Posted

技术标签:

【中文标题】如何为 Jackson JSON 处理器设置 PROGUARD?【英文标题】:How to setup PROGUARD for Jackson JSON Processor? 【发布时间】:2015-02-25 12:52:41 【问题描述】:

我正在为我的应用程序使用 Jackson JSON 处理器。包括这个使用

compile 'com.fasterxml.jackson.core:jackson-databind:2.4.2'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.2'.

而我的 proguard 配置是。

## BEGIN -- Google Play Services proguard.txt
-keep class * extends java.util.ListResourceBundle 
    protected java.lang.Object[][] getContents();

# Keep SafeParcelable value, needed for reflection. This is required to support backwards
# compatibility of some classes.
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable 
    public static final *** NULL;

# Keep the names of classes/members we need for client functionality.
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * 
    @com.google.android.gms.common.annotation.KeepName *;

# Needed for Parcelable/SafeParcelable Creators to not get stripped
-keepnames class * implements android.os.Parcelable 
    public static final ** CREATOR;

## END -- Google Play Services proguard.txt

-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault

-dontskipnonpubliclibraryclassmembers
-dontskipnonpubliclibraryclasses
-keepattributes *Annotation*.
-keep class org.codehaus.jackson.**




-dontwarn twitter4j.**
-dontwarn com.facebook.android.BuildConfig
-dontwarn org.apache.commons.**
-keep class org.apache.http.**  *; 
-dontwarn org.apache.http.**
-dontwarn com.nhaarman.listviewanimations.**

但是,当我尝试在调试模式下编译时,出现以下错误。

26207-26207/com.blah E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.blah, PID: 26207
    java.lang.NoSuchFieldError: PUBLIC_ONLY
            at java.lang.Class.getDeclaredAnnotation(Native Method)
            at java.lang.Class.getAnnotation(Class.java:290)
            at com.b.a.c.f.ah.<clinit>(Unknown Source)
            at com.b.a.c.z.<clinit>(Unknown Source)
            at com.blah.utils.c.<init>(Unknown Source)
            at com.blah.main.a.a(Unknown Source)
            at com.blah.main.b.a.a(Unknown Source)
            at com.blah.main.b.a.onCreateView(Unknown Source)

工作了很长时间!非常感谢您的帮助!谢谢!

【问题讨论】:

【参考方案1】:

经过多次调试终于找到了我的Proguard配置的答案

-keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.**  *; 
-dontwarn com.fasterxml.jackson.databind.**
-keep class org.codehaus.**  *; 
-keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility 
    public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; 
-keep public class your.class.** 
    public void set*(***);
    public *** get*();

您的类描述了您用于解析响应的 getter setter 类/类。

我还添加了compile 'com.fasterxml.jackson.core:jackson-core:2.4.2' 到我以前丢失的 Gradle 文件。现在我的 Proguard 像野兽一样工作..;-)

【讨论】:

感谢您提到 -keepattributes 中的 Signature 标志,它最终使我的 ProGuard 设置正常工作。【参考方案2】:

修改了@goonerDroid 为我工作的一点点

-keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.**  *; 
-dontwarn com.fasterxml.jackson.databind.**
-keep class org.codehaus.**  *; 
-keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility 
    public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; 
-keep public class your.class.** 
    *;

【讨论】:

【参考方案3】:

keep enum ** *; 对我来说已经足够了。但是我不知道为什么。

【讨论】:

以上是关于如何为 Jackson JSON 处理器设置 PROGUARD?的主要内容,如果未能解决你的问题,请参考以下文章

Jackson JSON 处理器:SerializationConfig.Feature.USE_ANNOTATIONS 设置为 false

返回JSON到前台的对象属性设置

如何使用 Jackson JSON 处理器序列化 Joda DateTime?

如何为 System.Text.Json.JsonSerializer 全局设置默认选项?

如何为 Rest Controller 编写 JUnit

如何为JSON创建错误处理函数[重复]