Flutter 앱 빌드 - release 빌드하기 (앱 번들, APK)
2022.04.06
앱 디버그
앱 정상 구동 확인
pubspec.yaml 설정
버전 설정
version: 1.0.0+1
environment:
sdk: ">=2.16.2 <3.0.0"
android\app\src\main\AndroidManifest.xml 설정
파일에서 권한 설정
<manifest>
<uses-permission android:name="android.permission.PERMISSION_CODE" />
<application></<application>
</manifest>
권한 | 내용 |
---|---|
INTERNET | 인터넷 사용 권한 |
BLUETOOTH | 블루투스 상태 확인 |
VIBRATE | 진동 설정 권한 |
SET_ALARM | 알람 설정 권한 |
ACCESS_WIFI_STATE | 와이파이 상태 확인 |
CAMERA | 카메라 권한 |
READ_CONTACTS | 주소록 읽기 |
WRITE_CONTACTS | 주소록 쓰기 |
ACCESS_FINE_LOCATION | GPS 위치 정보 사용 |
ACCESS_COARSE_LOCATION | GPS 위치 정보 사용 |
READ_CALENDAR | 캘린더 읽기 |
WRITE_CALENDAR | 캘린더 쓰기 |
앱이름 확인
<manifest>
<application
android:label="앱 이름"
>
</manifest>
아이콘 변경 (ic_launcher.png)
파일위치: android\app\src\main\res\mipmap-hdpi, -mdpi, -xhdpi, -xxhdpi, -xxxhdpi
- 아이콘 디자인을 위해 Material Design product icons 가이드라인을 확인
- 아이콘 파일을 configuration qualifiers을 사용하여 이름지어 폴더에 넣는다. (그냥 ic_launcher.png 파일을 덮어쓰자)
-
AndroidManifest.xml 에서 application 태그의 android:icon 항목을 업데이트
-
아이콘이 변경된 것을 확인하기 위해 앱을 실행하고 런처에서 앱 아이콘을 확인
android\key.properties 설정
앱의 안드로이드 폴더에 key.properties 파일을 생성
보통 key store는 /Users/[사용자]/key.jks 에 위치
storePassword=password #서명을 만들 때에 작성한 비밀번호
keyPassword=password #서명을 만들 때에 작성한 비밀번호
keyAlias=key
storeFile=/Users/<user name>/key.jks #key store 파일 위치
keystore가 없다면, 아래의 명령어를 입력하여 생성
맥/리눅스
keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
윈도우
keytool -genkey -v -keystore c:/Users/USER_NAME/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
android/app/proguard-rules.pro (Proguard 활성화)
Flutter 엔진 라이브러리를 보호 & 앱의 난독화를 위해서 Proguard를 활성화
## Flutter wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
-dontwarn io.flutter.embedding.**
android/app/build.gradle 설정
빌드 구성 검토
defaultConfig {
// 고유한 최종 (Application Id)appid를 지정
applicationId "com.example.flutter_application_220406_5"
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
서명 구성 & Proguard 활성화
keystoreProperties 코드 추가
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
// 아래 코드 추가 ~ start
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
// ~ end
android {
buildTypes 코드 변경
buildTypes {} 부분을 찾아서
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
signingConfigs{}를 추가하고 buildTypes {} 의 debug 를 release로 변경
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
// Proguard 활성화
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
release 앱 빌드하기
앱 번들 빌드
> cd "app project dir"
> flutter build appbundle
Building with sound null safety
Removed unused resources: Binary resource data reduced from 35KB to 21KB: Removed 39%
Running Gradle task 'bundleRelease'... 47.4s
√ Built build\app\outputs\bundle\release\app-release.aab (17.2MB).
APK 빌드
> flutter build apk --split-per-abi
Building with sound null safety
Running Gradle task 'assembleRelease'... 34.5s
√ Built build\app\outputs\flutter-apk\app-armeabi-v7a-release.apk (6.3MB).
--split-per-abi 플래그를 제거하면 모든 타겟 ABI를 위한 방식으로 코드가 컴파일 되어 APK가 무거워짐
> flutter build apk
Building with sound null safety
Running Gradle task 'assembleRelease'... 14.2s
√ Built build\app\outputs\flutter-apk\app-release.apk (17.2MB).
플랫폼 명시해서 빌드
> flutter build apk --target-platform=android-arm64
Building with sound null safety
Running Gradle task 'assembleRelease'... 10.2s
√ Built build\app\outputs\flutter-apk\app-release.apk (6.7MB).
언제 앱 번들을 사용하고 언제 APK를 사용해야 하나
- 구글 플레이 스토어는 앱을 사용자들에게 더 효율적인 방식으로 전달할 수 있기 때문에 앱 번들 배포를 권장
- 그러나, 플레이 스토어가 아닌 다른 곳에 앱을 배포해야 한다면, APK를 선택 (APK만 등록 가능하므로)