AGP 8.x版本Android R8 Release构建循环引用问题求助
Debug APK可正常生成,但Release APK构建失败。使用Android Gradle Plugin(AGP)7.4.2时Release构建无异常,升级至8.0.2或8.2.0-alpha06版本后,触发如下R8错误:
Missing class io.ktor.http.UrlEncodingOption (referenced from: java.lang.Object com.my_custom_package.proj_name.logger.internal.Factory.getAnonymousToken(kotlin.coroutines.Continuation))
...(省略中间堆栈信息)
Caused by: [CIRCULAR REFERENCE: com.android.tools.r8.utils.b: Missing class com.google.api.client.http.GenericUrl (referenced from: java.lang.String com.google.crypto.tink.util.KeysDownloader.fetchAndCacheData())
在你的ProGuard规则文件(通常是proguard-rules.pro)中添加以下规则,强制保留缺失的类及其关联成员:
# 保留Ktor的UrlEncodingOption类 -keep class io.ktor.http.UrlEncodingOption { *; } # 保留Google API Client的GenericUrl类 -keep class com.google.api.client.http.GenericUrl { *; }
如果添加后仍存在关联类缺失的问题,可以尝试扩展规则覆盖整个依赖包,避免遗漏:
# 兜底规则:保留Ktor http模块所有类 -keep class io.ktor.http.** { *; } # 兜底规则:保留Google API Client http模块所有类 -keep class com.google.api.client.http.** { *; }
AGP 8.x版本对R8的代码收缩逻辑做了强化,默认会移除它判定为"未直接引用"但实际在运行时被动态调用的类。这两个缺失类分别来自Ktor和Google API Client依赖,你的日志模块、Tink加密库在运行时需要调用它们,因此必须强制保留。
若问题仍未解决,可排查:
- Ktor、Google API Client的版本是否与AGP 8.x兼容
- 确认相关依赖是否完整引入(是否存在依赖被误排除的情况)
内容的提问来源于stack exchange,提问作者yozhik

