각산마을 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 버전 업데이트에 따른 테스트와 대응이 필요합니다.
- 추가 개선 사항: 라이브러리 업데이트와 코드 최적화 방안에 대해 지속적으로 모니터링하고 개선할 계획입니다.
반응형
'Develop' 카테고리의 다른 글
Flutter로 '각산마을' 지도 앱 개발기 (2) | 2024.11.20 |
---|---|
손안의 금리단길: 각산마을 디지털 지도 앱 개발기 (10) | 2024.11.19 |
누구나 할 수 있는 스마트 교통 분석: Python으로 CCTV 다중 모니터링 구현 (0) | 2024.11.17 |
수익 창출! 앱 개발자가 Chrome 확장 프로그램을 개발해야 하는 5가지 이유 (2) | 2024.11.13 |
Gitleaks를 통한 Git 저장소의 API 키 유출 방지 (0) | 2024.11.11 |