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

AGP升级至8+后Release构建Retrofit Call适配器创建失败求助

AGP 8+ 下 Retrofit 混淆运行时异常的解决方案

问题场景

将Android项目的AGP从7.4.2升级至8.2.0-alpha07,同时完成以下重构:

  • Android编译版本从33升至34
  • Gradle Groovy构建文件转为KTS
  • Kotlin版本从1.8.10升至1.8.21

开启混淆(isMinifyEnabled=true、isShrinkResources=true)的签名Release构建时,出现运行时异常:

java.lang.IllegalArgumentException: Unable to create call adapter for retrofit2.Call<wh3>

原因提示返回类型需参数化为Call<wh3><ErrorBody, ResponseBody>或Call<wh3><out ErrorBody, out ResponseBody>。

所需ProGuard配置

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

1. 核心Retrofit泛型与类保留规则

# 保留泛型签名、内部类等关键属性,避免R8擦除Retrofit所需的类型信息
-keepattributes Signature, InnerClasses, EnclosingMethod
# 保留Retrofit核心类与接口结构
-keep class retrofit2.** { *; }
-keep interface retrofit2.** { *; }

# 保留Retrofit Service接口及其方法的完整定义(包括注解和泛型)
-keepclasseswithmembers interface * {
    @retrofit2.http.* <methods>;
}

# 替换为你项目中实际的接口返回实体、错误实体类路径
-keep class com.yourproject.model.** { *; }

2. AGP 8+ 与 Kotlin 适配规则

AGP 8+ 默认的R8混淆对Kotlin泛型和元数据处理更严格,需补充以下规则:

# 保留Kotlin注解与参数注解信息
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
# 保留Gson序列化注解关联的字段(如果用Gson解析)
-keepclassmembers class ** {
    @com.google.gson.annotations.SerializedName <fields>;
}

# 避免R8移除Kotlin元数据和反射相关类
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.reflect.jvm.internal.**

3. 自定义Call Adapter 额外规则(如使用协程适配器)

如果项目用了Retrofit的协程Call Adapter,需补充:

-keep class retrofit2.adapter.kotlin.coroutines.** { *; }

原因说明

AGP 8+ 的R8混淆器对泛型类型的优化逻辑更激进,会自动移除未被直接"显性引用"的泛型参数信息,导致Retrofit无法识别Call<T>的实际类型参数。同时,类名被混淆为wh3这类无意义名称后,丢失了原有的类型关联,最终触发参数化类型不匹配的异常。上述规则通过保留关键属性、核心类结构和自定义实体类,确保Retrofit在混淆环境下仍能正确解析泛型类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:22:47