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导致杰克逊错误的主要内容,如果未能解决你的问题,请参考以下文章

gson 和 jackson 的 Proguard 问题

Proguard 在构建发布 apk 时导致错误

Android studio - Proguard 似乎忽略了规则,导致构建错误

proguard.ParseException:proguard.cfg 中的未知选项“-encryptstrings”

启用 ProGuard 会导致签名 APK 生成失败?

Proguard 回溯工具的输出