开启minifyEnabled和shrinkResources后崩溃,报错指定Callable错误
解决方案
问题根源
你的MyModel是带默认参数的Kotlin数据类,Moshi的Kotlin适配器依赖Kotlin反射元数据来处理默认参数的解析。开启minifyEnabled后,ProGuard不仅混淆了代码,还移除了反射所需的默认参数元数据和构造函数注解信息,单纯的-keep class MyModel { *; }只保留了类和成员,但没保留这些关键元数据,导致Moshi无法调用带默认参数的构造函数。
修复方法
方法1:使用@Keep注解(推荐)
在MyModel类上添加kotlinx.annotation.Keep注解,ProGuard会自动保留该类的所有结构、构造函数及相关元数据,无需手动编写复杂规则:
import kotlinx.annotation.Keep @Keep data class MyModel( val platform: String? = null, val latestVersion: String? = null, val minimumVersion: String? = null, val committedDate: LocalDateTime? = null )
方法2:补充ProGuard规则
如果不想用注解,需要在proguard-rules.pro中添加以下规则,确保保留必要的元数据和构造函数信息:
# 保留默认参数的元数据(必须) -keepattributes AnnotationDefault # 保留MyModel类及所有成员 -keep class com.myapp.app.MyModel { *; } # 保留MyModel的构造函数(包括带默认参数的版本) -keepclassmembers class com.myapp.app.MyModel { public <init>(...); } # 保留Kotlin元数据,确保反射能识别默认参数 -keepattributes RuntimeVisibleAnnotations,Metadata
方法3:禁用Moshi的默认参数适配(不推荐)
如果不需要默认参数解析,可以修改Moshi的配置,不使用Kotlin适配器的默认参数支持,但这会导致接口返回缺失字段时无法用默认值填充,仅作为临时方案:
val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory().failOnUnknown()) // 禁用默认参数适配 .build()
验证
修改后重新打包release版本,测试接口解析流程,确认崩溃不再出现。
内容的提问来源于stack exchange,提问作者AramJu
相关产品推荐
相关产品推荐

