Flutter 튜토리얼 51편: 앱 크기 최적화
Flutter 앱 크기 최적화
Flutter 앱의 크기는 사용자 경험과 다운로드율에 직접적인 영향을 미칩니다. 이 튜토리얼에서는 앱 크기를 정확히 측정하고 효과적으로 줄이는 방법을 배웁니다.
학습 목표
- 앱 크기 측정 방법 이해하기
- 크기 분석 도구 활용하기
- 앱 크기 최적화 기법 적용하기
1. 앱 크기 측정의 중요성
Why: 왜 앱 크기가 중요한가요?
앱 크기는 여러 측면에서 중요합니다. 첫째, 큰 앱은 다운로드에 오래 걸려 사용자 이탈률이 높아집니다. 둘째, 저장 공간이 제한된 기기에서는 설치 자체가 불가능할 수 있습니다. 셋째, 앱 스토어에서 크기 제한을 초과하면 모바일 데이터로 다운로드할 수 없습니다.
What: 디버그 빌드와 릴리스 빌드의 차이
앱 크기를 측정할 때 가장 중요한 것은 릴리스 빌드1를 기준으로 측정하는 것입니다.
| 빌드 타입 | 특징 | 용도 |
|---|---|---|
| Debug | JIT 컴파일, 디버그 정보 포함, 큰 크기 | 개발 및 테스트 |
| Profile | 일부 디버그 정보 포함, 성능 분석 가능 | 성능 프로파일링 |
| Release | AOT 컴파일, 최적화 적용, 작은 크기 | 실제 배포 |
How: 빌드 명령어
# Android App Bundle (권장)flutter build appbundle
# Android APKflutter build apk
# iOSflutter build ipaWatch out: 주의사항
디버그 빌드로 앱 크기를 측정하면 실제보다 훨씬 크게 나옵니다. 반드시 릴리스 빌드로 측정해야 정확한 크기를 알 수 있습니다.
2. 플랫폼별 앱 크기 확인
Why: 플랫폼마다 측정 방법이 다른 이유
Android와 iOS는 앱 패키징 방식이 다르기 때문에 크기 측정 방법도 다릅니다. 각 플랫폼의 공식 도구를 사용해야 사용자에게 실제로 전달되는 크기를 정확히 알 수 있습니다.
What: 크기 측정 방식 이해하기
How: Android 앱 크기 확인
Google Play Console 사용
- App Bundle을 Play Console에 업로드합니다
- Android vitals > App size 메뉴로 이동합니다
- 기기별 다운로드 크기와 설치 크기를 확인합니다
# App Bundle 빌드flutter build appbundle --release로컬에서 APK 크기 확인
# 분할된 APK 생성flutter build apk --split-per-abi
# 결과 확인ls -la build/app/outputs/flutter-apk/How: iOS 앱 크기 확인
Xcode App Size Report 생성
# IPA 빌드 (development 방식)flutter build ipa --export-method development
# 또는 App Store용flutter build ipaXcode에서 Window > Organizer를 열고 앱을 선택한 후 App Size Report를 생성합니다.
Watch out: 주의사항
- Android App Bundle은 기기마다 필요한 리소스만 전달하므로 APK보다 효율적입니다
- iOS의 실제 다운로드 크기는 App Store Connect에서 확인하는 것이 가장 정확합니다
3. 크기 분석 도구 활용
Why: 어디서 크기가 커지는지 알아야 하는 이유
앱 크기를 줄이려면 먼저 무엇이 크기를 차지하는지 알아야 합니다. Flutter는 앱 크기를 분석할 수 있는 도구를 기본으로 제공합니다.
What: —analyze-size 플래그
--analyze-size 플래그를 사용하면 앱의 크기 구성을 상세히 분석할 수 있습니다.
How: 크기 분석 실행
# Android APK 크기 분석flutter build apk --analyze-size
# iOS 크기 분석flutter build ipa --analyze-size
# 특정 ABI만 분석 (Android)flutter build apk --analyze-size --target-platform=android-arm64실행하면 다음과 같은 출력을 볼 수 있습니다:
▼ app-release.apk (total compressed) 5 MB ▼ assets 2 MB ▼ flutter_assets 2 MB AssetManifest.json 1 KB FontManifest.json 1 KB NOTICES.Z 100 KB ▼ images 1.8 MB logo.png 500 KB background.jpg 1.3 MB ▼ lib 2.5 MB ▼ arm64-v8a 2.5 MB libflutter.so 1.8 MB libapp.so 700 KBHow: DevTools에서 상세 분석
- 분석 결과로 생성된 JSON 파일을 찾습니다
- DevTools2를 실행합니다
- App Size 탭에서 JSON 파일을 로드합니다
# DevTools 실행dart devtoolsDevTools의 App Size 화면에서는 다음을 확인할 수 있습니다:
- Treemap: 각 구성요소의 상대적 크기를 시각적으로 표시
- Table: 정확한 크기를 숫자로 표시
- Diff: 두 빌드 간의 크기 차이 비교
Watch out: 주의사항
--analyze-size는--split-debug-info와 함께 사용할 수 없습니다- 분석은 릴리스 빌드에서만 의미가 있습니다
- 여러 ABI를 동시에 분석하면 결과가 정확하지 않을 수 있습니다
4. 앱 크기 줄이기
Why: 크기 최적화가 필요한 상황
앱 크기가 일정 수준을 넘으면 다운로드율이 급격히 떨어집니다. 특히 신흥 시장에서는 작은 앱 크기가 성공의 핵심 요소입니다.
What: 크기 최적화 전략
How: 디버그 정보 분리
--split-debug-info 플래그를 사용하면 디버그 심볼을 별도 파일로 분리할 수 있습니다.
# 디버그 정보를 별도 디렉토리에 저장flutter build apk --split-debug-info=./debug-info
# 난독화도 함께 적용 (권장)flutter build apk --split-debug-info=./debug-info --obfuscate| 옵션 | 크기 감소 효과 | 설명 |
|---|---|---|
--split-debug-info | ~10-30% | 디버그 심볼 분리 |
--obfuscate | ~5-10% | 코드 난독화 |
| 두 옵션 함께 사용 | ~15-40% | 최대 효과 |
How: 이미지 최적화
이미지는 앱 크기의 큰 부분을 차지합니다.
// 적절한 해상도 사용flutter: assets: - assets/images/1.5x/ - assets/images/2.0x/ - assets/images/3.0x/| 이미지 형식 | 장점 | 권장 용도 |
|---|---|---|
| WebP | 작은 크기, 투명도 지원 | 대부분의 이미지 |
| PNG | 무손실 압축 | 아이콘, 단순한 그래픽 |
| JPEG | 사진에 효율적 | 사진, 복잡한 이미지 |
How: 사용하지 않는 리소스 제거
# 사용하지 않는 패키지 확인flutter pub deps --no-dev
# pubspec.yaml에서 불필요한 패키지 제거 후flutter pub getHow: ProGuard/R8 최적화 (Android)
android/app/build.gradle 파일에서 코드 축소를 활성화합니다:
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}Watch out: 주의사항
--obfuscate사용 시 크래시 리포트 분석을 위해 심볼 파일을 반드시 보관하세요- 이미지를 과도하게 압축하면 품질이 저하될 수 있습니다
- ProGuard 규칙을 잘못 설정하면 앱이 제대로 동작하지 않을 수 있습니다
5. 지연 컴포넌트 (Deferred Components)
Why: 지연 로딩이 필요한 이유
앱의 모든 기능이 처음부터 필요하지는 않습니다. 지연 컴포넌트를 사용하면 필요할 때만 코드와 에셋을 다운로드하여 초기 앱 크기를 줄일 수 있습니다.
What: 지연 컴포넌트의 개념
How: 지연 임포트 사용
Dart의 deferred 키워드를 사용하여 라이브러리를 지연 로드할 수 있습니다:
// 지연 임포트 선언import 'package:myapp/heavy_feature.dart' deferred as heavyFeature;
Future<void> loadHeavyFeature() async { // 라이브러리 로드 await heavyFeature.loadLibrary();
// 로드 후 사용 heavyFeature.HeavyWidget();}How: 지연 위젯 패턴
class DeferredFeatureLoader extends StatefulWidget { const DeferredFeatureLoader({super.key});
@override State<DeferredFeatureLoader> createState() => _DeferredFeatureLoaderState();}
class _DeferredFeatureLoaderState extends State<DeferredFeatureLoader> { late Future<void> _libraryFuture;
@override void initState() { super.initState(); _libraryFuture = heavyFeature.loadLibrary(); }
@override Widget build(BuildContext context) { return FutureBuilder( future: _libraryFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { if (snapshot.hasError) { return const Text('기능을 로드할 수 없습니다'); } return heavyFeature.HeavyWidget(); } return const CircularProgressIndicator(); }, ); }}Watch out: 주의사항
- 지연 로딩은 네트워크 연결이 필요할 수 있습니다
- 자주 사용하는 기능은 지연 로딩하지 않는 것이 좋습니다
- Android Play Feature Delivery와 함께 사용하면 더 효과적입니다
6. 크기 최적화 체크리스트
빌드 전 확인사항
- 사용하지 않는 패키지 제거
- 사용하지 않는 에셋 제거
- 이미지 형식 및 크기 최적화
- 불필요한 폰트 제거
빌드 옵션
-
--split-debug-info적용 -
--obfuscate적용 - ProGuard/R8 활성화 (Android)
분석 및 검증
-
--analyze-size로 크기 분석 - DevTools에서 상세 분석
- 이전 빌드와 크기 비교
마무리
이번 튜토리얼에서는 Flutter 앱의 크기를 측정하고 최적화하는 방법을 배웠습니다.
핵심 정리
| 주제 | 핵심 내용 |
|---|---|
| 크기 측정 | 릴리스 빌드 기준, 플랫폼별 도구 사용 |
| 분석 도구 | --analyze-size, DevTools App Size |
| 최적화 | 디버그 정보 분리, 이미지 압축, 코드 정리 |
| 지연 로딩 | deferred 키워드로 필요시 로드 |
다음 단계
- Flutter 튜토리얼 52편: 렌더링 성능 프로파일링에서 화면 렌더링 성능을 분석하는 방법을 배워보세요.
참고 자료
Footnotes
공유
이 글이 도움이 되었다면 다른 사람과 공유해주세요!