PC パソコン

Android「APK signature verification failed」の原因と解決方法

AndroidでAPKをインストール、検証、配布しようとしたときに、「APK signature verification failed」や、APKの署名を検証できないというエラーが発生することがあります。

APK signature verification failed Signature verification failed ERROR: JAR_SIG_NO_SIGNATURES DOES NOT VERIFY

Androidでは、APKはインストールや更新の前にデジタル署名されている必要があります。Android公式ドキュメントでも、すべてのAPKは端末へインストールまたは更新する前に証明書で署名されている必要があると説明されています。 :contentReference[oaicite:0]{index=0}

「APK signature verification failed」は、単に署名されていない場合だけでなく、署名後にAPKを変更した、誤った鍵で署名した、APK Signature Schemeの検証に失敗した、zipalignと署名の順番を間違えた場合などにも発生します。

Android SDK Build Toolsには、APKの署名と検証専用のapksignerが用意されており、現在のAndroid公式ドキュメントではAPK署名にはapksignerを使用する方法が案内されています。 :contentReference[oaicite:1]{index=1}

この記事では、「APK signature verification failed」の原因と、apksigner verifyを使った確認方法、署名のやり直し、zipalignとの正しい順序、Keystoreや証明書の確認方法を解説します。

  1. 「APK signature verification failed」とは
  2. 代表的な発生状況
  3. 主な原因
    1. 1.APKが署名されていない
    2. 2.署名後にAPKを変更した
    3. 3.zipalignを署名後に実行した
    4. 4.署名処理そのものが失敗している
    5. 5.誤ったKeystoreで署名している
    6. 6.APKが破損している
    7. 7.古い署名方式だけで署名している
    8. 8.手動でjarsignerだけを使用している
  4. 確認手順1:apksigner verifyを実行する
  5. 確認手順2:詳細情報を表示する
  6. 解決方法1:APKを正しく署名し直す
  7. 解決方法2:署名済みAPKを別ファイルとして出力する
  8. 解決方法3:zipalignを署名前に実行する
  9. 解決方法4:署名後にAPKを変更しない
  10. 解決方法5:正しいKeystoreを使用する
  11. 解決方法6:Key Aliasを確認する
  12. 解決方法7:Store PasswordとKey Passwordを確認する
  13. 解決方法8:Android Studioから署名済みAPKを生成する
  14. 解決方法9:Gradle SigningConfigを確認する
  15. 解決方法10:未署名APKを間違えて配布していないか確認する
  16. 解決方法11:APKをもう一度ビルドする
  17. 解決方法12:証明書情報を確認する
  18. 解決方法13:既存APKとの署名証明書を比較する
  19. 解決方法14:APKコピー時の破損を確認する
  20. 解決方法15:CI/CDの後処理順序を確認する
  21. 解決方法16:apksignerの場所を確認する
  22. 解決方法17:Build Toolsを更新する
  23. 解決方法18:対象Androidバージョンを指定して検証する
  24. 解決方法19:警告もエラーとして確認する
  25. 解決方法20:jarsignerではなくapksignerを使う
  26. 署名後にAPKを編集するとどうなる?
  27. zipalignは署名前?署名後?
  28. APKが本当に署名されているか確認する方法
  29. 既存アプリの更新だけ失敗する場合
  30. Google Play App Signingを使っている場合
  31. 「APK signature verification failed」と「The APK is not signed」の違い
  32. 「APK signature verification failed」と署名不一致の違い
  33. 最短で原因を特定する手順
  34. それでも解決しない場合
  35. まとめ

「APK signature verification failed」とは

Android APKには、アプリの作成者とAPKの内容が改変されていないことを確認するためのデジタル署名が含まれます。

Android公式ドキュメントでは、apksignerはAPKを署名するだけでなく、そのAPKの署名が対象Androidプラットフォーム上で正しく検証されるか確認するためのツールとして提供されています。 :contentReference[oaicite:2]{index=2}

基本的な署名検証は次のコマンドで実行します。

apksigner verify app-release.apk

詳細情報を表示する場合は、

apksigner verify --verbose --print-certs app-release.apk

を使用できます。

ポイント:「インストールできない」だけで原因を推測するより、まずapksigner verifyでAPKそのものの署名状態を確認するのが最短です。

代表的な発生状況

  • adb installでAPKをインストールしたとき
  • 手動署名したAPKを検証したとき
  • Google Play以外のストアへAPKをアップロードしたとき
  • APKをzipalignしたあと
  • APK内部のファイルを編集したあと
  • APKを再圧縮したあと
  • 署名済みAPKへファイルを追加したあと
  • 古い署名ツールを使用したあと
  • 別のKeystoreで誤って再署名したあと
  • CI/CDで署名済みAPKを後処理したあと

主な原因

1.APKが署名されていない

Release APKを生成したもののSigningConfigが設定されていない場合、未署名APKが生成されることがあります。

未署名APKでは署名検証に失敗します。

2.署名後にAPKを変更した

非常に重要な原因です。

Android公式apksignerドキュメントでは、apksignerで署名したあとにAPKへ変更を加えると、その署名は無効になると明記されています。 :contentReference[oaicite:3]{index=3}

たとえば、署名後に、

  • APK内部へファイルを追加する
  • AndroidManifest.xmlを変更する
  • resources.arscを変更する
  • ZIPツールで再圧縮する
  • 別ツールで最適化する

と署名が壊れる可能性があります。

3.zipalignを署名後に実行した

Android公式ドキュメントでは、zipalignを使用する場合、APKを署名する前に実行するよう注意されています。 :contentReference[oaicite:4]{index=4}

正しい順序は、

未署名APK ↓ zipalign ↓ apksigner sign ↓ apksigner verify

です。

4.署名処理そのものが失敗している

Keystore、Alias、Passwordなどが間違っていると、APKへ正しい署名が追加されません。

5.誤ったKeystoreで署名している

APK自体の署名は有効でも、既存アプリとは異なる証明書で署名されている場合があります。

この場合、既存アプリの更新としてインストールすると署名不一致になります。

6.APKが破損している

ダウンロード、コピー、CI/CD成果物生成などの途中でAPKファイルが破損している場合、署名検証にも失敗することがあります。

7.古い署名方式だけで署名している

Androidでは複数のAPK Signature Schemeが利用されます。

対象Androidバージョンや署名ツールによって、必要な署名方式が正しく含まれていないと検証に問題が出る場合があります。

8.手動でjarsignerだけを使用している

現在のAndroid公式コマンドラインビルド手順では、APKを手動署名する場合はzipalignのあとにapksignerを使用します。App Bundleではjarsignerを使用できますが、APKではapksignerが案内されています。 :contentReference[oaicite:5]{index=5}

確認手順1:apksigner verifyを実行する

最初に次を実行します。

apksigner verify app-release.apk

Android公式ドキュメントでも、APKの署名検証には、

apksigner verify [options] app-name.apk

を使用します。 :contentReference[oaicite:6]{index=6}

確認手順2:詳細情報を表示する

apksigner verify --verbose --print-certs app-release.apk

--print-certsを付けると、APKの署名証明書情報を確認できます。 :contentReference[oaicite:7]{index=7}

正常なAPKでは、使用されている署名方式や証明書情報を確認できます。

解決方法1:APKを正しく署名し直す

Keystoreを使用する基本形は次のとおりです。

apksigner sign --ks release.jks app-release.apk

Android公式ドキュメントでも、Keystoreを指定した署名例としてこの形式が案内されています。 :contentReference[oaicite:8]{index=8}

署名後、必ず検証します。

apksigner verify --verbose --print-certs app-release.apk

解決方法2:署名済みAPKを別ファイルとして出力する

元ファイルを残したい場合は--outを使用します。

apksigner sign --ks release.jks --out app-signed.apk app-unsigned.apk

Android公式ドキュメントでは、--outを指定しない場合は入力APKをその場で署名し、元ファイルを上書きします。 :contentReference[oaicite:9]{index=9}

解決方法3:zipalignを署名前に実行する

手動署名する場合は、順番が重要です。

zipalign -v -p 4 app-unsigned.apk app-aligned.apk

次に署名します。

apksigner sign --ks release.jks --out app-release.apk app-aligned.apk

最後に検証します。

apksigner verify --verbose --print-certs app-release.apk

Android公式のコマンドラインビルド手順でも、zipalign → apksignerの順番が示されています。 :contentReference[oaicite:10]{index=10}

重要:apksignerで署名したあとにzipalignすると、APK内容が変更されて署名が無効になる可能性があります。

解決方法4:署名後にAPKを変更しない

署名済みAPKに対して次のような処理をしていないか確認します。

  • ZIPツールで展開・再圧縮
  • ファイル追加
  • Manifest編集
  • リソース置換
  • 独自の最適化処理
  • CI/CDでメタデータ追加

Android公式ドキュメントでは、apksignerによる署名後にAPKへ変更すると署名が無効になると明記されています。 :contentReference[oaicite:11]{index=11}

後処理が必要なら、その処理をすべて終えてから最後に署名してください。

解決方法5:正しいKeystoreを使用する

Keystore内容を確認します。

keytool -list -v -keystore release.jks

Alias、証明書フィンガープリントなどを確認し、想定している署名鍵か確認してください。

解決方法6:Key Aliasを確認する

Keystore内のAlias一覧を確認します。

keytool -list -keystore release.jks

複数の鍵が入っている場合は、apksignerで使用するAliasを明示します。

apksigner sign --ks release.jks --ks-key-alias release app-release.apk

解決方法7:Store PasswordとKey Passwordを確認する

Keystore Passwordや秘密鍵のPasswordが誤っていると、署名処理自体が正常に完了しません。

最初に、

keytool -list -v -keystore release.jks

でKeystoreを開けるか確認してください。

解決方法8:Android Studioから署名済みAPKを生成する

手動署名が不要なら、Android Studioから署名付きAPKを生成する方法が安全です。

Build → Generate Signed App Bundle or APK

Android公式ドキュメントでも、Android Studioから署名済みAPKやApp Bundleを作成する手順が案内されています。 :contentReference[oaicite:12]{index=12}

正しいKeystore、Alias、Passwordを指定して生成してください。

解決方法9:Gradle SigningConfigを確認する

Kotlin DSLの例:

android { signingConfigs { create("release") { storeFile = file("release.jks") storePassword = "STORE_PASSWORD" keyAlias = "release" keyPassword = "KEY_PASSWORD" } }
buildTypes {
    getByName("release") {
        signingConfig = signingConfigs.getByName("release")
    }
}

}

Release Build TypeへSigningConfigが割り当てられているか確認してください。

解決方法10:未署名APKを間違えて配布していないか確認する

ビルド成果物フォルダに、

app-release-unsigned.apk app-release.apk

など複数APKが存在する場合があります。

未署名版を誤って配布・検証していないか確認してください。

解決方法11:APKをもう一度ビルドする

破損が疑われる場合は、元のプロジェクトからAPKを再生成します。

macOS / Linux:

./gradlew clean ./gradlew assembleRelease

Windows:

gradlew.bat clean gradlew.bat assembleRelease

その後、生成されたAPKを再検証してください。

解決方法12:証明書情報を確認する

apksigner verify --print-certs app-release.apk

Android公式apksignerでは、--print-certsで署名証明書情報を表示できます。 :contentReference[oaicite:13]{index=13}

既存アプリの更新なら、以前のAPKと証明書フィンガープリントを比較してください。

解決方法13:既存APKとの署名証明書を比較する

旧APK:

apksigner verify --print-certs old-release.apk

新APK:

apksigner verify --print-certs new-release.apk

更新インストールの場合は、期待している署名鍵が使用されているか確認します。

解決方法14:APKコピー時の破損を確認する

同じAPKを別PCやCI/CDから取得したあとだけ検証に失敗する場合、転送途中の破損も確認してください。

SHA-256を比較できます。

Windows PowerShell:

Get-FileHash app-release.apk -Algorithm SHA256

macOS / Linux:

shasum -a 256 app-release.apk

Linux環境によっては、

sha256sum app-release.apk

も利用できます。

解決方法15:CI/CDの後処理順序を確認する

CI/CDでは次のような順番になっていないか確認してください。

Build ↓ Sign ↓ Modify APK ↓ Upload

これは署名破損につながります。

正しくは、

Build ↓ 必要なAPK処理 ↓ zipalign ↓ Sign ↓ Verify ↓ Upload

です。

解決方法16:apksignerの場所を確認する

apksignerはAndroid SDK Build Toolsに含まれます。

複数のBuild Toolsがある場合は、使用しているバージョンを確認してください。

Android公式ドキュメントでは、apksignerはBuild Tools 24.0.3以降で提供されています。 :contentReference[oaicite:14]{index=14}

解決方法17:Build Toolsを更新する

Android Studioで、

Tools → SDK Manager → SDK Tools → Android SDK Build-Tools

を確認し、プロジェクトで利用するBuild Toolsを更新します。

解決方法18:対象Androidバージョンを指定して検証する

apksigner verifyには--min-sdk-versionや--max-sdk-versionがあります。

たとえばAPI 23以降を対象に確認する場合:

apksigner verify --min-sdk-version 23 app-release.apk

Android公式ドキュメントでは、これらのオプションを利用して、指定したAndroidプラットフォーム範囲で署名が正常に検証されるか確認できます。 :contentReference[oaicite:15]{index=15}

解決方法19:警告もエラーとして確認する

厳密に確認する場合は-Werrを利用できます。

apksigner verify -Werr --verbose app-release.apk

Android公式ドキュメントでは、-Werrは警告をエラーとして扱うオプションです。 :contentReference[oaicite:16]{index=16}

解決方法20:jarsignerではなくapksignerを使う

APKへ手動署名する場合、現在のAndroid公式手順では、

zipalign ↓ apksigner

を使用します。 :contentReference[oaicite:17]{index=17}

jarsignerはApp BundleやJAR署名では利用できますが、APKの署名にはAndroid専用のapksignerを使用するほうが適切です。

署名後にAPKを編集するとどうなる?

署名はAPK内部の内容に対して計算されています。

そのため、署名後に1バイトでも署名対象部分が変更されると、検証結果が変わります。

Android公式apksignerドキュメントでも、署名後にAPKへ変更を加えると署名が無効になると明記されています。 :contentReference[oaicite:18]{index=18}

鉄則:APKへのすべての編集・最適化を完了してから、最後に署名してください。

zipalignは署名前?署名後?

署名前です。

Android公式ドキュメントでは、zipalignを使う場合、APKへ署名する前に実行するよう案内されています。 :contentReference[oaicite:19]{index=19}

正しい順番

zipalign
↓
apksigner sign
↓
apksigner verify

APKが本当に署名されているか確認する方法

次を実行します。

apksigner verify --verbose --print-certs app-release.apk

この1コマンドで、署名検証と証明書情報の確認を同時に行えます。

既存アプリの更新だけ失敗する場合

新規インストールはできるのに既存アプリからの更新だけ失敗する場合は、以前のAPKと新しいAPKで異なる署名鍵を使用している可能性があります。

両方を比較します。

apksigner verify --print-certs old.apk apksigner verify --print-certs new.apk

証明書情報が想定どおりか確認してください。

Google Play App Signingを使っている場合

Google Play App Signingでは、開発者が保持するUpload Keyと、Google Playが配信用APKへ使用するApp Signing Keyが分かれている場合があります。

Android公式ドキュメントでは、App BundleをGoogle Playへアップロードする場合でも、開発者はアップロード前にUpload KeyでApp Bundleを署名します。 :contentReference[oaicite:20]{index=20}

そのため、Play Consoleから配信されたAPKと、ローカルで作成したAPKの証明書が同じとは限りません。

「APK signature verification failed」と「The APK is not signed」の違い

「The APK is not signed」は署名が存在しないことを比較的直接示します。

一方、

APK signature verification failed

は、署名が存在していても内容変更や署名構造の異常によって検証できない場合にも発生します。

「APK signature verification failed」と署名不一致の違い

APK単体の署名検証が正常でも、既存アプリと別の証明書で署名されていれば更新インストールできません。

つまり、

APK単体の署名が有効 ≠ 既存インストールアプリと署名が一致

です。

最短で原因を特定する手順

  1. apksigner verify --verbose --print-certs app.apkを実行する
  2. 署名が存在するか確認する
  3. 署名後にAPKを変更していないか確認する
  4. zipalignを署名前に実行したか確認する
  5. 正しいKeystoreとAliasを使っているか確認する
  6. 必要ならAPKを再ビルドする
  7. apksigner signで署名し直す
  8. 最後にもう一度apksigner verifyを実行する

それでも解決しない場合

「APK signature verification failed」が続く場合は、次を確認してください。

  • APKが本当に署名されているか
  • apksigner verifyを実行したか
  • 署名後にAPKを変更していないか
  • zipalignを署名前に実行したか
  • 未署名APKを間違えて使用していないか
  • 正しいKeystoreを使用しているか
  • Key Aliasが正しいか
  • Store PasswordとKey Passwordが正しいか
  • Gradle SigningConfigがReleaseへ設定されているか
  • APKを再ビルドして確認したか
  • CI/CDで署名後の後処理がないか
  • APKファイルが転送中に破損していないか
  • Build Toolsとapksignerが古すぎないか
  • 既存APKと署名証明書が一致しているか

まとめ

Android「APK signature verification failed」は、APKのデジタル署名をAndroidが正しく検証できない場合に発生します。

最初に次を実行してください。

apksigner verify --verbose --print-certs app-release.apk

Android公式ドキュメントでは、apksigner verifyによって、APKの署名が対象Androidプラットフォーム上で正常に検証されるか確認できます。 :contentReference[oaicite:21]{index=21}

署名し直す場合は、

apksigner sign --ks release.jks --out app-release.apk app-aligned.apk

を使用します。

手動署名の正しい順序は、

zipalign ↓ apksigner sign ↓ apksigner verify

です。Android公式のコマンドラインビルド手順でもこの順序が示されています。 :contentReference[oaicite:22]{index=22}

また、Android公式apksignerドキュメントでは、署名後にAPKへ変更を加えると署名が無効になると明記されています。 :contentReference[oaicite:23]{index=23}

したがって、APK編集、最適化、zipalignなど必要な処理をすべて完了し、最後に署名、その直後に検証するのが最も安全な方法です。