Android Package を署名して Android Market へ

Android Market にアプリケーションを登録するためには、ビルドした apk ファイルに署名をしないといけないので、ちょっとやってみた。
Android Market に開発者として登録するところは、結構前にやったので覚えていないし、簡単だったと思うので特に書かない。

リリースビルド

ant release

でリリースビルドをする。
すると、 bin 以下に ProjectName-unsigned.apk というファイルができる。
ここでは、これに署名する。

Key Store 作成

まずは、暗号鍵のペアを作る。

${keystorefile} にはキーペアを保存するファイルのパスを、 ${keyalias} には作成するキーペアの名前を入力。
validity はとりあえず 10000 日としておくのがいいみたい。

で、色々聞かれるので答える。

$ keytool -genkey -v -keyalg RSA -keystore ${keystorefile} -alias ${keyalias} -validity 10000
キーストアのパスワードを入力してください:  
新規パスワードを再入力してください: 
姓名を入力してください。
  [Unknown]:  your name
組織単位名を入力してください。
  [Unknown]:  person
組織名を入力してください。
  [Unknown]:  person
都市名または地域名を入力してください。
  [Unknown]:  chiyoda-ward
州名または地方名を入力してください。
  [Unknown]:  tokyo
この単位に該当する 2 文字の国番号を入力してください。
  [Unknown]:  jp
CN=shoma, OU=person, O=person, L=yokohama, ST=kanagawa, C=jp でよろしいですか?
  [no]:  y

10,000 日間有効な 1,024 ビットの RSA の鍵ペアと自己署名型証明書 (SHA1withRSA) を生成しています
	ディレクトリ名: CN=shoma, OU=person, O=person, L=yokohama, ST=kanagawa, C=jp
<keystore> の鍵パスワードを入力してください。
	(キーストアのパスワードと同じ場合は RETURN を押してください):  
[test.keystore を格納中]

jar に署名

で、対象の apk に署名する。

$ jarsigner  -keystore ${keystorefile} -verbose bin/ProjectName-unsigned.apk ${keyalias}
キーストアのパスワードを入力してください: 
 更新中: META-INF/RELEASEK.SF
 更新中: META-INF/RELEASEK.RSA
  署名中: res/layout/main.xml
  署名中: AndroidManifest.xml
  署名中: resources.arsc
  署名中: res/drawable-hdpi/icon.png
  署名中: res/drawable-ldpi/icon.png
  署名中: res/drawable-mdpi/icon.png
  署名中: classes.dex
  署名中: path/to/package/ProjectName/ProjectName.scala

署名を検証

署名を検証してみる。

全部 sm と出たら成功なのかな。

$ jarsigner -certs -verbose -verify bin/ProjectName-unsigned.apk 

         768 Thu Oct 07 00:22:16 JST 2010 META-INF/MANIFEST.MF
         889 Mon Oct 11 23:08:32 JST 2010 META-INF/RELEASEK.SF
         937 Mon Oct 11 23:08:32 JST 2010 META-INF/RELEASEK.RSA
sm       564 Thu Oct 07 00:19:58 JST 2010 res/layout/main.xml

      X.509, CN=your name, OU=person, O=person, L=chiyoda-ward, ST=Tokyo, C=jp
      [証明書は 10/10/06 23:58 から 38/02/21 23:58 まで有効です]

sm      1984 Thu Oct 07 00:19:58 JST 2010 AndroidManifest.xml

      X.509, CN=your name, OU=person, O=person, L=chiyoda-ward, ST=Tokyo, C=jp
      [証明書は 10/10/06 23:58 から 38/02/21 23:58 まで有効です]

sm      1272 Thu Oct 07 00:20:00 JST 2010 resources.arsc

      X.509, CN=your name, OU=person, O=person, L=chiyoda-ward, ST=Tokyo, C=jp
      [証明書は 10/10/06 23:58 から 38/02/21 23:58 まで有効です]

sm      3966 Thu Oct 07 00:20:00 JST 2010 res/drawable-hdpi/icon.png

      X.509, CN=your name, OU=person, O=person, L=chiyoda-ward, ST=Tokyo, C=jp
      [証明書は 10/10/06 23:58 から 38/02/21 23:58 まで有効です]

sm      1537 Thu Oct 07 00:20:00 JST 2010 res/drawable-ldpi/icon.png

      X.509, CN=your name, OU=person, O=person, L=chiyoda-ward, ST=Tokyo, C=jp
      [証明書は 10/10/06 23:58 から 38/02/21 23:58 まで有効です]

sm      2200 Thu Oct 07 00:20:00 JST 2010 res/drawable-mdpi/icon.png

      X.509, CN=your name, OU=person, O=person, L=chiyoda-ward, ST=Tokyo, C=jp
      [証明書は 10/10/06 23:58 から 38/02/21 23:58 まで有効です]

sm    335364 Thu Oct 07 00:19:58 JST 2010 classes.dex

      X.509, CN=your name, OU=person, O=person, L=chiyoda-ward, ST=Tokyo, C=jp
      [証明書は 10/10/06 23:58 から 38/02/21 23:58 まで有効です]

sm      8535 Sat Sep 04 17:03:16 JST 2010 path/to/package/ProjectName/ProjectName.scala

      X.509, CN=your name, OU=person, O=person, L=chiyoda-ward, ST=Tokyo, C=jp
      [証明書は 10/10/06 23:58 から 38/02/21 23:58 まで有効です]


  s = 署名が検証されました。
  m = エントリがマニフェスト内にリストされます。
  k = 1 つ以上の証明書がキーストアで検出されました。
  i = 1 つ以上の証明書がアイデンティティスコープで検出されました。

jar が検証されました。

signed apk を作成

最終的に signed.apk を作る。
Verification successful なら成功でしょう。

で、このファイルを Android Market に登録すると。

$ zipalign -v 4 bin/ProjectName-unsigned.apk bin/ProjectName-signed.apk
Verifying alignment of bin/ProjectName-signed.apk (4)...
      50 META-INF/MANIFEST.MF (OK - compressed)
     533 META-INF/RELEASEK.SF (OK - compressed)
    1102 META-INF/RELEASEK.RSA (OK - compressed)
    1817 res/layout/main.xml (OK - compressed)
    2369 AndroidManifest.xml (OK - compressed)
    3136 resources.arsc (OK)
    4464 res/drawable-hdpi/icon.png (OK)
    8488 res/drawable-ldpi/icon.png (OK)
   10084 res/drawable-mdpi/icon.png (OK)
   12325 classes.dex (OK - compressed)
  132398 path/to/package/ProjectName/ProjectName.scala (OK - compressed)
Verification succesful

できたもの

Live Wallpaper 作成 - プログラマのネタ帳 で作った壁紙を登録してみた。

Android からアクセスすると Market が立ち上がるみたい。
Digital Clock Wallpaper

見られない人はこんなサイトがあったので、こっちから
http://www.androidzoom.com/android_applications/tools/digital-clock-wallpaper_lpat.html

スクショの画像って 480x854 なのね。nexus one は 480x800 だから微妙にサイズが合わない…。