개발자는 앱을 출시하기 전에 앱을 서명해야 합니다. 서명은 앱의 무결성을 보장하고 사용자에게 신뢰성을 제공하는 중요한 단계입니다. 이 글에서는 플러터 앱을 서명하는 과정에 대해 알아보겠습니다.
서명 과정의 핵심 요소 중 하나는 keystore입니다. 개발자는 릴리스 버전의 앱을 서명하기 위해 keystore를 사용합니다. 이 keystore 파일은 앱의 서명에 필요한 키와 인증서를 포함하고 있습니다. 일반적으로 keystore는 앱을 릴리스하는 동안 계속 사용되므로 안전하게 보관해야 합니다. 또한 keystore의 암호를 분실하면 앱의 업데이트나 새 버전을 릴리스하는 데 문제가 발생할 수 있으므로 이를 주의해야 합니다.
이제 keystore를 생성하고, 필요한 설정을 완료하여 플러터 앱을 서명하는 과정을 살펴보겠습니다.
https://docs.flutter.dev/deployment/android#signing-the-app 을 참고했습니다.
keystore 생성
명령창에 다음 명령어를 실행합니다.
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload
명령어를 입력하고 비밀번호, 이름, 조직, 주소 등 keystore에 필요한 정보를 입력하시면 됩니다.
keystore는 프로젝트 폴더 내에 생성하는게 일반적이지만, 저는 경로를 따로 지정해줬습니다.
생성 후 JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore ~/upload-keystore.jks -destkeystore C:/keystore/release.keystore -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다.
라는 경고문이 뜨는데 따옴표 안의 명령어를 실행하시면 해결 됩니다.
keytool -importkeystore -srckeystore ~/upload-keystore.jks -destkeystore C:/keystore/release.keystore -deststoretype pkcs12
key.properties 작성
keystore와 관련된 정보를 포함하는 key.properties 파일을 작성해줍니다.
[프로젝트]/android/app/
경로에 key.properties
파일을 생성하여 다음과 같이 작성해 줍니다.
storePassword=<password-from-previous-step>
keyPassword=<password-from-previous-step>
keyAlias=upload
storeFile=<keystore-file-location>
build.gradle 파일 수정
[프로젝트]/android/app/build.gradle
파일을 편집하여 릴리스 모드에서 앱을 빌드할 때 업로드 키를 사용할 수 있도록 구성합니다.
1. android 블록 앞에 key.properties를 추가합니다.
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
...
}
2. buildTypes 블록 수정
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now,
// so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
위의 buildTypes 블록을 찾아 수정합니다.
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
이렇게 설정이 완료 되었습니다. flutter build appbundle --no-tree-shake-icons
명령어를 입력하면 서명된 릴리스 파일이 [프로젝트]/build/app/outputs/bundle/release/app-release.aab
경로에 생성된 것을 확인할 수 있습니다.
변경사항이 적용되지 않을 경우 flutter clean
을 실행 후 다시 빌드해주세요