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

开启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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:03:26