Proguard导致Jackson错误

时间:2018-02-19 15:51:25

标签: android jackson android-proguard fasterxml

启用proguard规则后,我面临以下问题 所以在向网络发送任何内容之前就会出错。

  

java.lang.RuntimeException:无法转换   FormDocTankPermission到RequestBody

引起的

  

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:没有   找到类FormDocTankPermission的序列化程序,没有属性   发现创建BeanSerializer(以避免异常,禁用   SerializationFeature.FAIL_ON_EMPTY_BEANS)

我发送给@Retrofit.Body的课程如下:

class FormDocTankPermission  (
        @get:JsonProperty("fuelCardId")
        val fuelCardId: Long,
        @get:JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
        @get:JsonProperty("validityDate")
        val validityDate: Date
)

我认为不知怎的@get:JsonProperty会导致ISSUE

我cretea像这样改造

Builder()
.[...]
.addConverterFactory(JacksonConverterFactory.create())

杰克逊的Proguard规则

# Jackson
-keep class com.fasterxml.jackson.databind.ObjectMapper {
    public <methods>;
    protected <methods>;
}
-keep class com.fasterxml.jackson.databind.ObjectWriter {
    public ** writeValueAsString(**);
}
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**

2 个答案:

答案 0 :(得分:0)

如果没有proguard正常工作,您应该尝试以下保护规则:

-keepattributes 签名,*注释*,EnclosingMethod (因为杰克逊使用注释)

-keep class com.fasterxml.jackson。** {*; (将所有内容保存在jackson包下)

-dontwarn com.fasterxml.jackson.databind。**(不要从此处抛出警告)

-dontwarn com.fasterxml.jackson。**(请勿在此处发出任何警告)

-keep class org.json.JSONObject。** {** put(java.lang.String,java.util.Map);}

如果您有自定义 Jsonserializer&lt;&gt; ,则必须保留它。

我希望,它可以帮助你。

答案 1 :(得分:0)

Proguard可能会删除自定义序列化程序/反序列化程序的默认构造函数。 在这种情况下,这些规则可以帮助我:

-keepclassmembers class ** extends com.fasterxml.jackson.databind.ser.std.** {
   public <init>(...);
}

-keepclassmembers class ** extends com.fasterxml.jackson.databind.deser.std.** {
   public <init>(...);
}