Flutter 튜토리얼 51편: 앱 크기 최적화

Flutter 앱 크기 최적화#

Flutter 앱의 크기는 사용자 경험과 다운로드율에 직접적인 영향을 미칩니다. 이 튜토리얼에서는 앱 크기를 정확히 측정하고 효과적으로 줄이는 방법을 배웁니다.

학습 목표#

  • 앱 크기 측정 방법 이해하기
  • 크기 분석 도구 활용하기
  • 앱 크기 최적화 기법 적용하기

1. 앱 크기 측정의 중요성#

Why: 왜 앱 크기가 중요한가요?#

앱 크기는 여러 측면에서 중요합니다. 첫째, 큰 앱은 다운로드에 오래 걸려 사용자 이탈률이 높아집니다. 둘째, 저장 공간이 제한된 기기에서는 설치 자체가 불가능할 수 있습니다. 셋째, 앱 스토어에서 크기 제한을 초과하면 모바일 데이터로 다운로드할 수 없습니다.

What: 디버그 빌드와 릴리스 빌드의 차이#

앱 크기를 측정할 때 가장 중요한 것은 릴리스 빌드1를 기준으로 측정하는 것입니다.

빌드 타입특징용도
DebugJIT 컴파일, 디버그 정보 포함, 큰 크기개발 및 테스트
Profile일부 디버그 정보 포함, 성능 분석 가능성능 프로파일링
ReleaseAOT 컴파일, 최적화 적용, 작은 크기실제 배포

How: 빌드 명령어#

Terminal window
# Android App Bundle (권장)
flutter build appbundle
# Android APK
flutter build apk
# iOS
flutter build ipa

Watch out: 주의사항#

디버그 빌드로 앱 크기를 측정하면 실제보다 훨씬 크게 나옵니다. 반드시 릴리스 빌드로 측정해야 정확한 크기를 알 수 있습니다.


2. 플랫폼별 앱 크기 확인#

Why: 플랫폼마다 측정 방법이 다른 이유#

Android와 iOS는 앱 패키징 방식이 다르기 때문에 크기 측정 방법도 다릅니다. 각 플랫폼의 공식 도구를 사용해야 사용자에게 실제로 전달되는 크기를 정확히 알 수 있습니다.

What: 크기 측정 방식 이해하기#

flowchart TD A[Flutter 앱] --> B{플랫폼} B -->|Android| C[App Bundle] B -->|iOS| D[IPA 파일] C --> E[Play Console에서 확인] D --> F[Xcode App Size Report] E --> G[기기별 실제 크기] F --> G

How: Android 앱 크기 확인#

Google Play Console 사용#

  1. App Bundle을 Play Console에 업로드합니다
  2. Android vitals > App size 메뉴로 이동합니다
  3. 기기별 다운로드 크기와 설치 크기를 확인합니다
Terminal window
# App Bundle 빌드
flutter build appbundle --release

로컬에서 APK 크기 확인#

Terminal window
# 분할된 APK 생성
flutter build apk --split-per-abi
# 결과 확인
ls -la build/app/outputs/flutter-apk/

How: iOS 앱 크기 확인#

Xcode App Size Report 생성#

Terminal window
# IPA 빌드 (development 방식)
flutter build ipa --export-method development
# 또는 App Store용
flutter build ipa

Xcode에서 Window > Organizer를 열고 앱을 선택한 후 App Size Report를 생성합니다.

Watch out: 주의사항#

  • Android App Bundle은 기기마다 필요한 리소스만 전달하므로 APK보다 효율적입니다
  • iOS의 실제 다운로드 크기는 App Store Connect에서 확인하는 것이 가장 정확합니다

3. 크기 분석 도구 활용#

Why: 어디서 크기가 커지는지 알아야 하는 이유#

앱 크기를 줄이려면 먼저 무엇이 크기를 차지하는지 알아야 합니다. Flutter는 앱 크기를 분석할 수 있는 도구를 기본으로 제공합니다.

What: —analyze-size 플래그#

--analyze-size 플래그를 사용하면 앱의 크기 구성을 상세히 분석할 수 있습니다.

flowchart LR A[빌드 명령어] --> B["--analyze-size"] B --> C[JSON 파일 생성] C --> D[DevTools에서 분석] D --> E[크기 구성 시각화]

How: 크기 분석 실행#

Terminal window
# 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 KB

How: DevTools에서 상세 분석#

  1. 분석 결과로 생성된 JSON 파일을 찾습니다
  2. DevTools2를 실행합니다
  3. App Size 탭에서 JSON 파일을 로드합니다
Terminal window
# DevTools 실행
dart devtools

DevTools의 App Size 화면에서는 다음을 확인할 수 있습니다:

  • Treemap: 각 구성요소의 상대적 크기를 시각적으로 표시
  • Table: 정확한 크기를 숫자로 표시
  • Diff: 두 빌드 간의 크기 차이 비교

Watch out: 주의사항#

  • --analyze-size--split-debug-info와 함께 사용할 수 없습니다
  • 분석은 릴리스 빌드에서만 의미가 있습니다
  • 여러 ABI를 동시에 분석하면 결과가 정확하지 않을 수 있습니다

4. 앱 크기 줄이기#

Why: 크기 최적화가 필요한 상황#

앱 크기가 일정 수준을 넘으면 다운로드율이 급격히 떨어집니다. 특히 신흥 시장에서는 작은 앱 크기가 성공의 핵심 요소입니다.

What: 크기 최적화 전략#

flowchart TD A[앱 크기 최적화] --> B[코드 최적화] A --> C[에셋 최적화] A --> D[빌드 설정 최적화] B --> B1[사용하지 않는 코드 제거] B --> B2[패키지 정리] C --> C1[이미지 압축] C --> C2[불필요한 리소스 제거] D --> D1[디버그 정보 분리] D --> D2[난독화 적용]

How: 디버그 정보 분리#

--split-debug-info 플래그를 사용하면 디버그 심볼을 별도 파일로 분리할 수 있습니다.

Terminal window
# 디버그 정보를 별도 디렉토리에 저장
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: 이미지 최적화#

이미지는 앱 크기의 큰 부분을 차지합니다.

pubspec.yaml
// 적절한 해상도 사용
flutter:
assets:
- assets/images/1.5x/
- assets/images/2.0x/
- assets/images/3.0x/
이미지 형식장점권장 용도
WebP작은 크기, 투명도 지원대부분의 이미지
PNG무손실 압축아이콘, 단순한 그래픽
JPEG사진에 효율적사진, 복잡한 이미지

How: 사용하지 않는 리소스 제거#

Terminal window
# 사용하지 않는 패키지 확인
flutter pub deps --no-dev
# pubspec.yaml에서 불필요한 패키지 제거 후
flutter pub get

How: 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: 지연 컴포넌트의 개념#

flowchart LR A[앱 시작] --> B[기본 모듈] B --> C{기능 필요?} C -->|예| D[지연 모듈 다운로드] C -->|아니오| E[대기] D --> F[기능 사용]

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 키워드로 필요시 로드

다음 단계#


참고 자료#

Footnotes#

  1. 릴리스 빌드(Release Build)는 최적화가 적용된 배포용 빌드입니다. 디버그 정보가 제거되고 코드가 최적화됩니다.

  2. DevTools는 Flutter와 Dart 앱을 디버깅하고 프로파일링하는 도구 모음입니다.

공유

이 글이 도움이 되었다면 다른 사람과 공유해주세요!

Flutter 튜토리얼 51편: 앱 크기 최적화
https://moodturnpost.net/posts/flutter/flutter-performance-app-size/
작성자
Moodturn
게시일
2026-01-08
Moodturn

목차