Flutter/문제해결

Flutter로 aab 파일 빌드하기

깨비도 2024. 3. 25. 15:32

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

 

 

 

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

Android Asset Studio에서 런처 아이콘을 생성할 수 있다.https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html대충 아이콘을 만든 다음 ic_launcher.zip 파일을 다운로드

velog.io