개요
업로드 키 스토어 파일은 앱을 서명하기 위한 파일로,
안드로이드 앱의 서명 및 암호화 키를 안전하게 저장되는 데 사용되는 파일이다.
구글 플레이 스토어에 앱을 게시하려면 업로드 키 스토어를 필요로 하며,
서명되지 않는 앱의 경우 플레이 콘솔에 앱을 업로드 할 수 없다.
이번 포스팅에서는
- 키 스토어를 생성하는 방법
- 안드로이드 앱에서 키 스토어를 참조하여 앱에 서명하는 방법
- 그리고 서명된 앱을 앱 번들(App Bundle, aab)로 만드는 방법
세 가지를 위주로 설명하겠다.
업로드 키 스토어 생성하는 방법
기존의 키 스토어가 있으면 해당 단계는 진행하지 않아도 된다.
키 스토어가 존재하지 않을 경우 아래의 명령어를 실행한다.
해당 실행 명령어는 플러터 공식 문서를 참고하였다.
- macOS 또는 리눅스의 경우
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA \
-keysize 2048 -validity 10000 -alias upload
- 윈도우 터미널(또는 파워쉘)의 경우
keytool -genkey -v -keystore %userprofile%\upload-keystore.jks ^
-storetype JKS -keyalg RSA -keysize 2048 -validity 10000 ^
-alias upload
[ 키스토어 생성 명령어 설명 ]
- -keystore %userprofile%\upload-keystore.jks
- 사용자 폴더에 upload-keystore.jks 이름의 키스토어 파일을 생성한다.
- 파일 이름은 사용자가 임의로 정할 수 있다.
- -storetype JKS
- 키 스토어 타입을 JKS로 지정한다. 자바9에서는 JKS를 필요로 하기 때문에 사용한다.
- 기본값은 PKS12이다.
- 만약 자바9를 사용하지 않는다면 해당 태그는 생략해도 괜찮다.
- -keyalg RSA -keysize 2048 -validity 10000
- 2048비트 RSA 키로 10000일 동안 유효한 키를 만든다.
- -alias
- 키 스토어의 별칭을 지정한다.
명령어를 실행하면 다음과 같은 입력 문구가 차례로 뜬다.
입력해 주자. 포스팅을 위해 예시로 입력한 것이므로 각자 입력하면 된다.
- Enter keystore password : 123456
- 키 저장소 비밀번호 입력 : 비밀번호의 글자는 최소 6글자여야 한다.
- Re-enter new password : 123456
- 새 비밀번호 다시 입력 : 비밀번호 재확인 용도이므로 위에 입력한 비밀번호를 다시 입력해주자.
비밀번호 입력 이후부터는 앱에 표시되지 않고 APK의 일부로 인증서에 포함되는 정보이다.
그러므로 상황에 맞게 적절히 기입해 준다.
[ 예시 입력 ]
- What is your first and last name?
- 이름과 성을 입력하십시오. : 담당자 혹은 관리자(개발자) 이름을 넣어주자.
- What is the name of your organizational unit?
- 조직 단위 이름을 입력하십시오. : 회사의 부서나 팀 이름을 입력한다.
- What is the name of your organization?
- 조직 이름을 입력하십시오. : 회사 이름을 입력한다.
- What is the name of your City or Locality?
- 구/군/시 이름을 입력하십시오? : 지역을 입력한다.
- What is the name of your State or Province?
- 시/도 이름을 입력하십시오. : 지역을 입력한다.
- What is the tow-letter country code for this unit?
- 이 조직의 두 자리 국가 코드를 입력하십시오. : 국가 코드를 입력한다. 한국은 82를 사용한다.
- Is ~~~~~ correct?
- 입력한 정보가 맞는지 되물어보는 절차이므로 y를 입력하고 엔터를 누른다.
- 이후 처음에 설정한 비밀번호를 두 번 입력하면 키 스토어 파일이 사용자 폴더 하위에 생성된다.
윈도우OS를 기준으로 키스토어 생성 경로를 모르겠다면
디렉토리 주소 창에 아래의 명령어를 입력하고 upload-keystore.jks 파일이 생성되었는지 확인해보자.
%userprofile%
생성한 키스토어를 앱에서 사용하기
키스토어 속성 파일 생성하기
플러터 프로젝트에서 android 하위 폴더에 ' key.properties ' 의 이름을 가진 파일을 하나 생성한다.
생성된 key.properties에 다음의 정보를 입력해주자.
- storePassword / keyPassword
- 위에서 생성한 키 스토어의 비밀번호를 입력해준다.
- 두 비밀번호는 동일해야한다.
- keyAlias
- 키 스토어에서 지정한 별칭을 입력한다.
- storeFile
- 키 스토어의 저장 위치를 지정한다.
- 위의 절차를 차례대로 진행하여 키 스토어를 생성한 경우
- MacOS : /Users/<user name>/upload-keystore.jks
- Windows : C:\\Users\\<user name>\\upload-keystore.jks
- 프로젝트 폴더 내에 키 스토어 파일을 이동한 경우
- app>android : ./upload-keystore.jks
- 플러터 루트 프로젝트일 경우 : ../../upload-keystore.jks
storePassword=123456
keyPassword=123456
keyAlias=upload
storeFile=../../upload-keystore.jks
그레이들에 앱 서명 등록하기 (자동 서명 등록하기)
플러터 프로젝트에서 android > app > build.gradle 파일을 연다.
build.gradle 파일에서 아래의 코드를 추가해준다.
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
...
}
동일하게 build.gradle 파일에서 스크롤을 쭉 내리다보면 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
}
}
*/
// 변경된 빌드 타입 설정
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
이제 앱에 릴리즈 모드에서 빌드가 자동으로 서명된다.
서명된 앱을 aab로 만들면 된다.
flutter build appbundle
Error
그레이들 파일을 변경한 후에 앱 서명이 적용되지 않을 경우
만약 그레이들 파일을 변경한 후에 앱 서명이 적용되지 않는다면,
flutter clean 명령어를 실행 후 다시 확인해보자.
flutter clean
aab 파일을 만드는 과정에서 오류가 발생할 경우
aab 파일을 만드는 과정에서 다음과 같은 오류가 발생한다면,
android>key.properties 파일에서 storeFile의 경로를 확인해보자.
키 저장소 경로가 잘못되어서 발생되는 오류이다.
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:validateSigningRelease'.
> Keystore file '~\android\app\upload-keystore.jks' not found for signing config 'release'.
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
* Get more help at https://help.gradle.org