본문 바로가기

Develop

Flutter Android App Bundle 배포 시 발생한 이슈들과 해결 방법

각산마을 Flutter 앱을 Google Play Store에 배포하는 과정에서 여러 기술적 문제들을 만났습니다. 특히 Android 14 대응과 앱 번들 생성 과정에서 발생한 이슈들과 그 해결 과정을 공유하고자 합니다.

 

1. 개요

  • 프로젝트 소개: 각산마을 Flutter 앱은 금리단길의 상점 정보를 지도에 공유하는 Android 앱입니다.
  • 배포 환경: Google Play Store에 배포하여 사용자가 손쉽게 지역 상점 정보를 얻을 수 있도록 제공하고 있습니다.
  • 목적: Android 14에 대응하고, 최신 앱 번들 형식으로 배포하는 과정에서 발생한 문제들을 해결하는 것이 주 목표였습니다.

2. Android 14 (API 34) 호환성

A. 발생한 문제

  • targetSdkVersion 업데이트 필요: Android 14에 맞춰 targetSdkVersion을 업데이트해야 했습니다.
  • Java/Kotlin 버전 호환성 이슈: 기존 버전의 Java와 Kotlin이 최신 API와 호환되지 않는 문제를 겪었습니다.

B. 해결 과정

android/app/build.gradle 파일에서 다음과 같은 변경을 수행했습니다:

android {
    compileSdkVersion 34
    
    defaultConfig {
        targetSdkVersion 34
        minSdkVersion 23
        ...
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }

    kotlinOptions {
        jvmTarget = '17'
    }
}
  • compileSdkVersion 34 설정: Android 14에서 요구하는 새로운 기능을 활용하기 위해 compileSdkVersion을 34로 설정하였습니다.
  • targetSdkVersion 34 설정: 최신 Android 버전에 맞추기 위해 targetSdkVersion을 업데이트했습니다.
  • Java 17 마이그레이션: Java 버전을 17로 업그레이드하여 호환성 문제를 해결했습니다.
  • Kotlin JVM 타겟 업데이트: Kotlin의 JVM 타겟을 최신 버전으로 업데이트하여 안정성을 확보했습니다.

3. R8 코드 최적화 이슈

A. 발생한 문제

앱 번들 생성 중 다음과 같은 R8 관련 오류가 발생했습니다:

ERROR: Missing classes detected while running R8
Missing class com.google.android.play.core.tasks.OnFailureListener
Missing class com.google.android.play.core.tasks.OnSuccessListener
Missing class com.google.android.play.core.tasks.Task
  • Play Core 라이브러리 클래스 누락: R8 코드 최적화 과정에서 Play Core 라이브러리 클래스가 누락되는 문제가 발생했습니다.
  • 종속성 충돌: 여러 라이브러리 간 종속성이 충돌하여 빌드 실패가 발생했습니다.

B. 해결 과정

  • feature-delivery 라이브러리 추가: 누락된 클래스를 포함하기 위해 feature-delivery 라이브러리를 추가했습니다.
dependencies {
    implementation 'com.google.android.play:feature-delivery:2.1.0'
    implementation 'com.google.android.play:feature-delivery-ktx:2.1.0'
}
  • ProGuard 규칙 최적화: ProGuard 설정을 수정하여 필요한 클래스가 최적화 과정에서 제거되지 않도록 설정했습니다.
# Play Feature Delivery
-keep class com.google.android.play.core.** { *; }
-keep interface com.google.android.play.core.** { *; }
-dontwarn com.google.android.play.core.**

# Flutter Deferred Components
-keep class io.flutter.embedding.engine.deferredcomponents.** { *; }
-keep class * implements io.flutter.embedding.engine.deferredcomponents.DeferredComponentManager { *; }
  • 중복 클래스 제거: 충돌을 일으키는 중복 클래스를 제거하여 빌드 문제를 해결했습니다.

4. 디버그 심볼 설정

A. 발생한 문제

Google Play Console에서 다음과 같은 경고를 받았습니다:

This App Bundle contains native code, and you've not uploaded debug symbols. We recommend that you upload a symbol file to make your crashes and ANRs easier to analyse and debug.

  • 네이티브 코드 디버그 심볼 누락: 네이티브 코드에서 발생하는 크래시를 분석하는 데 필요한 디버그 심볼이 누락되었습니다.
  • 크래시 분석 어려움: 디버그 심볼이 없어서 크래시 로그 분석이 어려웠습니다.

B. 해결 과정

android {
    buildTypes {
        release {
            // 기존 설정 유지
            ndk {
                debugSymbolLevel 'SYMBOL_TABLE'
            }
        }
    }

    packagingOptions {
        doNotStrip "**/*.so"
    }
}
  • NDK 디버그 심볼 레벨 설정: NDK 빌드 시 디버그 심볼 레벨을 설정하여 크래시 분석을 용이하게 했습니다.
  • .so 파일 보존 설정: 빌드 과정에서 네이티브 라이브러리 파일(.so)을 보존하도록 설정했습니다.
  • 심볼 테이블 생성 활성화: 심볼 테이블을 생성하여 Play Console에서 크래시 리포트를 보다 쉽게 분석할 수 있도록 했습니다.

5. 주요 교훈 및 시사점

  • Android 버전 업데이트 시 고려사항: 최신 Android 버전 대응 시 targetSdkVersion 및 관련 라이브러리 업데이트의 중요성을 다시금 확인했습니다.
  • 라이브러리 의존성 관리의 중요성: 여러 라이브러리 간의 종속성을 명확히 관리하지 않으면 빌드 실패나 실행 오류가 발생할 수 있습니다.
  • 디버깅 환경 구축의 필요성: 네이티브 코드의 크래시를 분석하기 위해 디버깅 심볼을 적절히 설정하는 것이 필수적임을 알게 되었습니다.

6. 결론

  • 해결된 이슈들 요약: Android 14 대응, R8 코드 최적화 문제, 네이티브 디버그 심볼 설정 문제를 모두 해결했습니다.
  • 향후 유지보수 포인트: 지속적인 Android 버전 업데이트에 따른 테스트와 대응이 필요합니다.
  • 추가 개선 사항: 라이브러리 업데이트와 코드 최적화 방안에 대해 지속적으로 모니터링하고 개선할 계획입니다.
반응형