После обновления до Kotlin 1.8.20 с помощью Android Gradle Plugin (AGP) 8.0.0 я внезапно получаю следующие сообщения об ошибках при запуске задачи :app:minifyProdWithR8
Gradle:
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 io.ktor:ktor-client-android:2.2.4
, которая, вероятно, зависит от okhttp3 и других недостающих классов. Кто-нибудь еще испытывает эту проблему?
Простое добавление правил исключения в proguard-rules.pro
не кажется мне правильным на данный момент.
Между тем я мог решить проблему самостоятельно. Для всех, кто сталкивается с этой проблемой. Вот обходной путь, который я использую сейчас:
Основываясь на следующем обсуждении и этом запросе на включение в самой библиотеке OkHttp, я добавил следующие правила в свой proguard-rules.pro
файл:
-dontwarn okhttp3.internal.platform.**
-dontwarn org.conscrypt.**
-dontwarn org.bouncycastle.**
-dontwarn org.openjsse.**
-dontwarn org.slf4j.impl.StaticLoggerBinder
Эти сообщения, вероятно, являются предупреждениями перед обновлением до AGP 8.0.0. С 7.0.0 добавлены предупреждения об отсутствующих классах, а также анонсирован план по их ошибкам.
Также см. https://issuetracker.google.com/278765639, где сообщалось об этой проблеме.
Файл app/build/outputs/mapping/release/missing_rules.txt
генерируется AGP с директивами -dontwarn
, необходимыми для избежания ошибки компиляции.
Просто добавьте следующий код в свой файл Gradle:
packagingOptions {
resources {
META-INF/proguard/okhttp3.pro
}
после этого попробуйте собрать релизную версию также перейдите в app/build/outputs/mapping и добавьте все строки с -dontwarn в файл proguard
для меня было ниже строк:
-dontwarn java.lang.management.ManagementFactory
-dontwarn java.lang.management.RuntimeMXBean