• 안드로이드 앱 서명
    모바일 개발/Flutter 2025. 12. 2. 18:51
    반응형

    구글 플레이 콘솔에 안드로이드 앱을 업로드하기 위해서는 서명 과정을 거쳐야 한다.

    PC에 JDK가 설치되어 있는지 확인해보고, 제대로 설치돼있을 경우 다음 과정에 따라 aab 파일을 생성한다.

     

    1. 업로드 키 생성

    키 파일 이름(-keystore)과 별칭(-alias)을 지정하여 새로운 키스토어 파일(.jks)을 생성한다.

    (validity 10000: 약 27년(10,000일) 정도 유효한 키를 생성한다.)

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

    명령어를 실행하면 다음과 같이 키 파일의 비밀번호와 사용자의 정보를 묻는다.

    Enter keystore password: 사용할_패스워드_입력
    Re-enter new password: 패스워드_한_번_더_입력

    Enter the distinguished name. Provide a single dot (.) to leave a sub-component empty or press ENTER to use the default value in braces.
    What is your first and last name? [Unknown]: 사용자_이름_또는_조직_이름
    What is the name of your organizational unit? [Unknown]: 팀_또는_부서_이름
    What is the name of your organization? [Unknown]: 조직_이름
    What is the name of your City or Locality? [Unknown]: 도시_이름
    What is the name of your State or Province? [Unknown]: 주_또는_도_이름
    What is the two-letter country code for this unit? [Unknown]: 국가_코드_한국은_KR

    Is CN="사용자_이름_또는_조직_이름", OU=팀_또는_부서_이름, O="조직_이름", L=도시_이름, ST=주_또는_도_이름, C=KR correct? [no]: yes

    질문에 대한 대답을 적절히 입력하면 명령어를 실행한 경로에 키 파일이 생성된다.

    생성된 키스토어 파일은 잃어버리지 않도록 안전한 곳에 보관한다.

     

    2. PEM 인증서 추출

    플레이 콘솔에 제출할 인증서 파일(.pem)을 추출한다.

    아까 생성한 키 파일 이름과 별칭에 맞추어 다음 명령어를 실행한다.

    keytool -exportcert -rfc -keystore upload-keystore.jks -alias upload -file upload_certificate.pem

    아까 생성한 키스토어 파일의 비밀번호를 입력하면 명령어를 실행한 경로에 인증서 파일이 생성된다.

     

    3. 프로젝트에 키스토어 파일 복사

    내 플러터 프로젝트의 android/app/ 경로에 키스토어 파일을 복사해서 붙여 넣는다.

     

    4. key.properties 파일 생성

    내 플러터 프로젝트 android/ 경로에 key.properties 파일을 새로 생성하고 다음 내용을 적어준다.

    storePassword=아까 설정한 키 파일 비밀번호
    keyPassword=아까 설정한 키 파일 비밀번호
    keyAlias=upload
    storeFile=upload-keystore.jks

    1번에서 생성한 키 파일의 별칭과 경로로 적어준다.

     

    4-1. 별칭(alias)을 모를 때

    기존 키스토어를 사용하는데 별칭을 뭘로 설정했는지 모를 경우 다음 명령어를 통해 확인할 수 있다.

    keytool -list -v -keystore 키스토어_파일_이름.jks

    SHA1 인증서의 지문 값도 위 명령어로 확인할 수 있다.

     

    5. build.gradle.kts 수정

    build.gradle.kts 파일에 다음 내용을 붙여 넣어 준다.

    (코틀린으로 작성되었으므로 groovy일 경우 문법 바꾸어 쓸 것)

    // 임포트 추가
    import java.io.FileInputStream
    import java.util.Properties
    
    plugins {
        ...
    }
    
    // Properties 설정 추가
    val keystoreProperties = Properties()
    val keystorePropertiesFile = rootProject.file("key.properties")
    if (keystorePropertiesFile.exists()) {
        keystoreProperties.load(FileInputStream(keystorePropertiesFile))
    }
    
    android {
        ...
    
        compileOptions {
            ...
        }
    
        kotlinOptions {
            ...
        }
    
        defaultConfig {
            ...
        }
    
        // signingConfigs 추가
        signingConfigs {
            create("release") {
                keyAlias = keystoreProperties["keyAlias"] as String
                keyPassword = keystoreProperties["keyPassword"] as String
                storeFile = keystoreProperties["storeFile"]?.let { file(it) }
                storePassword = keystoreProperties["storePassword"] as String
            }
        }
    
        buildTypes {
            release {
                // 추가
                signingConfig = signingConfigs.getByName("release")
    
                // 난독화 및 최적화 옵션; 적용할 경우 추가
                isMinifyEnabled = true 
                isShrinkResources = true
                proguardFiles(
                    getDefaultProguardFile("proguard-android.txt"), 
                    "proguard-rules.pro"
                )
            }
        }
    }
    
    flutter {
        ...
    }
    
    dependencies {
        ...
    }

     

    * flutter_local_notifications 패키지를 사용하고 있을 경우,

    프로젝트의 android/app/src/main/res/raw 경로에 keep.xml 파일을 만들어서 isShrinkResources = true 세팅으로 인해 아이콘 파일이 삭제되는 것을 방지해야 한다. 이 파일을 만들지 않고 그냥 빌드하게 되면 릴리즈 버전 실행 시 PlatformException이 발생한다.

    <?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:tools="http://schemas.android.com/tools"
        tools:keep="@mipmap/ic_launcher" />

    toos:keepAndroidInitializationSettings을 초기화할 때 넣어준 리소스 파일을 적어준다.

    이 파일을 만들기 귀찮을 경우 isShrinkResources 값을 false로 변경하고 다시 빌드한다.

     

    이때 네트워킹 라이브러리 등으로 인해 빌드에 실패할 경우,

    android/app/ 경로에 proguard-rules.pro 파일을 생성한 후 다음 내용을 붙여 넣는다.

    -dontwarn org.conscrypt.**
    -dontwarn org.openjsse.**
    -dontwarn javax.net.ssl.**
    -dontwarn javax.annotation.**

     

    6. Android App Bundle(AAB) 빌드

    플러터 프로젝트 루트 디렉토리에서 다음 명령어를 실행해 서명이 완료된 aab 파일을 생성한다.

    flutter build appbundle --release

    빌드에 성공했을 경우 /build/app/outputs/bundle/release/ 경로에 app-release.aab 파일이 생성된다.

     

    7. 구글 플레이 콘솔에 업로드

    내 앱 > 테스트 및 출시 > 프로덕션에서 새 버전 출시를 누르고, App Bundle에 6번에서 생성한 aab 파일을 업로드한다.

     

     

    * 키스토어 파일 분실 시

    1. 위 1~2번 과정을 통해 키스토어 파일을 새로 생성한다.

    2. 구글 플레이 콘솔 > 내 앱 > 테스트 및 출시 > 앱 무결성에서 업로드 키 재설정 요청을 클릭한다.

    3. 적절한 사유를 선택하고 새로 생성한 인증서 파일(.pem)을 업로드 한다.

    4. 요청이 접수되면 알림창에서 다음과 같은 알림을 확인할 수 있다. (적용에 1~2일 정도 소요)

    MyApp의 업로드 키 재설정 요청이 접수되었습니다. 새 업로드 키는 Dec 1, 2025, 00:00 AM(UTC)부터 유효합니다. 새 업로드 키가 유효해야만 새 App Bundle이나 APK를 업로드할 수 있습니다.

     

    반응형

    '모바일 개발 > Flutter' 카테고리의 다른 글

    앱이 16KB 메모리 페이지 크기를 지원하지 않습니다.  (1) 2026.01.27
    application id, bundle id 변경  (0) 2025.12.16
    Firebase Messaging  (0) 2025.11.21
    앱 아이콘 세팅  (0) 2025.11.21
    다국어 지원(Localization)  (0) 2025.11.16

    댓글

ABOUT ME

공부한 것을 기록하기 위해 블로그를 개설했습니다.

VISIT

/