启用 proguard 时出现杰克逊错误(缩小)

Posted

技术标签:

【中文标题】启用 proguard 时出现杰克逊错误(缩小)【英文标题】:Jackson error when enable proguard (minify) 【发布时间】:2019-11-09 18:37:51 【问题描述】:

我使用实现 'com.fasterxml.jackson.core:jackson-databind:2.9.8',当我启用 minify 时出现此错误

2019-06-27 20:23:11.172 28675-29539/? W/System.err: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.example.tst.a.b.b and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
2019-06-27 20:23:11.172 28675-29539/? W/System.err:     at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1191)
2019-06-27 20:23:11.173 28675-29539/? W/System.err:     at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:313)
2019-06-27 20:23:11.173 28675-29539/? W/System.err:     at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71)
2019-06-27 20:23:11.173 28675-29539/? W/System.err:     at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33)
2019-06-27 20:23:11.173 28675-29539/? W/System.err:     at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
2019-06-27 20:23:11.173 28675-29539/? W/System.err:     at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
2019-06-27 20:23:11.173 28675-29539/? W/System.err:     at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3905)
2019-06-27 20:23:11.173 28675-29539/? W/System.err:     at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3219)

这是我添加的 ProGuard 规则,但它不能解决我的问题

-keepattributes *Annotation*,EnclosingMethod,Signature
-keep class com.fasterxml.**  *; 
-keepclassmembers class ** extends com.fasterxml.jackson.databind.ser.std.** 
   public <init>(...);


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

-keepattributes *Annotation*,EnclosingMethod,Signature
 -keepnames class com.fasterxml.jackson.**  *; 
 -dontwarn com.fasterxml.jackson.databind.**
 -keep class org.codehaus.**  *; 
 -keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility 
     public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; 
-keep public class your.class.** 
    *;

-dontwarn com.fasterxml.jackson.databind.

【问题讨论】:

【参考方案1】:

您必须为模型的 prooguard 添加排除规则,或者您需要将此注释添加到模型的每个属性:

@JsonProperty

例如

@JsonProperty("propertyName")
val propertyName: String

基本上,您必须防止 proguard 破坏您的属性名称(带有排除项),或者添加注释以使破坏无关紧要。

【讨论】:

以上是关于启用 proguard 时出现杰克逊错误(缩小)的主要内容,如果未能解决你的问题,请参考以下文章

Proguard导致杰克逊错误

评估指令时出现 Proguard 错误

使用 Android Studio 签署 APK 时出现 Proguard 错误

签署 Android 应用程序时出现错误 Proguard

为 OnClickListener 使用 Proguard 时出现 NoSuchMethodError 错误

在 Gradle Proguard 优化时出现大量内存错误