应用 Proguard 后,Jackson 跳过解析 json 响应与 root

After applying Proguard, Jackson skipping to parse json response with root

我启用了混淆器并为我正在使用的所有库添加了适当的混淆器规则。

我使用 Retrofit 进行网络调用,使用 Jackson 转换器来解析响应。

我的 Json 响应有根值,为了使用 Jackson 解析它,我使用设置 SerializationFeature.WRAP_ROOT_VALUEDeserializationFeature.UNWRAP_ROOT_VALUE。在我应用混淆器之前一切正常。

在不给出任何解析异常的情况下,字段被解析为空值。

我为 Jackson 使用的 Proguard 规则是

-keepnames class com.fasterxml.jackson.** { *; }

-dontwarn com.fasterxml.jackson.databind.*

-keepattributes *Annotation*,EnclosingMethod,Signature

-keep class org.codehaus.** { *; }

-keepclassmembers public final enum 
 org.codehaus.jackson.annotate.JsonAutoDetect$Visibility {
  public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *;
}

-keepclasseswithmembers class com.jombay.vger.rx.resources.** {
  public protected private <init>(...);
  public void set(*);
  public ** get*();
}

-keepclasseswithmembers public class  com.jombay.vger.retrofit.resources.** {
  public protected private <init>(...);
  public void set(*);
  public ** get*();
}

-keepclasseswithmembers public class com.jombay.vger.utils.** {
  public protected private <init>(...);
}

-keepclassmembers class * {
 @org.codehaus.jackson.annotate.* *;
}

-keep class com.fasterxml.jackson.databind.ObjectMapper {*;}

-keep class com.fasterxml.jackson.databind.ObjectWriter {*;}

我在解决了很多其他问题后想出了这个配置。

无法调试和理解这里的问题。

在您保留域的配置中 类,您缺少一些通配符。而不是这个

-keepclasseswithmembers class com.jombay.vger.rx.resources.** {
  public protected private <init>(...);
  public void set(*);
  public ** get*();
}

应该是:

-keepclasseswithmembers class com.jombay.vger.rx.resources.** {
  <init>(...);
  public void set*(***);
  public *** get*();
}