Flutter 앱 빌드 - release 빌드하기 (앱 번들, APK)

앱 디버그

앱 정상 구동 확인

 

 

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만 등록 가능하므로)