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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:30:10