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

Android应用启用Proguard后R8缺失类错误求助

解决R8检测到sun.security/sun.util.logging缺失类的问题

你的问题本质是OpenJSSE依赖了JDK专属的sun包类,但Android Runtime(ART)并不包含这些类——你之前添加的-keep class sun.security.x509.**等规则完全无效,因为-keep是保留已存在的类,而这些类根本不在Android的类路径里,R8找不到自然报错。

以下是具体解决方案:

步骤1:替换无效的Keep规则为Dontwarn规则

把你proguard和consumer-rules里的:

# Keep classes required by OpenJSSE
-keep class sun.security.x509.** { *; }
-keep class sun.util.logging.** { *; }

替换成:

# 忽略Android不存在的JDK sun包类警告
-dontwarn sun.security.x509.**
-dontwarn sun.util.logging.**

这些引用是OpenJSSE中针对JDK环境的 fallback 逻辑,在Android上不会被实际执行,忽略警告即可,不需要保留(也无法保留)这些不存在的类。

步骤2:确保missing_rules.txt的规则正确应用

你说添加自动生成的missing_rules无效,大概率是规则没有被正确加载:

  • 直接把missing_rules.txt里的所有-dontwarn规则复制到你的主proguard-rules.pro文件末尾;
  • 或者在build.gradle中配置加载该文件(debug模式启用minify时也需要对应配置):
    android {
        buildTypes {
            release {
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 
                            'proguard-rules.pro', 
                            'missing_rules.txt'
            }
            debug {
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 
                            'proguard-rules.pro', 
                            'missing_rules.txt'
            }
        }
    }
    

步骤3:检查是否需要OpenJSSE依赖

如果你的应用没有明确需要OpenJSSE的特性(比如特定TLS版本支持),可以直接排除OpenJSSE依赖,改用Android自带的SSL实现或者Conscrypt,从根源避免问题:

dependencies {
    implementation('com.squareup.okhttp3:okhttp:xxx') { // 替换xxx为你的OkHttp版本
        exclude group: 'org.openjsse', module: 'openjsse'
    }
}

步骤4:清理重复的Proguard规则

你的proguard和consumer-rules里有大量重复规则(比如多次保留Parcelable、R类),清理重复规则可以避免潜在冲突,让配置更清晰。

完成以上操作后,执行clean再重新构建,R8的缺失类警告应该会消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:25:01