본문 바로가기

Flutter

Flutter App Bundle 빌드 중 R8 Missing Class Error 해결하기

반응형

 

소개

Flutter 프로젝트에서 production flavor를 사용하여 앱 번들을 빌드하는 도중, R8에서 누락된 클래스 오류가 발생했습니다. 이 오류는 OkHttp가 TLS 지원을 강화하기 위해 사용하는 Conscrypt와 OpenJSSE 라이브러리의 클래스를 참조하는 과정에서 나타났습니다. 이 글에서는 제 상황, 왜 이런 에러가 발생했는지, 그리고 이를 어떻게 해결했는지 자세히 설명합니다.

문제 상황

다음 명령어로 앱 번들을 빌드하려고 했습니다:

fvm flutter build appbundle --flavor prod -t lib/main_production.dart

빌드 과정에서 여러 경고가 나타났습니다:

warning: [options] source value 8 is obsolete and will be removed in a future release
...

그 후, 다음과 같은 오류 메시지와 함께 빌드가 실패했습니다:

ERROR: 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: ... )
Missing class org.conscrypt.ConscryptHostnameVerifier (referenced from: ...)

오류는 :app:minifyProdReleaseWithR8 단계에서 발생했습니다.

 

오류 발생 원인

 

R8은 Android 빌드 시 사용하는 코드 축소 및 최적화 도구로, 사용하지 않는 코드와 리소스를 제거하여 최종 빌드의 크기를 줄여줍니다. 이 과정에서 R8은 OkHttp 내부에서 Conscrypt와 OpenJSSE 라이브러리의 클래스 참조를 감지하게 되었습니다. 실제 실행 시에 이 클래스들이 필요하지 않거나 시스템에서 제공될 수 있음에도 불구하고, R8은 해당 클래스를 찾지 못하면 빌드를 실패시킵니다. 이러한 문제는 주로 다음과 같은 경우에 발생합니다:

  • 라이브러리(예: OkHttp)가 optional dependency를 참조하는 경우 (예: TLS 지원을 위해 Conscrypt 사용)
  • 누락된 클래스에 대해 경고를 무시하도록 설정한 proguard-rules.pro 파일이 없는 경우

 

해결 방법

저는 아래의 두 가지 방법 중 하나를 사용하여 문제를 해결했습니다.

  1. ProGuard (R8) Keep 규칙 추가하기:
    기존에 proguard-rules.pro 파일이 없었기 때문에, android/app/ 폴더에 새로 생성하고 다음 규칙을 추가했습니다:그리고 android/app/build.gradle 파일의 release 빌드 타입에 아래와 같이 proguard 파일을 참조하도록 수정했습니다
# Conscrypt와 OpenJSSE 관련 누락 클래스 경고 무시
-dontwarn com.android.org.conscrypt.SSLParametersImpl
-dontwarn org.apache.harmony.xnet.provider.jsse.SSLParametersImpl
-dontwarn org.openjsse.javax.net.ssl.SSLParameters
-dontwarn org.openjsse.javax.net.ssl.SSLSocket
-dontwarn org.openjsse.net.ssl.OpenJSSE

# 추가적으로 org.conscrypt 클래스 경고 무시
-dontwarn org.conscrypt.**

 

그리고 android/app/build.gradle 파일의 release 빌드 타입에 아래와 같이 proguard 파일을 참조하도록 수정했습니다

buildTypes {
    release {
        signingConfig signingConfigs.release
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

 

 

 

2. Conscrypt 라이브러리 직접 추가 (Optional):
다른 방법으로, android/app/build.gradle 파일의 dependencies 섹션에 Conscrypt 라이브러리를 추가하여 누락된 클래스를 포함시킬 수 있습니다

 

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2'
    implementation 'org.conscrypt:conscrypt-android:2.5.2'
}

제 경우에는 ProGuard 규칙만 추가하는 것으로 문제가 해결되었습니다.

 

 

결론

빌드 과정에서 R8이 Conscrypt와 OpenJSSE의 optional 클래스 참조를 감지했으나, 해당 클래스들이 프로젝트에 포함되어 있지 않아 오류가 발생했습니다. production flavor로 빌드할 때, 새로 생성한 proguard-rules.pro 파일에 적절한 keep 규칙을 추가(또는 누락된 라이브러리를 포함)하여 R8에게 이러한 누락된 클래스를 무시하도록 지시한 결과, 앱 번들을 성공적으로 빌드할 수 있었습니다. 이 경험은 Flutter 및 서드파티 라이브러리를 사용할 때 올바른 ProGuard/R8 설정의 중요성을 다시 한 번 확인시켜주었습니다.

Happy coding!

 

반응형