[Flutter] app(apk) build
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
'Flutter' 카테고리의 다른 글
[Flutter] ipa build 및 browser를 통한 ipa 설치 설정 방법 (0) | 2022.03.17 |
---|---|
[Flutter] class operator override (0) | 2021.12.17 |
[Flutter] 현재 url 가져오기, 새 창으로 열기 (0) | 2021.12.13 |
[Flutter] GetX 컨트롤러 관리 관련 간단 정리 (0) | 2021.11.16 |
[Flutter] java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available (2) | 2021.08.25 |