본문 바로가기

Flutter

[Flutter] aab로 안드로이드 배포

 

app확장자로 등록해야 안드로이드로서 등록, 배포할 수 있다.

Flutter는 안드로이드로서 등록하기 위해서는 키가 필요하다.

 

1. 키 생성

keytool -genkey -v -keystore upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload

생성된 키는 upload-keystore.jks로 저장된다.

 

2. 생성된 키를 /android/app 내에 저장한다.

 

3. /android에 key.properties 파일을 생성한다.

비밀번호는 키 생성시 사용했던 비밀번호를 사용하면 된다.

storePassword=비밀번호
keyPassword=비밀번호
keyAlias=upload
storeFile=upload-keystore.jks

 

4. keyAlias가 일치하지 않는다면 다시 확인할 수 있다.

keytool -list -v -keystore android/app/upload-keystore.jks

 

5. /app/build.gradle.kts에 인증 관련 항목을 추가한다.

gradle인지 gradle.kts인지 확인해서 적용해야 한다.

// --- 1. Import (파일 맨 위에 필요) ---
import java.util.Properties
import java.io.FileInputStream

val keystoreProperties = Properties()
val keystorePropertiesFile = project.rootProject.file("key.properties")

if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}


android {
    namespace = "내 앱"
    compileSdk = flutter.compileSdkVersion
    ndkVersion = flutter.ndkVersion

    signingConfigs {
        create("release") {
            if (keystoreProperties.containsKey("storeFile")) {

                keyAlias = keystoreProperties.getProperty("keyAlias")
                keyPassword = keystoreProperties.getProperty("keyPassword")
                storePassword = keystoreProperties.getProperty("storePassword")
                storeFile = file(keystoreProperties.getProperty("storeFile"))

            } else {
                println("WARNING: 'storeFile' key not found in key.properties. Release signing config will be empty.")
            }
        }
    }
    
    
    buildTypes {
        getByName("release") {
            signingConfig = signingConfigs.getByName("release")

            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }

 

6. 위의 과정에서 발생했던 오류다.

Execution failed for task ':app:signReleaseBundle'.

> A failure occurred while executing com.android.build.gradle.internal.tasks.FinalizeBundleTask$BundleToolRunnable

   > java.lang.NullPointerException (no error message)

데이터를 찾을 수 없다는 오류.

 

원인은 두가지였다.

1. storeFile=upload-keystore.jks 경로에 app/을 넣은 것. 경로가 맞지 않아 생기는 오류다.

해당 gradle은 동일한 파일에 있기 때문에 app/을 넣지 말아야 한다.

2. gradle에서 rootProject가 잘 불러와지지 않는 오류.

val keystorePropertiesFile = rootProject.file("android/key.properties")을 사용할 경우 호출이 되지 않아 빌드 오류가 발생했다.

val keystorePropertiesFile = project.rootProject.file("key.properties") 로 변경하니 빌드가 완료되었다.