Android中Moshi+Retrofit开启minifyEnabled触发Kotlin反射内部错误
Android混淆下Moshi解析ErrorResponse报错的解决办法
出现这个问题的核心原因是:开启minifyEnabled=true后,R8/ProGuard混淆工具对ErrorResponse数据类的构造函数或类本身进行了重命名/移除,导致Moshi无法通过反射找到对应的构造方法来创建实例,从而抛出This callable does not support a default call: public constructor ErrorResponse.异常。
解决方案:
方式一:给ErrorResponse添加@Keep注解
直接在你的ErrorResponse数据类上添加AndroidX的@Keep注解,强制混淆工具保留该类的所有成员、构造函数及类本身:import androidx.annotation.Keep @Keep data class ErrorResponse( // 你的字段定义 val code: Int, val message: String )方式二:在混淆规则文件中保留ErrorResponse
如果不想用注解,可在proguard-rules.pro中添加规则,指定保留ErrorResponse类的所有内容:# 替换成你的ErrorResponse实际包名 -keep class com.your.app.package.ErrorResponse { *; } # 如果是嵌套类(比如ApiResponse的内部类),写法如下: # -keep class com.your.app.package.ApiResponse$ErrorResponse { *; }方式三:确保Moshi相关代码不被错误混淆
除了ErrorResponse,还要保证Moshi自身及自定义Adapter不被混淆,可补充以下规则到proguard-rules.pro:-keepclassmembers class * { @com.squareup.moshi.FromJson <methods>; @com.squareup.moshi.ToJson <methods>; } -keep class com.squareup.moshi.** { *; } -keepnames class com.squareup.moshi.** { *; } -dontwarn com.squareup.moshi.**方式四:检查Retrofit配置正确性
确认创建Retrofit实例时,错误转换器使用的是正确配置的Moshi实例,避免因Moshi初始化问题导致解析失败:val moshi = Moshi.Builder() // 若有自定义Adapter,需在这里添加 // .add(CustomAdapter()) .build() val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(MoshiConverterFactory.create(moshi)) .addCallAdapterFactory(NetworkResponseAdapterFactory()) .build()
至于为什么部分API调用正常,是因为那些API对应的响应类已经通过注解或混淆规则被保留,而ErrorResponse未被处理,只有触发错误响应解析的API才会抛出异常。
内容的提问来源于stack exchange,提问作者Omar Assidi
相关产品推荐
相关产品推荐

