Library Module中GSON反序列化无报错返回null,移入主应用正常如何解决
问题原因
你遇到的问题本质是Library模块的R8/混淆规则未生效,以及低版本Gson对Kotlin数据类的兼容性问题,具体原因有三个:
- 你当前写的Gson混淆规则路径不匹配:你配置的
-keep class com.mycompany.messagecenter.data.* { <fields>; }仅保护data子包下的类,但你贴出的MyMessage数据类并没有放在data子包下,R8压缩时直接擦除了该类的字段信息,Gson反射无法识别对应字段,只能赋值为null。 - Library模块未导出混淆规则:如果你没有在Library的
build.gradle中配置consumerProguardFiles,你写在Library内部的混淆规则不会被主应用打包时合并生效,等于规则完全没起作用。 - Gson 2.8.6对Kotlin数据类的兼容性缺陷:该版本Gson默认无法正确识别Kotlin data类的带参构造,需要无参构造才能正确实例化赋值。
解决步骤
- 修正混淆规则匹配路径
把你的混淆规则中序列化类的匹配路径调整到MyMessage实际所在的包,示例如下:
# 改为你MyMessage实际所在的包路径 -keep class com.mycompany.messagecenter.MyMessage { <fields>; } # 如果你有多个序列化类,也可以匹配整个模块下的所有类 -keep class com.mycompany.messagecenter.** { <fields>; }
- 配置Library导出混淆规则
在Library模块的build.gradle的android块中添加以下配置,确保Library内部的混淆规则会被主应用打包时合并:
android { // 其他原有配置保持不变 buildTypes { release { minifyEnabled true // 这里填写你Library模块中混淆规则文件的实际名称 consumerProguardFiles "proguard-rules.pro" } // 如果debug模式也开启了混淆,同样要加对应配置 debug { minifyEnabled true consumerProguardFiles "proguard-rules.pro" } } }
- 统一升级Gson版本
把项目所有模块的Gson依赖统一升级到2.10.1及以上版本,高版本Gson原生支持Kotlin数据类的序列化/反序列化,可避免大量兼容性问题:
implementation 'com.google.code.gson:gson:2.10.1'
- 可选兼容方案
如果暂时无法升级Gson版本,可以给Kotlin data类的构造参数添加默认值,让编译器自动生成无参构造:
data class MyMessage(@SerializedName("message") val message: String? = null)
内容的提问来源于stack exchange,提问作者user-44651
相关产品推荐
相关产品推荐

