升级AGP 8.0.0与Kotlin 1.8.20后OkHttp3 R8混淆报错求助
解决AGP 8.0.0 + Kotlin 1.8.20下R8混淆时OkHttp可选依赖类缺失的问题
这个问题在升级AGP 8.x后很常见,本质是OkHttp的可选平台依赖类被R8误判为必须存在的依赖——OkHttp本身会在运行时检测这些类(BouncyCastle、Conscrypt、OpenJSSE等)是否存在,不存在就自动 fallback 到系统默认的SSL实现,所以这些类缺失不会导致运行时崩溃,只是R8的严格检查触发了报错。
下面是几种比直接加-keep更合理的解决方案:
1. 添加对应可选依赖的轻量实现
如果希望彻底消除R8的报错,可以按需添加这些可选依赖的官方轻量版本:
- 针对BouncyCastle:
implementation "org.bouncycastle:bcpkix-jdk15on:1.70" - 针对Conscrypt(仅当项目用到Conscrypt SSL时添加):
implementation "org.conscrypt:conscrypt-android:2.5.2" - 针对OpenJSSE:
implementation "org.openjsse:openjsse:1.1.13" - 针对SLF4J日志:如果不需要实际日志输出,添加nop实现即可:
implementation "org.slf4j:slf4j-nop:1.7.36"
注意:不需要全加,只添加你项目可能用到的即可。
2. 用-dontwarn忽略可选依赖的警告
这是最轻便的方案,因为这些类本来就是可选的,运行时不会被调用,直接告诉R8忽略这些缺失类的警告即可,不会影响代码优化:
在proguard-rules.pro中添加:
-dontwarn org.bouncycastle.** -dontwarn org.conscrypt.** -dontwarn org.openjsse.** -dontwarn org.slf4j.impl.**
这个方案比-keep更合理,因为不会额外保留无用代码,只是关闭不必要的检查。
3. 升级Ktor和OkHttp版本
Ktor 2.2.4依赖的OkHttp版本相对较旧,升级到更新的Ktor版本(比如2.3.0及以上),对应的OkHttp版本会同步升级到4.10.0+,这些新版本已经针对AGP 8.x的R8做了兼容性优化,自带的ProGuard规则会自动处理这些可选依赖的警告,无需手动配置。
比如升级Ktor客户端依赖:
implementation "io.ktor:ktor-client-android:2.3.5"
内容的提问来源于stack exchange,提问作者J. Hegg
相关产品推荐
相关产品推荐

