Proguard导致杰克逊错误
Posted
技术标签:
【中文标题】Proguard导致杰克逊错误【英文标题】:Proguard causes Jackson error 【发布时间】:2018-07-29 21:27:49 【问题描述】:启用 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
我喜欢这样改造
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.**
【问题讨论】:
看到这个***.com/a/8395924/9130109 【参考方案1】:Proguard 可能会移除自定义序列化器/反序列化器的默认构造函数。 在这种情况下,这些规则对我有帮助:
-keepclassmembers class ** extends com.fasterxml.jackson.databind.ser.std.**
public <init>(...);
-keepclassmembers class ** extends com.fasterxml.jackson.databind.deser.std.**
public <init>(...);
【讨论】:
这也是我的问题。【参考方案2】:如果没有proguard也能正常工作,你应该试试下面的pro-guard规则:
**-keepattributes** Signature,\*Annotation\*,EnclosingMethod
(Because jackson uses annotation)
**-keep** class com.fasterxml.jackson.** *; (Keep everything under the jackson package)
**-dontwarn** com.fasterxml.jackson.databind.** (Do not throw warning from here)
**-dontwarn** com.fasterxml.jackson.** (Do not throw any kind of warning from here)
**-keep** class org.json.JSONObject.** ** put(java.lang.String,java.util.Map);
如果您有自定义 Jsonserializer ,则必须保留它。
希望对你有帮助。
【讨论】:
以上是关于Proguard导致杰克逊错误的主要内容,如果未能解决你的问题,请参考以下文章
Android studio - Proguard 似乎忽略了规则,导致构建错误
proguard.ParseException:proguard.cfg 中的未知选项“-encryptstrings”