JDK7におけるAndroidアプリの署名

JDK7(Java7)でjarsignerを利用しapkに署名をする場合、2010~12あたりのブログに書かれているコマンド(JDK6の手法)では署名が出来ず、
[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
というエラーが返ってくる。一応対処できたのでメモ。

・環境

Mac OSX 10.7.5
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

・コマンド

$ keytool -genkey -sigalg SHA1withDSA -keyalg DSA -keysize 1024 -keystore ${HOME}/.android/[yourname].keystore -validity 10000 -alias [youralias]

証明書の作成。
JDK6のときと異なるのは -sigalg SHA1withDSA -keyalg DSA のあたり。JDK7ではデフォルトの暗号ハッシュがSHA-1固定じゃなくなったためオプションで明示してあげる必要がある。
androidのドキュメントでは SHA1withRSA を使いなさいとなっているがJavaのドキュメントではサポートしてると書いてないのでJavaにあわせる。

jarsigner -sigalg SHA1withDSA -digestalg SHA1 -keystore ${HOME}/.android/[yourname].keystore  -verbose Hogehoge.apk [youralias]

上で作成した証明書を使って署名する。証明書の作成に使用したのと同じ形式を指定してあげる。

$ jarsigner -verify Hogehoge.apk

署名の確認。
日本語環境なら「jarは検証されました。」と表示されればおっけー。

・参考
http://www.adamrocker.com/blog/232/signing_for_publish_android_application.html
Sign your app  |  Android Developers
jarsigner