[Flutter] 안드로이드 앱 배포(APK)

조경호·2022년 6월 22일
1

Flutter

목록 보기
10/11

안드로이드 APK를 빌드해서 테스트폰에 배포해보자.

1. 런처 아이콘 생성

Android Asset Studio에서 런처 아이콘을 생성할 수 있다.

https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html

대충 아이콘을 만든 다음 ic_launcher.zip 파일을 다운로드 받자.

압축파일을 풀면 res 폴더가 있다. res 폴더 내부의 모든 파일들을 배포할 프로젝트의 android/app/src/main/res 폴더에 복사하자.

  • Flutter 프로젝트로 생성된 앱은 이미 해당 폴더에 플러터 아이콘들이 존재할 것이다. 덮어씌우기 해주자.

이후 에뮬레이터로 실행해 보면 아이콘이 변경된 것을 확인할 수 있다.

2. 앱 서명

배포할 앱의 개발자 정보를 앱에 주입해야 한다. 개발자를 인증하기 위한 일종의 인증서이다.

windows

keytool -genkey -v -keystore c:/Users/[윈도우사용자명]/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

mac

keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

3. 앱이 keystore 참조

생성한 key 파일을 android/app/ 폴더에 놔주자.

배포용 앱을 빌드할 때 참조하기 위해 프로젝트 android/app/ 폴더에 key.properties 파일을 생성한 후 아래와 같이 작성한다.

storePassword=<키생성시 입력한 암호>
keyPassword=<키생성시 입력한 암호>
keyAlias=key
storeFile=./key.jks

4. Gradle 서명 구성

Gradle 빌드 시 key.properties 파일을 참조하기 위해 app/build.gradle 파일의 android 블럭 상단에 아래 내용 추가.

// start of Gradle 서명 구성
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
// end of Gradle 서명 구성

android {
...
}

앱을 배포용(release)으로 빌드하기 위해 android 블럭 내부의 buildType을 release 속성으로 변경, buildType 상단에 signingConfigs 블럭을 추가한다.

android {
...

    // start of signingConfigs
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    // end of signingConfigs
    buildTypes {
        release {
            // release 속성으로 변경
            signingConfig signingConfigs.release
        }
    }
}

Proguard 설정

Proguard는 배포할 앱의 소스코드를 암호화 하는 설정이다. apk 빌드 시 번들 사이즈를 줄이고 소스코드를 암호화 한다.

Proguard Rule을 구성하기 위해 android/app/proguard-rules.pro 파일을 생성하고 다음 규칙을 추가한다.

## 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.**

Gradle 빌드 시 proguard-rules.pro 파일을 참조할 수 있도록 android/app/build.gradle 파일의 buildTypes 블럭에 아래 내용을 추가한다.

android {
    ...
    
    buildTypes {
        release {
            // release 속성으로 변경
            signingConfig signingConfigs.release

            // start of 코드난독화 및 사이즈 축소
            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // end of 코드난독화 및 사이즈 축소
        }
    }
}

Proguard Rule 파일을 사용해서 배포용 앱을 빌드할 때 에러가 발생할 수 있다. Flutter 외부 패키지들을 암호화 하는 중 에러가 발생하는 것으로 보여진다고 한다. 이 경우 암호화 및 사이즈 축소 설정을 주석 처리 하여 빌드를 진행하자..

6. 앱 매니페스트 파일 검토

android/app/src/main/AndroidManifest.xml 파일을 열어 앱의 배포 이름과 사용할 퍼미션을 구성한다.

...
android:label="빌드앱이름"
...

딱히 건드릴 건 없다. 나같은 경우는 빌드할 앱 이름만 소문자에서 대문자로 바꿨다.

7. 빌드 구성 검토

android/app/build.gradle

  • 버전명과 버전코드 설정
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}
  • applicationid 설정
defaultConfig {
	...
	applicationId "com.example.앱이름"
    ...
}

8. 앱 번들 빌드

프로젝트 루트 경로에서 빌드를 시작한다.

flutter build appbundle

빌드 결과

Running Gradle task 'bundleRelease'...                              5.0s
✓ Built build/app/outputs/bundle/release/app-release.aab (22.1MB).

9. APK 빌드

프로젝트 루트 경로에서 빌드를 시작한다.

flutter build apk --split-per-abi

빌드 결과

Running Gradle task 'assembleRelease'...                           13.4s
✓  Built build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk (9.1MB).

10. 앱 배포

기기를 연결하고 인스톨하자.

flutter install
profile
개발자

0개의 댓글