启用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.**
答案 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>(...);
}