使用R8混淆时出现缺失类警告,现有Proguard配置无效求助
解决方案
情况1:项目不需要这些可选TLS平台(多数场景适用)
这些缺失的类是OkHttp为不同TLS实现提供的可选适配类——你的项目如果没引入BouncyCastle、Conscrypt或OpenJSSE的依赖,只需在R8/ProGuard配置中添加忽略缺失类的规则即可,同时修正之前错误的OkHttp包名配置:
# 忽略OkHttp可选平台的缺失类警告 -dontwarn org.bouncycastle.jsse.** -dontwarn org.conscrypt.** -dontwarn org.openjsse.** # 适配OkHttp 3.x/4.x的包名,保留核心类(可选,R8默认已适配OkHttp,但添加可避免潜在问题) -keep class okhttp3.** { *; } -keep interface okhttp3.** { *; } -keep class okio.** { *; } -keep interface okio.** { *; }
解释:-dontwarn指令会让R8跳过这些缺失类的警告,因为OkHttp在运行时会通过反射检测这些类是否存在,不存在就自动使用系统默认TLS实现,完全不影响功能。
情况2:项目需要使用某款TLS平台
如果你确实需要用Conscrypt/BouncyCastle/OpenJSSE作为TLS实现,直接在项目依赖中引入对应库即可,以Gradle为例:
- 引入Conscrypt:
implementation 'org.conscrypt:conscrypt-android:2.5.2'
- 引入BouncyCastle JSSE:
implementation 'org.bouncycastle:bctls-jdk15on:1.70'
- 引入OpenJSSE:
implementation 'org.openjsse:openjsse:1.1.13'
引入后缺失类警告会自动消失,因为R8能找到对应的类文件。
为什么之前的配置无效?
你之前用的-keep class com.squareup.okhttp.** { *; }是针对**旧版OkHttp(2.x)**的包名,而当前你使用的是OkHttp 3.x/4.x,包名是okhttp3.,所以这个规则根本没生效;且核心问题不是需要保留类,而是要忽略缺失类的警告。
内容的提问来源于stack exchange,提问作者Uzzam Altaf
相关产品推荐
相关产品推荐

