Androidの開発案件で、とある事情につき未署名のapkを自分のキーストアで署名してインストールする必要があった。

何回もやっていて意外と面倒くさかったのでメモ。

jarsigner -digestalg SHA1 -keystore <keystoreのパス> -storepass <ストアパスワード> -keypass <キーパスワード> <apkのパス> <キーエイリアス>

確かdigestalgをSHA1に指定しないとインストールできなかった。

自分の環境ではsigalgを設定する必要がなかったが、AndroidStudioで作成したapkはSHA256withRSAになっていたはず。

keystoreの暗号化方式によっては設定する必要があるみたい。

jarsigner -verify <apkのパス>

このコマンドでは署名が有効かどうかを検証することしかできない。

「詳細は、-verboseおよび-certsオプションを使用して再実行してください。」と出るが、実行結果が見やすくないので、下のkeytoolを使った方法でみたほうがいい。

keytool -list -printcert -jarfile <apkのパス>

どのkeystoreで署名されているか確認するときは、このコマンドでフィンガープリントを見る。

zip -d <apkのパス> "META-INF/*"

apkファイルが本質的にはzipファイルであることを用いたトリッキーな手法だと思った。

META-INFに署名ファイル以外のファイルが入ることはないのだろか。

なお、jarsignerで署名する際apkが既に署名されていると、上書きではなく二重署名の状態になる。

jarsignerコマンド実行後に署名内容の確認をしていなかったので、これに気づかずに悩んでしまった。

最近の公式ドキュメントやネットの記事を見るとjarsignerではなくapksignerを使うと書いてあるが、今回はとりあえずこれでいけた。

参考URL

アプリに署名する | Android Studio

Unsigned APKをSigned APKにする

署名済みの apk から署名を削除する方法 | 穀風