티스토리 뷰
Signing ProcessEdit
- Debug Mode : Application 개발 및 테스트시 사용
- Android SDK build tool에서 자체적으로 Keytool utility(in JDK)를 이용하여 debug key를 생성.
- Application을 compile할 때마다 Android의 build tool이 debug key와 Jarsigner utility(in JDK)를 이용하여 자체적으로 signing을 함.
- build tool이 이미 debug key의 alias와 password를 알고 있으므로, 개발자는 이를 알 필요가 없음.
- 보통 Eclipse의 ADT Plug-in 또는 Ant의 debug optioned build script를 이용하여 자동적으로 수행됨.
- Release Mode : Application의 Release version을 build시 사용
- .apk signing을 위한 고유의 private key가 필요함.
- private key가 없을 시, Keytool utility를 이용하여 자체적으로 private key를 생성 가능.
- releas mode로 compile된 .apk file에 직접 Signing을 해야 하며, 개발자 스스로 key의 alias 및 password를 알고 있어야 함.
- private key가 있다면, Eclipse의 Export wizard 또는 Ant의 release optioned build script를 이용하여 수행
- Android SDK build tool에서 자체적으로 Keytool utility(in JDK)를 이용하여 debug key를 생성.
- Application을 compile할 때마다 Android의 build tool이 debug key와 Jarsigner utility(in JDK)를 이용하여 자체적으로 signing을 함.
- build tool이 이미 debug key의 alias와 password를 알고 있으므로, 개발자는 이를 알 필요가 없음.
- 보통 Eclipse의 ADT Plug-in 또는 Ant의 debug optioned build script를 이용하여 자동적으로 수행됨.
- .apk signing을 위한 고유의 private key가 필요함.
- private key가 없을 시, Keytool utility를 이용하여 자체적으로 private key를 생성 가능.
- releas mode로 compile된 .apk file에 직접 Signing을 해야 하며, 개발자 스스로 key의 alias 및 password를 알고 있어야 함.
- private key가 있다면, Eclipse의 Export wizard 또는 Ant의 release optioned build script를 이용하여 수행
Signing StrategiesEdit
- 자신이 개발한 모든 Application을 동일한 Certificate로 signing 한다.
- Application Update - Android system에서 이전 버전과 최신 버전 앱의 Certificate를 비교한 후 업데이트 하기 때문(버전 관리 문제)
- Application Modularity - Android system에서는 동일한 Certificate를 가진 Application들을 동일한 process에서 실행시키며, 이를 하나의 Application으로 인식(효율성 문제)
- Code/Data sharing through permissions - 여러 개의 Application을 1개의 Certificate로 signing 함으로써, Application 간의 code 및 data sharing이 안전하게 이뤄질 수 있음.
- Key의 유효기간(Validity Period)을 설정한다.
- 유효기간은 25년 이상으로 정한다. (유효기간이 지나면 seamless한 Application update가 불가함)
- 동일 key로 여러 개의 Application을 signing하면, 이전에 개발한 다른 Application들의 유효기간이 증가할 수 있다.
- Google Play에 Application을 출시하면, 유효기간이 모두 2033년 10월 22일로 조정된다.
- Application Update - Android system에서 이전 버전과 최신 버전 앱의 Certificate를 비교한 후 업데이트 하기 때문(버전 관리 문제)
- Application Modularity - Android system에서는 동일한 Certificate를 가진 Application들을 동일한 process에서 실행시키며, 이를 하나의 Application으로 인식(효율성 문제)
- Code/Data sharing through permissions - 여러 개의 Application을 1개의 Certificate로 signing 함으로써, Application 간의 code 및 data sharing이 안전하게 이뤄질 수 있음.
- 유효기간은 25년 이상으로 정한다. (유효기간이 지나면 seamless한 Application update가 불가함)
- 동일 key로 여러 개의 Application을 signing하면, 이전에 개발한 다른 Application들의 유효기간이 증가할 수 있다.
- Google Play에 Application을 출시하면, 유효기간이 모두 2033년 10월 22일로 조정된다.
Signing in Debug ModeEdit
Android SDK tool에서는 Debug를 위해 아래와 같이 미리 정해진 keystore/key의 names/passwords를 사용한다.
(Application Release시에는 아래와 같은 Debug Certificate를 사용할 수 없다.)
- Keystore name : "debug.keystore"
- Keystore password: "android"
- Key alias : "androiddebugkey"
- key password: "android"
- CN : "CN=Android Debug, O=Android, C=US"
- Eclipse/ADT 사용시 - Default로 Debug mode이며, run 수행 시 자동으로 signing 과정 및 zipalign을 수행한다.
- Ant 사용시 - debug 옵션 사용시 debug signing이 수행된다.
-> ant debug 수행 시, build script에서 Debug Certificate가 적용된 keystore/key 생성 및 zipalign을 수행한다. - Debug Certificate의 만료일 : 생성일로부터 365일
Signing in Release ModeEdit
Signing Flow in Release ModeEdit
- Obtain a suitable private key
- Compile the application in release mode
- Sign your application with your private key
- Align the final APK package
1) Obtain a suitable private key
- private key 생성을 위한 keytool command example
$ keytool -genkey -v -keystore my-release-key.keystore
-alias alias_name -keyalg RSA -keysize 2048 -validity 10000
** 위 command를 실행하면, 아래와 같은 입력 과정을 거친 후 private key의 keystore가 생성된다.
- Keytool Options and Descriptions
- private key 생성을 위한 keytool command example
$ keytool -genkey -v -keystore my-release-key.keystore
-alias alias_name -keyalg RSA -keysize 2048 -validity 10000** 위 command를 실행하면, 아래와 같은 입력 과정을 거친 후 private key의 keystore가 생성된다.
- Keytool Options and Descriptions
2) Compile the application in release modeEdit
- With Eclipse
- unsigned APK를 export한다.
project에서 마우스 우클릭>Android Tools>Export Unsigned Appliccation Package 선택. - 물론 Eclipse의 Export Wizard를 이용하여 release mode compile부터 signing까지 한번에 할 수 있다.
- With Ant
- 아래와 같은 command 사용(release option)
$ ant release
- ant.properties file에 keystore의 path와 key의 alias name이 명시되어 있다면, build script를 통해 APK signing 및 zipalign을 한번에 수행할 수 있다.
output file은 bin/<project_name>-release.apk 이다. - Default로, build script가 Application을 signing하지 않고 compile 하므로, output file은 bin/<project name>-unsigned.apk이다.
이 때에는 직접 apk에 signing 및 zipalign을 해줘야 한다. - 참고: Building and Running Apps on the Command Line.
ant.properties파일을 아래와 같이 수정하면 signing과 zipalign을 자동으로 해준다.
key.store=/home/jlee3/.android/testkey.jks
key.alias=androiddebugkey
key.store.password=android
key.alias.password=android
- With Eclipse
- unsigned APK를 export한다.
project에서 마우스 우클릭>Android Tools>Export Unsigned Appliccation Package 선택. - 물론 Eclipse의 Export Wizard를 이용하여 release mode compile부터 signing까지 한번에 할 수 있다.
- unsigned APK를 export한다.
- With Ant
- 아래와 같은 command 사용(release option)
$ ant release
- ant.properties file에 keystore의 path와 key의 alias name이 명시되어 있다면, build script를 통해 APK signing 및 zipalign을 한번에 수행할 수 있다.
output file은 bin/<project_name>-release.apk 이다. - Default로, build script가 Application을 signing하지 않고 compile 하므로, output file은 bin/<project name>-unsigned.apk이다.
이 때에는 직접 apk에 signing 및 zipalign을 해줘야 한다. - 참고: Building and Running Apps on the Command Line.
ant.properties파일을 아래와 같이 수정하면 signing과 zipalign을 자동으로 해준다. key.store=/home/jlee3/.android/testkey.jks key.alias=androiddebugkey key.store.password=android key.alias.password=android |
3) Sign your application with your private keyEdit
Unsigned APK에 Signing을 하는 방법.
- Jarsigner를 이용하여 my_application.apk라는 이름의 Application을 signing하는 example
$ jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore
my-release-key.keystore my_application.apk alias_name(cf. JDK7부터 APK signing시 -sigalg와 -digestalg 알고리즘을 사용하도록 권장함.)
- APK signing 확인 example
$ jarsigner -verify my_signed.apk
(APK signing이 잘 되었으면, Jarsigner가 "jar verified"를 출력할 것이다.)
- 좀 더 디테일한 확인이 필요할 경우
$ jarsigner -verify -verbose my_application.apk
or
$ jarsigner -verify -verbose -certs my_application.apk
(-cert : "CN=" line을 확인할 때 필요, key의 생성자 정보를 표시함.)
- Jarsigner Options & Descriptions
- Jarsigner를 이용하여 my_application.apk라는 이름의 Application을 signing하는 example
4) Align the final APK packageEdit
APK Signing이 완료되면, Signied APK file에 대해 zipalign을 실행한다.
4-byte boundaries로 alignment를 수행함으로써, Device에 install되었을 시에 perfomance 향상을 제공한다.
즉, zipalign을 함으로써 Application을 실행하는 데에 필요한 RAM의 사용량을 줄여주는 역할을 하게 된다.
- zipalign command example
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
(-v : verbose output(optional)
4 : byte alignment. Don't use anything other than 4.
your_project_name_unaligned.apk : signed apk(input)
your_project_name.apk : signed and aligned apk(output))
- zipalign command example
실패했을때
Securing Your Private KeyEdit
Some tips for keeping key secure:
- Strong password for keystore and key(6자 이상)
- keytool을 이용하여 key를 생성할 때, -storepass 및 -keypass option을 사용하지 않는다. (shell history에 password가 남기 때문)
- Jarsigner를 이용하여 APK signing을 할 때에도 -storepass 및 -keypass option을 사용하지 않는다.
- 다른 이에게 key를 주거나 빌려주지 않아야 하며, key 사용 권한이 없는 사용자가 keystore 및 key의 password를 알지 못하게 한다.
- keystore file을 안전한 곳에 보관한다.
'Android > Apk Signing' 카테고리의 다른 글
WRITE_SECURE_SETTINGS permission (0) | 2013.04.08 |
---|---|
App Key (0) | 2013.03.22 |