
jarsignerコマンドでAndroidパッケージ(.apk)に署名する場合、alias(証明書別名)の指定が必須になります。という事実を今しがた知って泣いたのですが、証明書のaliasはkeytoolで簡単に確認することができました。
$ keytool -list -v -keystore foo.p12 -storetype pkcs12
キーストアのタイプ: PKCS12
キーストアのプロバイダ: SunJSSE
キーストアには 1 エントリが含まれます。
別名: 1
作成日: 2012/04/17
エントリタイプ: PrivateKeyEntry
証明連鎖の長さ: 1
証明書[1]:
(…)
キーストアのタイプ: PKCS12
キーストアのプロバイダ: SunJSSE
キーストアには 1 エントリが含まれます。
別名: 1
作成日: 2012/04/17
エントリタイプ: PrivateKeyEntry
証明連鎖の長さ: 1
証明書[1]:
(…)
「別名」の値がaliasですね。
※上記例では、aliasが「1」と表示されていますが、これはおそらく、証明書を作成する際にaliasの指定を省略したためだと思われます。
これで、正しく署名することができました!
$ jarsigner -verbose -keystore foo.p12 -storetype pkcs12 out.apk 1
jarsignerの使い方はこちらのサイトを参考にさせていただきました。
書式
$ jarsigner -verbose -keystore <証明書ファイル> <署名するandroidアプリパッケージ> <証明書別名>
当たり前ですが、適当に指定すると怒られます。。
$ jarsigner -verbose -keystore foo.p12 -storetype pkcs12 out.apk piyo
jarsigner: 次の証明連鎖が見つかりません: piyo。 piyo は、非公開鍵および対応する公開鍵証明連鎖を含む有効な KeyStore 鍵エントリを参照する必要があります。
jarsigner: 次の証明連鎖が見つかりません: piyo。 piyo は、非公開鍵および対応する公開鍵証明連鎖を含む有効な KeyStore 鍵エントリを参照する必要があります。
以降は、おまけ。
署名の検証
jarsignerのverifyオプションでパッケージが署名されているかどうか確認することができます。$ jarsigner -verify piyo.apk
jar が検証されました。
jar が検証されました。
パッケージの最適化
zipalignを使うとパッケージを最適化してくれます。zipalign はアーカイブを整列するツールで、Android アプリケーション ( .apk ) で重要な最適化を提供します。すべての未圧縮データが、ファイルの開始位置から相対的な特定の位置合わせで始まることを保証することがこのツールの目的です。具体的には、.apk 内のイメージや生のファイルといった未圧縮データを 4 バイトバウンダリに整列させるようにします。これにより位置合わせの制限があるバイナリデータを含んでいたとしても、すべての位置に対して mmap() を使用したダイレクトアクセスが可能となるのです。これによりアプリケーション実行時の RAM の総使用量を減らすことができるというメリットがあります。zipalign – ソフトウェア技術ドキュメントを勝手に翻訳
書式
zipalign [-f] [-v] infile.apk outfile.apk
例
$ zipalign -v 4 piyo_signed.apk piyo.apk
(…)
Verification succesful
(…)
Verification succesful
注意点としては、署名後にzipalignを実行することでしょうか。
参考サイト
環境
Mac OS X 10.8.4
Java 1.7.0_25
Java 1.7.0_25