2013-12-08 27 views
1

我有一个关于JsonAnySetter的问题。如主题中所述,当打开proguard时,我的JsonAnySetter处理程序不会被调用。 如果我关闭了proguard就行了。 以下是我的测试代码和proguard设置。 当然JsonProperty注释运行良好。它不会被我的proguard配置删除。JsonAnySetter不打电话,如果我打开proguard

public class TestJson 
{ 
    public static class Item1 
    { 
    @JsonAnySetter 
    public void handleUnknown(String key, Object val) 
    { 
    System.out.println(String.format("unknown : %s - %s", key, val.toString())); 
    } 
    @JsonProperty("uid") 
    public long uid_ = 0; 
    public static void test() 
    { 
    ObjectManager m = new ObjectMapper(); 
    m.setVisibilityChecker(....None...) 

    String j1 = "{\"uid\":5, \"pos\":5, \"kk\":888, \"attr\":5}"; 
    Item1 item = (Item1) m.readValue(j1, Item1.class); 
    } 
} 

下面的几行是我使用的proguard配置。

-dontobfuscate 
-dontoptimize 
-printusage 
-dontwarn 
-keepattributes *Annotation*,EnclosingMethod,Signature 
-keepnames class com.fasterxml.jackson.** { *; } 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class com.android.vending.licensing.ILicensingService 
-keepclasseswithmembernames class * { 
    native <methods>; 
} 
-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 
-keepclasseswithmember class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 
-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 
-keepclassmembers class * { 
    @fully.qualified.package.AnnotationType *; 
} 
-keep public class cca.news.TestJson.** { *; } 

有没有人可以解决我的这个问题? 我需要proguard和Jackson的JsonAnySetter处理函数。

回答

2

Jackson通过反射访问字段uid和方法handleUnknown。 ProGuard的无法通过分析代码知道这一点,所以你需要保留它们:

-keepclassmembers class cca.news.TestJson$Test { 
    public void handleUnknown(java.lang.String, java.lang.Object); 
    public long uid_; 
} 

注意$的内部类 - 与你的.线不匹配,虽然你的确可以用各种的通配符和模式。

您还需要保存注释:

-keep @interface com.fasterxml.jackson.** 

注意-keep选项 - 与你的-keepnames线是不够的,虽然你确实可以只保留所有类。