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
相关产品推荐
相关产品推荐

