1️⃣ 앱서명
// (배포를 위한 jks키 생성)
$keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
배포하기 위해서는 어플리케이션 서명을 해야한다. jks 확장자 파일의 key를 생성해서 서명을 하면 작동한다.
2️⃣ keystore 참조
keyAlias=key
keyPassword=<키생성시 입력한 암호>
storeFile=./key.jks
storePassword=<키생성시 입력한 암호>
생성한 key 파일을 android/app/ 폴더에 위치시킨 뒤, android/app 폴더에서 key.properties 파일을 생성하고 위에 같이 작성한다.
3️⃣ Gradle 서명 구성
// start of Gradle 서명 구성
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('/app/key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
// end of Gradle 서명 구성
android {
...
}
Gradle 빌드 시 key.properties 파일을 참조하기 위해 app/build.gradle 파일의 android 블럭 상단에 위 내용을 추가한다.
file 경로를 잘 작성하자. 늘 저기서 오타가 나 헤맨다...
android {
...
// start of signingConfigs
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
// storeFile file(keystoreProperties['storeFile'])
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
// end of signingConfigs
buildTypes {
release {
// release 속성으로 변경
signingConfig signingConfigs.release
}
}
}
앱을 release모드로 빌드하기 위해 android 블럭 내부의 buildType을 release 속성으로 변경 후, buildType 상단에 signingConfigs 블럭을 추가한다.
🚨 path may not be null or empty string. path='null'
What went wrong: A problem occurred evaluating project ':app'. path may not be null or empty string. path='null'
앱인증을 모두 마친 후, aab 파일을 빌드하니 이러한 에러가 발생했다. app/build.gradle 파일 몇 번째 줄에서 에러가 나는지도 알려주니 잘 보아야한다.
해당 에러는 keyStore 파일 경로를 찾지 못해 발생하는 에러로
storeFile file(keystoreProperties['storeFile']) 을 storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
로 고쳐주면 쉽게 경로를 찾을 수 있다.
4️⃣ Gradle 서명 구성
Proguard는 배포할 앱의 소스코드를 암호화 하는 설정이다. apk 빌드 시 번들 사이즈를 줄이고 소스코드를 암호화 한다. 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 코드난독화 및 사이즈 축소
}
}
}
🚨 No signature of method: build_ (gradle 7.0+)
설마 Proguard를 추가해주었다고 내게도 에러가 발생하겠어? 라는 생각이었지만 정말 발생했다! Flutter 외부 패키지들을 암호화 하는 중에 에러가 발생하는 것으로 추측된다고 한다.
app/build.gradle 파일에서 proguard 설정에 관련해서 추가한 코드를 모두 없애주면 손쉽게 해결 가능하다.
5️⃣ AndroidManifest.xml 검토
android/app/src/main/AndroidManifest.xml 파일을 검토한다.
ex) permission, label, name 등등
6️⃣ 빌드 구성 검토
최종적으로 android/app/build.gradle 파일을 검토한다.
1. 버전명과 버전코드 설정
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
2. applicationId 설정
defaultConfig {
...
applicationId "com.example.앱이름"
...
}
7️⃣ 앱 번들 빌드
프로젝트 루트 경로에서 빌드를 시작하면 끝이다.
$flutter build appbundle