带有 Kotlin 1.8.20 的 Android Gradle 插件 8.0.0 导致 OkHttp3 R8 缩小问题

Android Gradle Plugin 8.0.0 with Kotlin 1.8.20 causes OkHttp3 R8 minify problem

提问人:J. Hegg 提问时间:4/18/2023 更新时间:4/19/2023 访问量:2144

问:

使用 Android Gradle 插件 (AGP) 8.0.0 升级到 Kotlin 1.8.20 后,我在运行 Gradle 任务时突然收到以下错误消息::app:minifyProdWithR8

Missing class org.bouncycastle.jsse.BCSSLSocket (referenced from: void okhttp3.internal.platform.BouncyCastlePlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, java.lang.String, java.util.List) and 5 other contexts)
Missing class org.bouncycastle.jsse.provider.BouncyCastleJsseProvider (referenced from: void okhttp3.internal.platform.BouncyCastlePlatform.<init>())
Missing class org.conscrypt.Conscrypt$Version (referenced from: boolean okhttp3.internal.platform.ConscryptPlatform$Companion.atLeastVersion(int, int, int))
Missing class org.conscrypt.Conscrypt (referenced from: boolean okhttp3.internal.platform.ConscryptPlatform$Companion.atLeastVersion(int, int, int) and 4 other contexts)
Missing class org.conscrypt.ConscryptHostnameVerifier (referenced from: okhttp3.internal.platform.ConscryptPlatform$DisabledHostnameVerifier)
Missing class org.openjsse.javax.net.ssl.SSLParameters (referenced from: void okhttp3.internal.platform.OpenJSSEPlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, java.lang.String, java.util.List))
Missing class org.openjsse.javax.net.ssl.SSLSocket (referenced from: void okhttp3.internal.platform.OpenJSSEPlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, java.lang.String, java.util.List) and 1 other context)
Missing class org.openjsse.net.ssl.OpenJSSE (referenced from: void okhttp3.internal.platform.OpenJSSEPlatform.<init>())
Missing class org.slf4j.impl.StaticLoggerBinder (referenced from: void org.slf4j.LoggerFactory.bind() and 3 other contexts)

我的项目中有 Ktor 客户端库,它可能依赖于 okhttp3 和其他缺少的类。还有其他人遇到过这个问题吗?io.ktor:ktor-client-android:2.2.4

在这一点上,只是将排除规则添加到 对我来说似乎不对。proguard-rules.pro

安卓 kotlin android-gradle-plugin proguard android-r8

评论


答:

0赞 J. Hegg 4/19/2023 #1

同时,我可以自己解决问题。对于面临此问题的其他任何人。这是我现在使用的解决方法:

基于以下讨论和 OkHttp 库本身的拉取请求,我将以下规则添加到我的文件中:proguard-rules.pro

-dontwarn okhttp3.internal.platform.**
-dontwarn org.conscrypt.**
-dontwarn org.bouncycastle.**
-dontwarn org.openjsse.**
-dontwarn org.slf4j.impl.StaticLoggerBinder
0赞 sgjesse 4/19/2023 #2

这些消息可能在升级到 AGP 8.0.0 之前发出警告。从 7.0.0 开始,宣布了对添加的缺失类的警告,并宣布了使它们出错的计划。

另请参阅报告此问题的 https://issuetracker.google.com/278765639

该文件由 AGP 生成,其中包含避免编译错误所需的指令。app/build/outputs/mapping/release/missing_rules.txt-dontwarn

0赞 Keyvan Norouzi 4/19/2023 #3

只需在 Gradle 文件中添加以下代码即可:

  packagingOptions {
        resources {
            META-INF/proguard/okhttp3.pro
               }

之后,尝试构建发布版本 此外,转到 app/build/outputs/mapping 并在 ProGuard 文件中添加所有带有 -dontwarn 的行

对我来说是以下几行:

-dontwarn java.lang.management.ManagementFactory
-dontwarn java.lang.management.RuntimeMXBean
  • 我使用了okhttp日志记录版本5.0.0-alpha.11