2019년 2월 16일 토요일

Google Play Store 업로드를 위해 앱 서명(signing)을 수동으로 하는 방법

최근 구글 정책 변경으로 오랜만에 앱을 업데이트하게 되었음.
https://www.bloter.net/archives/328897

거의 손 놓고 있었던 앱이었는데 기한까지 기능을 제거하지 않으면 앱이 제거된다고 하여
내가 사용하기 위해 어쩔 수 없이 업데이트해서 올릴 수밖에 없었음.
앱을 유지만 하는 것도 생각보다 어렵다.


Play Store에 올리기 위해 Android Studio에서 앱을 서명하려고 했는데
계속 password verification이 실패했다는 메세지가 나와서 결국 command line에서 수동으로 앱을 서명해서 올렸고 현상의 원인은 파악하지 못했음.

일단 앱을 서명하는 방법과 command line에서 수동으로 서명하는 방법은 다음과 같다.

앱을 서명하는 방법

: https://developer.android.com/studio/publish/app-signing#sign-apk

위 가이드를 보고 따라 하면 되는데 간략히 설명하면
Android Studio > Build > Generate Signed Bundle / APK 메뉴를 선택한다.

아래 화면에서 자신의 상황에 맞춰 Create new나 Choose existing을 선택하면 된다.

만약 서명을 위한 key를 새롭게 만든다면 다음을 참고해서 Play Store에 등록하고 업로드용 key로 만들어 등록하여 사용해야 한다.

기존에 만들어둔 key store를 선택하고 password를 입력하면 Key alias에서 key를 선택할 수 있고 이후 key의 password를 입력하면 된다. 이때 key store password가 틀리면 key alias를 선택할 수 없다. key password가 다르다면 서명이 실패한다.


다음 화면에서 release를 선택하면 앱 폴더의 build > output > apk > release 폴더에서 서명된 apk를 찾을 수 있다.


Key Store, 내부 Key 확인 방법

https://docs.oracle.com/cd/E19226-01/821-0027/gfjwc/index.html

위처럼 Android Studio에서 key store 와 key를 확인할 수 있지만 다음 방법으로 확인할 수 있고 key 추출도 가능하다.

- key Store 내부 key 확인 방법
> keytool  -list  -keystore {keystore파일}  -v
   Enter keystore password:

keytool은 JDK 설치 위치에 있으니 아래 글을 참고하세요.
https://stackoverflow.com/questions/5488339/how-can-i-find-and-run-the-keytool

위 명령어를 실행 한 뒤 지정된 key store의 password를 입력하여 keystore의 정보와 내부 key 목록을 확인할 수 있다.

D:\key>"c:\Program Files\Java\jdk1.8.0_112\bin\keytool.exe" -list -keystore key_android.jks -v
키 저장소 비밀번호 입력:

키 저장소 유형: JKS
키 저장소 제공자: SUN

키 저장소에 1개의 항목이 포함되어 있습니다.

별칭 이름: csk
생성 날짜: 2016. 3. 13
항목 유형: PrivateKeyEntry
인증서 체인 길이: 1
인증서[1]:
소유자: CN=csk
발행자: CN=csk
일련 번호: 312a2964
적합한 시작 날짜: Sun Mar 13 19:21:02 KST 2016, 종료 날짜: Thu Mar 07 19:21:02 KST 2041
인증서 지문:
         MD5: ...(생략)
         SHA1: ...(생략)
         SHA256: ...(생략)
         서명 알고리즘 이름: SHA256withRSA
         버전: 3

확장:
... (생략)

- Key Store에서 Key도 추출 가능하다.
> keytool  -export  -keystore {keystore 파일} -alias {key alias이름}  -file {추출할 key 파일명}
   Enter keystore password:
 ex) keytool  -export  -keystore keystore.jks -alias csk -file csk.cer



Command line에서 수동으로 앱 서명 방법
https://developer.android.com/studio/publish/app-signing#signing-manually

Android Studio에서 알아서 해주시면 부득이 한 경우 다음과 같이 진행하면 된다.

1. 빌드
2. zipalign을 사용하여 APK 정렬
3. apksigner를 사용하여 서명


1. 빌드
  Android Studio > View > Tool Windows > Terminal 에서

  gradlew assembleRelease  실행

  그럼 project_name/module_name/build/outputs/apk/에 module_name-unsigned.apk라는 이름의 APK가 생성된다.

2. zipalign을 사용하여 APK 정렬
  zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk

  참고로 zipalign은 Android SDK의 build tool에 있다.
  https://stackoverflow.com/questions/40004884/cant-find-apksigner-executable-to-manually-sign-apk

3. apksigner를 사용하여 서명
   apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk