あらすじ
現場ではAndroid TVの開発をやっているのですが、シェルスクリプトで署名済みのAPKを作ろうとした時に、jarsignerだとエラーが出るなどしてうまくいかなかったので、色々調べてみました。
jarsignerで署名ができないパターン
どうやらAndroid 7.0以上ではできないらしい。
Android 7.0 以上では jarsigner ではなく apksigner で署名する | メモ帳
公式のページを見ても、apksignerについてのみ記載されていた。
apksigner | Android Developers
事前準備
Android SDK Build Tools のリビジョン 24.0.3 以上で利用可能です。
事前にパスを通しておきましょう。
.bash_profile
export ANDROID_HOME=/Users/[ユーザ名]/Library/Android/sdk
export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/28.0.3
また、署名するために必要な情報も用意しておきましょう。
- 未署名のAPKファイル
- キーストアファイル
- キーストアパスワード
- キーエイリアス
使用方法
先に実際のコマンドを示します。
apksigner sign --ks [キーストアファイル] -v --v2-signing-enabled true --ks-key-alias [キーエイリアス] --ks-pass pass:[キーストアパスワード] [未署名のAPKファイル]
それぞれのオプションの意味は以下の通りです。
オプション | 意味 |
---|---|
--ks | キーストアファイル |
-v | 詳細出力モードを使用 |
--v2-signing-enabled | APK 署名スキーム v2 を使用するかどうか |
--ks-key-alias | キーストア内で、その署名者の秘密鍵と証明書のデータを示すエイリアス名 |
--ks-pass | 署名者の秘密鍵と証明書が含まれているキーストアのパスワード |
--ks-pass
オプションのフォーマットとしては以下がサポートされています。
フォーマット | 意味 |
---|---|
pass:<password> |
apksigner signコマンドの他の部分と一緒にパスワードをインラインで指定 |
env:<name> |
指定する環境変数にパスワードを保存 |
file:<filename> |
指定するファイル内にパスワードを 1 行で保存 |
stdin |
標準の入力ストリーム内にパスワードを 1 行で指定 |
署名されているか確認する方法
以下のコマンドで署名情報を出力することができます。
apksigner verify --print-certs -v [署名済みのAPKファイル]
それぞれのオプションの意味は以下の通りです。
オプション | 意味 |
---|---|
--print-certs | APK の署名証明書に関する情報を表示 |
-v | 詳細出力モードを使用 |
より詳細な使い方
それぞれのより詳細な使い方に関しては、以下を参照してください。
apksigner | Android Developers