flutter 안드로이드 출시하기 keystore 적용 (keystore 분실 해결방법)
1. keystore 분실 해결 방법
2. keystore 적용 및 오류 해결 방법
1. keystore 분실 해결 방법
먼저 새로 key를 만들어 준다.
keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
여기서 -keystore 다음에 key.jks는 키파일 이름이고 / 마지막에 alias 뒤에 key는 별칭이다.
나의 경우 둘다 key로 지정했다. 둘이 같을 필요는 없지만 나중에 flutter 소스에 추가해줘야하므로 기억해야한다.
아래와 같이 적당히 입력해준다.
kang@ganghyeonsuui-MacBookPro ~ % keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
키 저장소 비밀번호 입력: 암호 입력하면 됨
새 비밀번호 다시 입력: 암호 입력하면 됨
이름과 성을 입력하십시오.
[Unknown]: spin earth
조직 단위 이름을 입력하십시오.
[Unknown]: tistory
조직 이름을 입력하십시오.
[Unknown]: writer
구/군/시 이름을 입력하십시오?
[Unknown]: seoul
시/도 이름을 입력하십시오.
[Unknown]: Gangbuk
이 조직의 두 자리 국가 코드를 입력하십시오.
[Unknown]: 82
CN=spin earth, OU=tistory, O=writer, L=seoul, ST=Gangbuk, C=82이(가) 맞습니까?
[아니오]: Y
다음에 대해 유효 기간이 10,000일인 2,048비트 RSA 키 쌍 및 자체 서명된 인증서(SHA256withRSA)를 생성하는 중
: CN=spin earth, OU=tistory, O=writer, L=seoul, ST=Gangbuk, C=82
<key>에 대한 키 비밀번호를 입력하십시오.
(키 저장소 비밀번호와 동일한 경우 Enter 키를 누름): 그냥 엔터 누르거나 위의 암호와 똑같이 하는것을 추천 (기억만 잘 하면 상관없음)
[/Users/kang/key.jks을(를) 저장하는 중]
그럼 가장 아래에 위치한 저장소에 키파일이 저장된다. 그리고 이 파일을 구글에 제출 하면 되는데 원본을 제출하는것이 아니라 .pem으로 제출해한다. 터미널을 사용해 key파일이 있는 위치로 가서(명령어 : cd /Users/kang) 아래의 명령어를 통해 pem으로 만들어 준다.
keytool -export -rfc -keystore key.jks -alias key -file upload_certificate.pem
그럼 원래 key.jks가 있던 위치에 upload_certificate.pem 파일이 있을 것이다.
그 다음 https://support.google.com/googleplay/android-developer/contact/otherbugs 로 접속을 한다.
이름 , 성, 이메일, 위치까지는 알아서 상식선으로 입력하고
개발자 이름(https://play.google.com/console/ 에 접속하여 가장 왼쪽 상단 버튼 눌러서 목록에 개발자 페이지 들어가면 있다.)
개발자 계정 ID(https://play.google.com/console/ 에 접속하여 가장 왼쪽 상단 버튼 눌러서 목록에 계정 세부정보 들어가면 가장 아래에 숫자로 되어있다.)
앱 이름(상식)
앱패키지 이름(com.~~~~.~~~~)
문제 설명(keystore을 분실하여 새로 등록하려고 합니다. 만 입력하면 된다.)
파일 첨부(바로 위에서 만든 upload_certificate.pem를 첨부해준다.)
이렇게 입력해서 3~4일 뒤에 메일로 키가 새로 등록됬다고 날라온다.
2. keystore 적용 및 오류 해결 방법
새로 키를 등록하고 abb 번들로 컴파일 하는데 과거의 문서를 따라했더니 오류가 많았다. 그래서 처음인 사람을 위해(나도 초보다) 새로 작성하게 되었다.
1.먼저 프로젝트 파일/android/app/ 위치에 위에서 생성한 키파일(key.jks)을 넣어준다.
2.프로젝트 파일/android/app/ 위치에 key.properties 를 생성해준다.
그리고 key.properties에 아래와 같이 입력한다.
storePassword=password1234(위에서 가장 처음에 입력한 암호)
keyPassword=password1234(위에서 가장 마지막에 입력한 암호)
keyAlias=key(키 별칭)
storeFile=key.jks(키 파일 이름)
일부가 블로거가 헷갈리게 아래와 같이 해놔서 <>, "" 등 특수문자가 필요한줄 알았는데 나중에 오류가 났다. 오로지 평문으로만 입력해야한다.
storePassword=<암호 입력>
storePassword="암호 입력"
무조건 아래와 같이 해야한다.
storePassword=password1234
3. 프로젝트 파일/android/app/ 위치에 proguard-rules.pro 생성해준다.
그리고 proguard-rules.pro에 아래와 같이 입력한다.
proguardpro는 당신의 소스를 암호화,난독화 하는 것이다. 이렇게 간단하니 하는게 좋다.
## 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.**
4. 프로젝트 파일/android/app/build.gradle 를 수정해야한다.
4-1. 먼저 가장 최상단에 아래와 같은 코드를 입력해준다.
// 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 서명 구성
일부 사람들이 2번째줄에 key.properties 경로를 그냥 def keystorePropertiesFile = rootProject.file('key.properties')으로 해놓은 경우가 있었는데 나는 이렇게 하니 키 파일을 불러오지 못해서 컴파일 과정에서 아래와 같은 오류가 발생했다.
* What went wrong: Execution failed for task ':app:validateSigningRelease'. > Keystore file not set for signing config release
Keystore file not set for signing config release
기타 등등 (물론 위에서 말한 이유로 암호를 잘못 입력한것도 있었다.)
4-2. buildtype 위에 아래의 코드를 입력해준다.
// 아래의 signingConfigs를 추가해주면 된다.
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
// 위의 signingConfigs를 추가해주면 된다.
//여기는 예시
buildTypes {
release {
signingConfig signingConfigs.debug
}
}
//예시 끝
여기서 나는 처음에 과거 블로그를 보고 3번째줄에 storeFile keystoreProperties['storeFile']만 입력했었는데 App problem occurred evaluating project ':app'. > path may not be null or empty string. path='null' 오류가 발생해서 구글링을 통해 위와같이 소스를 수정해서 해결했다
4-3. buildtype을 수정해준다.
buildTypes {
release {
//signingConfig signingConfigs.debug로 되어있는데 signingConfig signingConfigs.release로 수정해준다.
signingConfig signingConfigs.release
// start of proguard 코드난독화 및 사이즈 축소
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// end of proguard 코드난독화 및 사이즈 축소
}
}