為什麼APK檔案需要簽章?
每個 Android 應用程式在安裝之前都必須經過數位簽署。簽名有幾個目的:
- 驗證應用程式開發者的身份
- 確保APK未被篡改
- 允許 Android 將應用程式更新與原始版本相匹配
- 需要在所有 Android 裝置上安裝
需要桌面工具
APK 簽章需要命令列工具(JDK / Android SDK)。這無法在網頁瀏覽器中完成。請按照以下指南在您的計算機上簽署 APK。
方法一:使用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
第三步:驗證簽名
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
第四步: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
簽章工具比較
| 指標 | apk簽名者 | 賈西格納 |
|---|---|---|
| V1簽名 | ||
| V2簽名 | ||
| V3簽名 | ||
| 受到推崇的 | 遺產 |
APK 簽名者 — 常見問題
有關 APK 簽章、金鑰庫和 Android 程式碼簽章的常見問題
為什麼對齊順序(zipalign 在 apksigner 之前)在 Android 11-15 上很重要
開發人員和修改者在簽署修改或合併的 APK 時最常犯的錯誤之一是運行 zipalign 後 簽署包,或使用 Java 的舊版 jarsigner 實用程式而不是 Google 的 Android SDK apksigner。由於 APK 簽章方案 v2 和 v3 在 ZIP 存檔的整個二進位佈局上計算加密哈希,因此在簽章後使用 zipalign 修改位元組偏移量會立即使 v2/v3 簽章區塊失效。
從 Android 11(API 等級 30)開始,並在 Android 14 和 15 上嚴格執行,PackageManager 對於任何針對現代 SDK 等級的 APK 都需要兩個不可協商的條件:
- 未壓縮的 4 位元組對齊 resources.arsc: 編譯的資源表 (resources.arsc) 必須以未壓縮的方式儲存 (STORED) 並在 4 位元組邊界上對齊,以便 Android 可以直接對其進行記憶體映射 (mmap),而無需將其複製到 RAM 中。始終執行 zipalign -p -f -v 4 input.apk aligned.apk 前 簽章。
- 強制 v2+ 簽名區塊: 使用 jarsigner(僅寫入 v1 META-INF/ 簽章)對針對 API 30+ 的 APK 進行簽章將導致 Android 11-15 拒絕使用 INSTALL_PARSE_FAILED_NO_CERTIFICATES 進行安裝。使用上面的互動式命令產生器為您的金鑰庫建立準確的 apksigner --v2-signing-enabled=true 命令,或在我們的 APK簽名驗證器 中驗證您的簽章輸出。