APK ファイルに署名が必要なのはなぜですか?
すべての Android アプリは、インストールする前にデジタル署名する必要があります。署名にはいくつかの目的があります。
- アプリ開発者の身元を確認します
- APK が改ざんされていないことを確認します
- Android がアプリのアップデートを元のアップデートと一致させることができます
- すべての Android デバイスにインストールするために必要です
デスクトップツールが必要です
APK 署名にはコマンドライン ツール (JDK / Android SDK) が必要です。これは Web ブラウザでは実行できません。以下のガイドに従って、コンピューター上で APK に署名します。
方法 1: apksigner を使用して署名する (推奨)
apksigner は Google の公式 APK 署名ツールであり、Android SDK Build Tools に含まれています。
ステップ 1: キーストアを生成する
keytool -genkey -v -keystore my-release-key.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias my-key-alias
ステップ 2: APK に署名する
apksigner sign --ks my-release-key.jks \
--ks-key-alias my-key-alias \
--out signed-app.apk unsigned-app.apk
ステップ 3: 署名を検証する
apksigner verify --verbose signed-app.apk
方法 2: jarsigner を使用して署名する (レガシー)
# Sign
jarsigner -verbose -sigalg SHA256withRSA \
-digestalg SHA-256 \
-keystore my-release-key.jks \
app-unsigned.apk my-key-alias
# Verify
jarsigner -verify -verbose app-signed.apk
ステップ 4: Zipalign (重要!)
署名後、zipalign を使用して APK を最適化します。
zipalign -v 4 signed-app.apk aligned-app.apk
デバッグ署名 (テスト用)
テスト目的では、デフォルトの Android デバッグ キーストアを使用できます。
# Location of debug keystore:
# Linux/Mac: ~/.android/debug.keystore
# Windows: C:\Users\{USERNAME}\.android\debug.keystore
# Sign with debug key
apksigner sign --ks ~/.android/debug.keystore \
--ks-key-alias androiddebugkey \
--ks-pass pass:android \
app.apk
署名ツールの比較
| 項目 | apksigner | ジャーシグナー |
|---|---|---|
| V1 署名 | ||
| V2 署名 | ||
| V3 署名 | ||
| 推奨 | 遺産 |
APK 署名者 — よくある質問
APK 署名、キーストア、Android コード署名に関するよくある質問
Android 11 ~ 15 でアライメント順序 (apksigner の前の zipalign) が重要な理由
変更またはマージされた APK に署名するときに開発者やモッダーが犯す最も頻繁な間違いの 1 つは、パッケージに署名する zipalign 後 を実行するか、Google の Android SDK apksigner の代わりに Java の従来の jarsigner ユーティリティを使用することです。 APK 署名スキーム v2 および v3 は ZIP アーカイブのバイナリ レイアウト全体の暗号ハッシュを計算するため、署名後に zipalign でバイト オフセットを変更すると、v2/v3 署名ブロックが直ちに無効になります。
Android 11 (API レベル 30) 以降、Android 14 および 15 に厳密に適用されるようになった PackageManager では、最新の SDK レベルを対象とする APK に対して 2 つの譲れない条件が必要になります。
- 非圧縮 4 バイト アライメント resources.arsc: コンパイルされたリソース テーブル (resources.arsc) は、Android が RAM にコピーせずに直接メモリ マップ (mmap) できるように、非圧縮で保存し (STORED)、4 バイト境界に配置する必要があります。 zipalign -p -f -v 4 input.apk aligned.apk 前に 署名を常に実行します。
- 必須の v2+ 署名ブロック: API 30 以降を対象とする APK に jarsigner (v1 META-INF/ 署名のみを書き込む) で署名すると、Android 11 ~ 15 は INSTALL_PARSE_FAILED_NO_CERTIFICATES でのインストールを拒否します。上記の対話型コマンド ジェネレーターを使用して、キーストア用の正確な apksigner --v2-signing-enabled=true コマンドを構築するか、APK署名検証ツール で署名された出力を確認します。