[Flutter] app(apk) build

Flutter|2021. 8. 18. 17:55

release 버전의 build가 목적이므로, 이미 keystore 등의 준비가 모두 된 상태라 가정한 순서. 사용중인 주요 api로는 firebase가 있으며, flutter와 firebase의 공식 문서를 참고했다.

 

1. keytool

keytool -genkey -v -keystore c:/Users/USER\_NAME/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

Android의 경우에는 이 명령어를 사용하여 키를 생성한다고 하는데,

Warning:
JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore c:/Users/USER_NAME/key.jks -destkeystore c:/Users/USER_NAME/key.jks -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다.

라는 warning이 떠서...error로 오인하고

keytool -importkeystore -srckeystore c:/Users/USER_NAME/key.jks -destkeystore c:/Users/USER_NAME/key.jks -deststoretype pkcs12

를 시도했는데, 이번엔 -genkey를 쓸 때마다

keytool 오류: java.lang.Exception: 키 쌍이 생성되지 않았으며 <key> 별칭이 존재합니다.
java.lang.Exception: 키 쌍이 생성되지 않았으며 <key> 별칭이 존재합니다.
        at sun.security.tools.keytool.Main.doGenKeyPair(Unknown Source)
        at sun.security.tools.keytool.Main.doCommands(Unknown Source)
        at sun.security.tools.keytool.Main.run(Unknown Source)
        at sun.security.tools.keytool.Main.main(Unknown Source)

가 발생. PKCS12로 이전하라는 말 대로 했을 때

Warning:
"c:/Users/USER_NAME/key.jks"을(를) Non JKS/JCEKS(으)로 이전했습니다. JKS 키 저장소가 "c:/Users/USER_NAME/key.jks.old"(으)로 백업되었습니다.

이런 warning이 떴던 걸 기억해서 해당 경로에 있는 key.jks와 key.jks.old 파일을 모두 삭제 후 시도하니 성공. 나중에 build하고 보니, PKCS12 warning은 무시해도 build와 설치에 지장은 없었다.

 

2. keystore 참조

PROJECT_ROOT/android/key.properties 생성 후

storePassword=PASSWORD
keyPassword=PASSWORD
keyAlias=key
storeFile=C:/Users/USER_NAME/key.jks

저대로 입력하면 끝. 각자 설정했던 keystore의 비밀번호, key의 비밀번호, key.jks가 위치한 경로를 적어주면 된다. keyAlias=key는 그대로 둘 것.

 

3. Gradle PROJECT_ROOT/android/app/build.gradle

  • 앱 서명을 위한 수정
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
  keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

위 코드는 android{ ... } 위에 추가한다.

 

buildTypes {
   release {
       // TODO: release 빌드 버전을 위한 서명 구성을 추가하세요.
       // 현재는 `flutter run --release`가 디버그용 키로 서명되어 동작합니다.
       signingConfig signingConfigs.debug
   }
}

위는 아래와 같이 변경한다.

signingConfigs {
   release {
       keyAlias keystoreProperties['keyAlias']
       keyPassword keystoreProperties['keyPassword']
       storeFile file(keystoreProperties['storeFile'])
       storePassword keystoreProperties['storePassword']
   }
}
buildTypes {
   release {
       signingConfig signingConfigs.release
   }
}

 

  • 난독화와 축소를 위한 수정
android {

    ...

    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

딱 저대로 추가하면 된다. 물론 이걸 위해서는 proguard-rules.pro의 작성이 필요하다. 이 외에도 다른 최적화를 위한 옵션 변경이 있는 것 같은데, 자세히 알아봐야 할 듯. 앱 빌드 할 때 shrinkResources true를 추가로 작성해보기는 했다.

 

4. Proguard

PROJECT_ROOT/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.**

 

5. Build

  • 앱 번들로 빌드: flutter build appbundle
  • apk로 빌드: flutter build apk --split-per-abi

빌드된 경로(aab, apk 등이 있는 경로)는 build 후 console창에 표시된다. 

 

6. Install

flutter install을 통한 설치가 가능하다고는 하지만, 일반적으로 앱 설치하듯 apk만 옮겨서 바로 설치해도 무방하다.

 

 

Android 앱 출시 준비하기

Flutter 앱을 개발하는 동안, 커멘드 라인에서의 `flutter run`을 실행하거나IDE에 있는 툴바 **Run** 과 **Debug**를 선택하여 앱을 테스트할 수 있습니다. Flutter는 기본적으로 앱의 _debug_ 버전을 빌드합니

flutter-ko.dev

 

Firebase 출시 체크리스트

이 문서에는 Firebase 앱을 출시하기 전에 고려해야 할 사항의 체크리스트가 있습니다. 연결된 앱 업데이트 Android: Firebase Console(OAuth 클라이언트 ID용)의 프로젝트 설정에 앱의 서명 인증서에 출시 S

firebase.google.com

 

앱 축소, 난독화 및 최적화  |  Android 개발자  |  Android Developers

사용하지 않는 코드와 리소스를 삭제하기 위해 출시 빌드에서 코드를 축소하는 방법을 알아보세요.

developer.android.com

 

댓글()