文章目錄

開發 Android App 或測試別人給的 APK 時,常用 adb install 從電腦直接安裝到手機。安裝失敗時,終端機會在 Failure 後面的方括號裡印出一串 INSTALL_FAILED 開頭的代碼,代碼名稱就說明了原因,冒號後面有時還有補充說明。只要對照代碼,就能知道該解除安裝、換一個 APK,還是加上安裝參數。
測試環境是 Windows 11、Android SDK Platform-Tools 37.0.1(adb 1.0.41),手機是 Samsung Galaxy S8(Android 9、API 28、arm64-v8a)。測試用的 APK 是我自己建置的範例,分別觸發下表的每一種錯誤。
錯誤代碼對照表
下圖是其中兩種錯誤的輸出,版本較舊的 APK 只印出代碼,簽章不同的 APK 則在冒號後面補充說明了原因:

下表的每個代碼都在 Galaxy S8 上重現過,依方括號裡的代碼找到對應的一列:
| 錯誤代碼 | 原因 | 處理方式 |
|---|---|---|
INSTALL_FAILED_UPDATE_INCOMPATIBLE |
套件名稱相同,但簽章和已安裝的版本不同,例如 debug 版與正式版 | 先 adb uninstall 套件名稱 再安裝 |
INSTALL_FAILED_VERSION_DOWNGRADE |
APK 的版本號比手機上已安裝的版本舊 | 先 adb uninstall 套件名稱 再安裝,可除錯(debuggable)的 App 也可以加 -d |
INSTALL_FAILED_TEST_ONLY |
APK 標記為只供測試 | 加上 -t 再安裝 |
INSTALL_FAILED_OLDER_SDK |
APK 要求的 Android 版本比手機新 | 改用 Android 版本夠新的手機,或取得支援這支手機的 APK |
INSTALL_FAILED_NO_MATCHING_ABIS |
APK 內含原生程式,但都不是手機 CPU 支援的架構 | 改用含有手機支援架構的 APK |
INSTALL_PARSE_FAILED_NO_CERTIFICATES |
APK 沒有簽章 | 用 apksigner 簽章後再安裝 |
INSTALL_PARSE_FAILED_NOT_APK |
檔案內容不是 APK | 重新取得 APK 檔 |
adb uninstall 會連同 App 的資料一起刪除,手機上有要保留的資料時,先在 App 裡備份或匯出再執行。終端機印出 failed to stat 而沒有代碼時,代表指令裡的 APK 路徑不存在,先切換到 APK 所在的資料夾再執行。
查詢手機的版本與架構
INSTALL_FAILED_OLDER_SDK 與 INSTALL_FAILED_NO_MATCHING_ABIS 要先知道手機的狀態才能判斷。下面三個指令分別查詢 API 版本、CPU 架構與已安裝 App 的版本號,最右欄是 Galaxy S8 的結果:
| 要查的事 | 指令 | Galaxy S8 的結果 |
|---|---|---|
| Android 的 API 版本 | adb shell getprop ro.build.version.sdk |
28 |
| 支援的 CPU 架構 | adb shell getprop ro.product.cpu.abilist |
arm64-v8a,armeabi-v7a,armeabi |
| 已安裝 App 的版本號 | adb shell dumpsys package 套件名稱 |
輸出中的 versionCode=2 minSdk=21 targetSdk=28 |
INSTALL_FAILED_OLDER_SDK 的補充說明會寫成 Requires newer sdk version #30 (current version is #28),#30 是 APK 要求的最低 API 版本,#28 是手機目前的版本。INSTALL_FAILED_NO_MATCHING_ABIS 則要換成架構清單裡任一種的 APK,S8 可以裝 arm64-v8a、armeabi-v7a 或 armeabi 的版本。
和安裝錯誤有關的參數
Android 官方的 adb 文件列出了 adb install 可以加的參數,和上面的錯誤有關的三個實測結果如下:
| 參數 | 官方說明 | 實測結果 |
|---|---|---|
-r |
覆蓋安裝已經存在的 App,保留資料 | adb 1.0.41 不加 -r 重裝同一個 APK 也會成功 |
-t |
允許安裝只供測試的 APK | 加上後 INSTALL_FAILED_TEST_ONLY 的 APK 安裝成功 |
-d |
允許安裝版本號較舊的 APK | S8 上只有可除錯的 App 加 -d 能降版,不可除錯的 App 仍然回報 INSTALL_FAILED_VERSION_DOWNGRADE |
總結
adb install 失敗時,先看方括號裡的代碼判斷是簽章、版本、架構還是檔案本身的問題,再照對照表解除安裝、換 APK 或加上參數。實測在 Galaxy S8 上重現的 7 種代碼,都能從代碼名稱與補充說明對應到原因。
