티스토리 뷰
Flutter로 안드로이드를 빌드할 때 미리 해두면 나중에 반복 작업이 줄어드는 설정들을 정리한다.
1. flutter.minSdkVersion, flutter.targetSdkVersion 기본값 바꾸기
Flutter를 하다 보면 기본값인 minSdkVersion과 targetSdkVersion이 너무 낮아서, 패키지를 한두 개만 설치해도 경고가 뜨곤 한다. 그래서 프로젝트마다 build.gradle 부분을 하드코딩하게 되는데, 자신 혹은 회사에서 생각하는 최소 버전이 있다면 Flutter 기본 설정으로 해두면 해당 경고가 뜨지 않는다.
해당 설정은 자신이 설치한 Flutter 경로 아래에 있다.
# 예전 위치
[flutter_home]/packages/flutter_tools/gradle/flutter.gradle
# 최신 버전 기준으로 위치가 변경되었다
[flutter_home]/packages/flutter_tools/gradle/src/main/groovy/flutter.groovy
# vscode 기준 열기
$ code [flutter_home]/packages/flutter_tools/gradle/src/main/groovy/flutter.groovy
자신이 수정하고 싶은 부분을 수정하면 된다.
주의: 이 방법은 flutter upgrade 시 초기화된다. 그리고 팀원과 값이 달라져서 "내 로컬에서는 되는데" 상황이 생길 수 있다. 혼자 쓰는 환경에서는 편하지만, 팀 프로젝트라면 프로젝트의 build.gradle에 명시하는 쪽이 안전하다.
// android/app/build.gradle
android {
compileSdkVersion 34
defaultConfig {
minSdkVersion 21
targetSdkVersion 34
}
}
2. 릴리스 서명 설정 분리하기
키스토어 정보를 build.gradle에 직접 쓰면 Git에 비밀번호가 올라간다. 별도 파일로 빼고 gitignore 한다.
# android/key.properties (gitignore 대상)
storePassword=xxxx
keyPassword=xxxx
keyAlias=upload
storeFile=/절대경로/upload-keystore.jks
// android/app/build.gradle
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
키스토어 파일을 잃어버리면 같은 앱으로 업데이트를 올릴 수 없다. 백업은 반드시 여러 곳에 해둔다. Play App Signing을 쓰면 구글이 최종 서명 키를 보관해주므로 업로드 키만 관리하면 되어 위험이 줄어든다.
3. 코드 축소와 난독화
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
APK 크기가 눈에 띄게 줄어든다. 다만 리플렉션을 쓰는 라이브러리는 난독화 과정에서 깨질 수 있으니 proguard-rules.pro에 keep 규칙을 넣어야 한다.
# proguard-rules.pro 예시
-keep class io.flutter.** { *; }
-keep class com.google.firebase.** { *; }
릴리스 빌드를 실기기에서 반드시 테스트해야 하는 이유가 이것이다. 디버그 빌드는 난독화를 안 하므로 문제가 안 보인다.
4. App Bundle로 빌드하기
# APK 대신 AAB
flutter build appbundle --release
구글 플레이는 AAB를 요구한다. 기기별로 필요한 리소스만 내려가므로 실제 다운로드 크기가 줄어든다.
APK가 필요한 경우(사내 배포 등)에는 ABI별로 쪼개면 크기를 줄일 수 있다.
flutter build apk --split-per-abi
5. 빌드 변형(flavor) 설정
개발용과 운영용 앱을 한 기기에 같이 깔고 싶을 때 필요하다.
android {
flavorDimensions "env"
productFlavors {
dev {
dimension "env"
applicationIdSuffix ".dev"
resValue "string", "app_name", "MyApp Dev"
}
prod {
dimension "env"
resValue "string", "app_name", "MyApp"
}
}
}
flutter run --flavor dev
flutter build appbundle --flavor prod
applicationIdSuffix 덕분에 패키지명이 달라져서 두 앱이 동시에 설치된다. 실기기에서 운영 버전을 지우지 않고 개발 버전을 테스트할 수 있다.
6. 권한 정리
플러그인이 자기 매니페스트에 권한을 넣으면 병합되어 최종 앱에 들어간다. 쓰지도 않는 권한이 붙어 있으면 스토어 심사와 사용자 신뢰 양쪽에서 손해다.
<!-- 플러그인이 넣은 권한 제거 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"
tools:node="remove" />
최종 매니페스트는 빌드 후 build/app/outputs/logs/manifest-merger-release-report.txt 에서 확인할 수 있다.
7. 버전 관리
# pubspec.yaml
version: 1.2.3+45
# versionName = 1.2.3
# versionCode = 45
+ 뒤의 숫자가 versionCode다. 스토어에 올릴 때마다 반드시 증가해야 한다. 같은 값으로는 업로드가 거부된다. 이걸 자주 잊어버리니 CI에서 자동 증가시키는 것도 방법이다.
정리
- SDK 버전 기본값은 Flutter 상수로 바꿀 수 있지만 upgrade 시 초기화된다
- 팀 프로젝트는
build.gradle에 명시 - 키스토어는
key.properties로 분리하고 gitignore. 잃어버리면 업데이트 불가 minifyEnabled켰으면 릴리스 빌드를 실기기에서 테스트- 스토어 배포는 AAB, 사내 배포는
--split-per-abi - flavor로 개발·운영 앱 동시 설치
versionCode는 매 배포마다 증가
'개발 > Dart & Flutter' 카테고리의 다른 글
| Flutter get_cli 실행 에러 (dart:cli waitFor deprecated) 해결법 (0) | 2024.03.06 |
|---|---|
| IntelliJ / Android Studio에서 생성 파일 묶어 보기 (File Nesting) (0) | 2023.04.22 |
| Flutter 추천 라이브러리 (0) | 2023.02.17 |
| [라이브러리] Drift (0) | 2023.02.03 |
| [라이브러리] Freezed (0) | 2023.02.03 |
