본문 바로가기
IT/Android

Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in

by 큰공 2024. 2. 2.
728x90
반응형

Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in

 안드로이드 APP 개발 하다가, debug build로 개발하면 문제가 없는데, relase 개발하면 해당 에러가 발생하면서 빌드가 되지 않는 상황입니다. 문제 해결 방법을 찾아보도록 하겠습니다.

 

 

에러 전문

Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in E:\Code\app\build\outputs\mapping\release\missing_rules.txt.

Missing class org.bouncycastle.jsse.BCSSLParameters (referenced from: void okhttp3.internal.platform.BouncyCastlePlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, java.lang.String, java.util.List) and 1 other context)
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>())

 

Chat GPT


R8를 실행하는 중에 발생한 문제로 보입니다. 오류 메시지에는 R8 처리 중에 누락된 클래스가 있다는 내용이 포함되어 있으며, 누락된 클래스를 추가하거나 생성된 추가적인 유지 규칙을 적용해야 한다는 안내가 있습니다.

이 문제를 해결하기 위한 몇 가지 단계는 다음과 같습니다:

Proguard/R8 구성 확인: Proguard 또는 R8 구성 파일이 올바르게 설정되어 있는지 확인하십시오. 축소 및 난독화 과정 중에 필요한 모든 클래스, 메서드 및 필드가 유지되도록 해야 합니다.

의존성 업데이트: 사용 중인 라이브러리의 최신 버전을 사용하는지 확인하십시오. 때로는 라이브러리를 최신 버전으로 업데이트하는 것이 호환성 문제를 해결할 수 있습니다.

유지 규칙 추가: 특정 클래스가 누락된 경우 Proguard 또는 R8 구성 파일에 해당 클래스에 대한 유지 규칙을 추가해야 할 수 있습니다.
예를 들면:
proguard
-keep class com.example.YourClass { *; }

 

서버 통신을 위해서 okhttp lib 를 import 하고 있는데, 이 lib 를 난독화 하는 과정에서 에러가 발생하는것으로 보여집니다. proguard 파일에서 keep class 를 통해서 클래스에 대한 유지 규칙을 추가하라고 합니다.

 

해결책1

proguard-rules.pro 파일에 아래를 추가합니다. proguard 에 의해서 코드 난독화를 이루게 될 경우, 해당 lib 에 대한 부분은 유지를 해야 정상적인 빌드가 되게 됩니다.

-keep class org.bouncycastle.jsse.** { *; }
-keep class org.bouncycastle.jsse.provider.** { *; }
-keep class org.conscrypt.** { *; }
-keep class org.openjsse.javax.net.ssl.** { *; }
-keep class org.openjsse.net.ssl.** { *; }

 

해결책2

해당 방법대로 해결이 되지 않으면, 아래 방법을 사용할 수 있습니다.

 

Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in E:\Code\app\build\outputs\mapping\release\missing_rules.txt.

 

여기에서 에러가 발생한다고 했으므로, 이 파일을 열어보겠습니다. 파일을 열면, 아래 rules 을 keep rules 에 추가하라고 나와 있습니다.

 

해당 부분을 복사해서 proguard-rules.pro 파일에 추가해 주면 빌드가 성공하게 됩니다.

# Please add these rules to your existing keep rules in order to suppress warnings.
# This is generated automatically by the Android Gradle plugin.
-dontwarn org.bouncycastle.jsse.BCSSLParameters
-dontwarn org.bouncycastle.jsse.BCSSLSocket
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
-dontwarn org.conscrypt.Conscrypt$Version
-dontwarn org.conscrypt.Conscrypt
-dontwarn org.conscrypt.ConscryptHostnameVerifier
-dontwarn org.openjsse.javax.net.ssl.SSLParameters
-dontwarn org.openjsse.javax.net.ssl.SSLSocket
-dontwarn org.openjsse.net.ssl.OpenJSSE

 

해결책3

근본적인 원인은 R8 에 의한 코드 난독화로 인한 현상입니다. 코드 난독화를 아예 꺼버리면 해당 부분이 해결됩니다.

바로 release 시에 isMinifyEnabled 를 false 로 변경하면 코드 난독화를 하지 않게 되므로 정상 빌드가 되게 됩니다. 

    buildTypes {
        release {
            isMinifyEnabled = true  // -> false 로 변경
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )

 

isMinifyEnabled

isMinifyEnabled는 Android 빌드 과정에서 ProGuard 또는 R8 코드 축소 및 난독화 도구를 활성화할지 여부를 결정하는 설정입니다. isMinifyEnabled = true로 설정하면, 빌드 과정에서 ProGuard 또는 R8 도구가 활성화되어 불필요한 코드를 제거하고, 코드를 난독화하여 앱의 크기를 줄이고, 리버스 엔지니어링을 어렵게 합니다. 반대로 isMinifyEnabled = false로 설정하면, 코드 축소 및 난독화 과정이 비활성화되며, 이는 디버그 빌드에서 유용할 수 있습니다. 이 경우, 앱의 크기가 커지고 리버스 엔지니어링이 더 쉬워지지만, 디버깅이 더 쉬워집니다.

 

isMinifyEnabled 는 코드 축소 난독화도구로 이를 하지 말지 결정하는 옵션입니다. false 로 두면 코드 난독화를 진행을 하지 않아 앱의 크기가 커지게 되고, 리버스 엔지니어링이 더 쉬워지게 됩니다.

 

테스트 해보니, 코드난독화 시에는 앱크기가 3MB 인데, 코드 난독화를 하지 않으면 30MB로 APK 의 크기가 상승하게 됩니다.

 

또한 코드 난독화가 이뤄지면, LogCat 로그를 보는것도 불편해 집니다. 아래와 같이 Class 명들이 줄어지고, 어떤 코드 어떤 라인에서 에러가 발생했는지 알 수 없게 됩니다.

01-22 05:57:25.265  7282  7282 E AndroidRuntime: 	at o3.m.g(Unknown Source:24)
01-22 05:57:25.265  7282  7282 E AndroidRuntime: 	at n4.a.o(Unknown Source:7)
01-22 05:57:25.265  7282  7282 E AndroidRuntime: 	at c5.e0.run(Unknown Source:104)

 

요약

코드 난독화 R8 기능이 필요없다면, isMinifyEnabled 옵션을 끄자!

 

728x90
반응형

댓글