
[TECH] apksignerを使用した署名とAPK Signature Scheme v2
前回の記事(ANDROID APP SIGNING & ZIPALIGN)では、APK Signature Scheme v1を使用して、jarsignerを使ったAPKおよびAABファイルの署名方法について説明しました。
今回は、apksignerを使用したAPKの署名方法について解説します。
「jarsignerを使って署名できるのに、なぜapksignerを使う必要があるのか?」と疑問に思うかもしれません。
APK Signature Scheme v2は、Android 7.0で導入され、APKファイルの保護を強化しました。
その後、Android 9.0でAPK Signature Scheme v3が、Android 11.0でAPK Signature Scheme v4が導入されました。

APK Signature Scheme v2が導入される前は、jarsignerを使用したSigned JAR方式で署名されていました。
しかし、APK Signature Scheme v2以降は、apksignerを使用するようになりました。
では、どのような場合にapksignerを使用して署名する必要があるのでしょうか?
1) アプリのビルド時にSignature Versions v2オプションが選択された場合(APK Signature Scheme v2)
2) アプリのtargetSdkVersionが30以上に設定されている場合
上記の場合、apksignerでの署名が必須となります。
jarsignerを使ってもアプリのインストールや実行に問題はありませんが、Google Play Consoleへアップロードする際にエラーが発生する可能性があります。
アプリの署名スキームバージョンを確認する方法
「Generate Signed Bundle or APK」の設定画面で「V2 (Full APK Signature)」にチェックが入っている場合、V2バージョンであることを意味します。

java -jar [apksigner.jar Path] verify -v --print-certs [Apk’s Path before applying LIAPP]
このコマンドの結果で、「Verified using v2 scheme (APK Signature Scheme v2) : true」と表示されればV2、「false」と表示されればV1であることを意味します。
zipalign
重要なポイントとして、apksignerを使用する場合、zipalignはAPKファイルの署名前に実行する必要があります。
APKファイルをapksignerで署名した後に変更を加えると、署名が無効化されます。
そのため、必ずzipalignを署名前に実行してください。
zipalign -f -v 4 "zipalign前のAPKファイルのパス""zipalign後のAPKファイルの保存先"

Signing with apksigner
[ Windows ]
java -jar [APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-key-alias [ALIAS_NAME] [APK_FILE_PATH]
[ MAC ]
[APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-key-alias [ALIAS_NAME] [APK_FILE_PATH]
apksigner ツールは、Android SDK Build Tools のバージョン 24.0.3 以降で利用可能です。
以下の方法で確認できます。
1) Check SDK path in the Android Studio
Tool menu => SDK Manager => Android SDK Location path check
2) Check Apksigner file from the SDK directory
SDK Directory => build-tools directory =>buildToolsVersion directory =>lib directory =>check apksigner.jar file
In case of MAC, check apksigner file from the buildToolsVersion directory
Keystore password for signer #1:
キーストアのパスワードを入力する際、パスワードの文字は画面に表示されませんが、実際には入力されています。正しいキーストアのパスワードが入力されると、次のステップに進むことができます。キーストアのパスワードとキーパスワードが同じ場合、署名はすぐに進行します。キーストアのパスワードとキーパスワードが異なる場合は、キーパスワードを入力するように求められます。
Key "KEY_NAME" password for signer #1:
正しいキーパスワードが入力されると、署名が進行し、署名が完了すると「Signed.」というメッセージが表示されます。

–ks-pass pass:
と –key-pass pass:
オプションを使用すると、事前にパスワードを設定できます。このオプションを使用すると、パスワード入力を求めるメッセージは表示されず、パスワードが自動的に入力されます。[ Windows ]
java -jar [APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-pass pass:"keystore_password" --key-pass pass:"key_password" --ks-key-alias [ALIAS_NAME] [APP_FILE_PATH]
[ MAC ]
[APKSIGNER_PATH] sign -v --out [SAVED_APK_PATH] --ks [KEYSTORE_PATH] --ks-pass pass:"keystore_password" --key-pass pass:"key_password" --ks-key-alias [ALIAS_NAME] [APP_FILE_PATH]
Verify Signing
[ Windows ]
java -jar [APKSIGNER_PATH] verify -v --print-certs [APP_FILE_PATH]
[ MAC ]
[APKSIGNER_PATH] verify -v --print-certs [APP_FILE_PATH]
署名が正常に機能している場合、以下のように「Verified using v2 scheme (APK Signature Scheme v2): true」と表示されます。

zipalign & Signing with script file
[ Bat file for Window users]
[ Sh file for MAC users]
ファイルをダウンロードしたら、メモ帳やテキストエディタで開き、以下の内容を編集して保存してください。
KeyStorePath="Keystore Path"
ALIAS_NAME="Alias Name"
STORE_PASS="Keystore Password"
KEY_PASS="Key Password"
ZIP_ALIGN="zipalign file path"
APKSIGNER_PATH="apksigner file path"
zipalign と apksigner のファイルは、Android SDK がインストールされているパスの build-tools フォルダ内にあります。 パスワードを保存せずに入力したい場合は、--ks-pass と --key-pass に関連するオプションを削除する必要があります。
Windows ユーザーは、署名するアプリファイルを LIAPP_sign_window.bat ファイルにドラッグすると、すぐに実行されます。 MAC ユーザーは、スクリプトファイルとアプリファイルを順番にドラッグするか、以下のようにパスを入力して実行できます。
Ex. /Users/username/Downloads/LIAPP_apksign_mac.sh /Users/username/AndroidStudioProjects/MyApplication/app/release/app-release.apk
Ex. chmod +x /Users/username/Downloads/LIAPP_apksign_mac.sh
正常に実行されると、最初に zipalign が実行され、その後署名が行われます。 署名プロセス中に「Signed.」というメッセージが確認され、問題がなければ、署名を続行するために任意のキーを押してください。 完了したファイルは、ファイル名の後に _signed が追加されて保存されます。
apksigner と APK Signature Scheme を使用した署名に関する詳細については、以下のURLを参照してください。
apksigner : https://developer.android.com/studio/command-line/apksigner
app-signing : https://developer.android.com/studio/publish/app-signing
APK Signature Scheme : https://source.android.com/security/apksigning
LIAPP、最高のサービスを提供します。