You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ProGuard混淆下Moshi+Retrofit出现ClassCastException异常如何解决

Moshi+Retrofit开启ProGuard后泛型转换崩溃解决方案

问题成因

这个java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType报错本质是泛型元数据被R8/ProGuard擦除导致的,哪怕使用空混淆配置也会出现的原因是:

  • R8默认开启的优化步骤会主动裁剪运行时不需要的类型元数据,不会因为是空混淆配置就完全跳过所有裁剪逻辑。
  • Moshi解析JSON、Retrofit解析接口返回值的时候,都需要读取泛型的签名信息来确定实际要序列化/反序列化的类型,泛型签名被移除后就会出现类型转换异常。
  • 若未使用Moshi代码生成方案,依赖反射解析数据类结构,混淆后数据类的字段、泛型信息被重命名/移除,也会触发该报错。

解决方案

1. 补充混淆规则

将以下规则添加到项目的proguard-rules.pro文件中:

# 保留泛型签名,解决核心的类型转换问题
-keepattributes Signature
# 保留注解信息,保证Moshi、Retrofit的注解正常工作
-keepattributes *Annotation*
# 保留方法参数信息,适配高版本Moshi对Kotlin构造参数的读取
-keepattributes MethodParameters

# 替换为你项目中所有参与序列化的数据类的包路径,保留类和所有成员
-keep class com.myapp.packagename.bean.** { *; }
# 替换为你项目中Retrofit服务接口的包路径,保留所有接口定义
-keep interface com.myapp.packagename.network.api.** { *; }

# 保留Moshi相关的核心类和注解
-keepclassmembers class ** {
    @com.squareup.moshi.Json <fields>;
}
-keep class com.squareup.moshi.** { *; }
-dontwarn com.squareup.moshi.**

2. 代码层面修复

  • 给所有参与JSON序列化/反序列化的Kotlin数据类添加@JsonClass(generateAdapter = true)注解,优先使用Moshi的代码生成方案,避免运行时反射读取类型信息,从根源减少混淆带来的问题。
  • 如果使用嵌套泛型结构(比如BaseResponse<List<User>>),确保外层包装类也添加了@JsonClass注解,且被包含在混淆保留规则中。
  • 检查Retrofit实例的构建逻辑,确认MoshiConverterFactory的传入配置没有异常。

3. 排查验证手段

开启混淆时在模块的build.gradle中开启mapping输出:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        // 开启mapping输出,方便定位混淆后的类对应关系
        printMapping = true
    }
}

构建后查看build/outputs/mapping下的mapping文件,对应报错堆栈中的混淆类名,可快速定位具体出问题的类型。

内容的提问来源于stack exchange,提问作者Leon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:30:05