启用ProGuard后Moshi出现LinkedHashTreeMap类型转换异常求助
问题原因及解决方案
这个崩溃是因为ProGuard混淆了你的数据模型类(SearchItemResponse),导致Moshi无法通过反射识别并解析成目标实体类,只能用默认的LinkedHashTreeMap存储JSON解析结果,最终触发类型转换异常。
你当前的ProGuard规则只覆盖了ViewModel、Retrofit和Moshi的基础组件,遗漏了对自己业务数据模型类的保护,需要添加以下规则:
# 保留response包下所有数据模型类的字段与构造方法,替换为你的实际包名 -keep class com.yourapp.response.** { <fields>; <init>(...); } # 保留Moshi相关注解,确保字段映射关系不丢失 -keepattributes *Annotation* -keepclassmembers class * { @com.squareup.moshi.Json <fields>; } # 如果你用Kotlin数据类,需额外保留自动生成的component和copy方法 -keepclassmembers class kotlin.Metadata { *; } -keepclassmembers class com.yourapp.response.** { *** component*(); *** copy(...); }
规则说明:
- 第一部分规则直接保护你的
response包下所有类的字段和构造方法,避免ProGuard修改类名、字段名,保证Moshi能正确匹配JSON字段与实体类属性。 - 保留注解属性和Moshi的
@Json注解,防止字段映射的关键信息被移除。 - 若使用Kotlin数据类,必须保留其自动生成的
componentN()和copy()方法,否则Moshi无法正常实例化数据类对象。
替换规则中的com.yourapp.response为你项目中SearchItemResponse所在的实际包名即可解决问题。
内容的提问来源于stack exchange,提问作者TabascoLosco
相关产品推荐
相关产品推荐

