启用 Pro Guard Jackson 解析器后不起作用

Posted

技术标签:

【中文标题】启用 Pro Guard Jackson 解析器后不起作用【英文标题】:After enable Pro Guard Jackson parser does not work 【发布时间】:2017-09-23 16:44:08 【问题描述】:

我使用 Retrofit 2.1.0Jackson 2.8.6 解析器。 但是如果启用 Pro Guard,它就不起作用了。

日志中的异常:

   D/EXAMPLE_PROJ: Class com.example.network.d.b.a.m$a has no default (no arg) constructor 
at [Source: java.io.InputStreamReader@1c1aab47; line: 1, column: 1]

My gradle 中的版本库:

dependencies 
    def supportLibraryVersion = "25.3.1"
    def retrofitVersion = "2.1.0"
    def playService = '10.2.0'
    def jacksonVersion = "2.8.6"

我的改装和杰克逊职业守卫规则:

# Retrofit2
-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8

# Jackson
-keepnames class com.fasterxml.jackson.**  *; 
 -dontwarn com.fasterxml.jackson.databind.**
 -dontwarn org.codehaus.jackson.**
 -dontwarn javax.xml.**
-dontwarn javax.xml.stream.events.**
 -keep class org.codehaus.**  *; 
 -keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility 
 public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; 

-keepclassmembers class * 
     @com.fasterxml.jackson.annotation.JsonCreator *;
     @com.fasterxml.jackson.annotation.JsonProperty *;

-keepnames class com.fasterxml.jackson.**  *; 

我会很高兴得到任何帮助!

【问题讨论】:

【参考方案1】:

在这种情况下,解决方案非常简单。问题是 Proguard 在网络类中删除了我的空构造函数。

1) 所以,我将它添加到 proguard-rules.pro 中:

-keep public class com.example.network.**

2) 在默认的空构造函数下还添加了@Keep注解:

@Keep
public MyClass ()
//do not delete

【讨论】:

以上是关于启用 Pro Guard Jackson 解析器后不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何解决在等级失败错误中添加 pro-guard 后生成 apk 的问题?

引入 jackson-dataformat-xml 后,默认响应结果是 json 还是 xml?

引入 jackson-dataformat-xml 后,默认响应结果是 json 还是 xml?

如何在石墨烯解析器后使用中间件?

更新 gradle 包装器后无法解析类 MavenDeployment

Springmvc 中org.springframework.http.converter.json.MappingJackson2HttpMessageConverter依赖jackson包(示例代