티스토리 뷰

Android/Apk Signing

About .apk Signing

이주성 2013. 3. 26. 18:59

Signing Process

  1. 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를 이용하여 자동적으로 수행됨.
  2. 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를 이용하여 수행

Signing Strategies

  1. 자신이 개발한 모든 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이 안전하게 이뤄질 수 있음.
  2. Key의 유효기간(Validity Period)을 설정한다.
    • 유효기간은 25년 이상으로 정한다. (유효기간이 지나면 seamless한 Application update가 불가함)
    • 동일 key로 여러 개의 Application을 signing하면, 이전에 개발한 다른 Application들의 유효기간이 증가할 수 있다.
    • Google Play에 Application을 출시하면, 유효기간이 모두 2033년 10월 22일로 조정된다.

 

Signing in Debug Mode

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" 

 

  1. Eclipse/ADT 사용시 - Default로 Debug mode이며, run 수행 시 자동으로 signing 과정 및 zipalign을 수행한다.
  2. Ant 사용시 - debug 옵션 사용시 debug signing이 수행된다.
                       -> ant debug 수행 시, build script에서 Debug Certificate가 적용된 keystore/key 생성 및 zipalign을 수행한다.

  3. Debug Certificate의 만료일 : 생성일로부터 365일 

 

Signing in Release Mode

Signing Flow in Release Mode

  1. Obtain a suitable private key
  2. Compile the application in release mode
  3. Sign your application with your private key
  4. Align the final APK package 

1) Obtain a suitable private key

    1. 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가 생성된다.

       

    2. Keytool Options and Descriptions

                   

       2) Compile the application in release mode

    1. With Eclipse
      1. unsigned APK를 export한다.
        project에서 마우스 우클릭>Android Tools>Export Unsigned Appliccation Package 선택.
      2. 물론 Eclipse의 Export Wizard를 이용하여 release mode compile부터 signing까지 한번에 할 수 있다.
    2. With Ant
      1. 아래와 같은 command 사용(release option)
        $ ant release

      2. ant.properties file에 keystore의 path와 key의 alias name이 명시되어 있다면, build script를 통해 APK signing 및 zipalign을 한번에 수행할 수 있다.
        output file은 bin/<project_name>-release.apk 이다.
      3. Default로, build script가 Application을 signing하지 않고 compile 하므로, output file은 bin/<project name>-unsigned.apk이다.
        이 때에는 직접 apk에 signing 및 zipalign을 해줘야 한다.
      4. 참고: Building and Running Apps on the Command Line.
  1. 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 key

               Unsigned APK에 Signing을 하는 방법.

    1. 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 알고리즘을 사용하도록 권장함.)

       

    2. APK signing 확인 example
      $ jarsigner -verify my_signed.apk
       (APK signing이 잘 되었으면, Jarsigner가 "jar verified"를 출력할 것이다.)
       
    3. 좀 더 디테일한 확인이 필요할 경우
      $ jarsigner -verify -verbose my_application.apk
      or
      $ jarsigner -verify -verbose -certs my_application.apk
      (-cert : "CN=" line을 확인할 때 필요, key의 생성자 정보를 표시함.)
       
    4. Jarsigner Options & Descriptions


  4) Align the final APK package

               APK Signing이 완료되면, Signied APK file에 대해 zipalign을 실행한다.
               4-byte boundaries로 alignment를 수행함으로써, Device에 install되었을 시에 perfomance 향상을 제공한다. 
               즉, zipalign을 함으로써 Application을 실행하는 데에 필요한 RAM의 사용량을 줄여주는 역할을 하게 된다. 

    1. 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))

      실패했을때 

jlee3@jlee3-desk:/tmp/sign$ zipalign -c -v 4 ~/workspace/GCMAPP/bin/GCMAPP.apk
Verifying alignment of /home/jlee3/workspace/GCMAPP/bin/GCMAPP.apk (4)...
      53 res/layout/main.xml (OK - compressed)
     449 res/menu/main.xml (OK - compressed)
     760 AndroidManifest.xml (OK - compressed)
    1853 resources.arsc (BAD - 1)
    3944 res/drawable-hdpi/ic_launcher.png (OK)
   10306 res/drawable-ldpi/ic_launcher.png (BAD - 2)
   12540 res/drawable-mdpi/ic_launcher.png (OK)
   15900 res/drawable-xhdpi/ic_launcher.png (OK)
   26028 classes.dex (OK - compressed)
  196047 META-INF/MANIFEST.MF (OK - compressed)
  196498 META-INF/CERT.SF (OK - compressed)
  196983 META-INF/CERT.RSA (OK - compressed)
Verification FAILED

Securing Your Private Key

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함