adb install 失敗:INSTALL_FAILED 錯誤代碼的原因與處理方式

摘要

用 adb install 把 APK 裝到 Android 手機失敗時,終端機只會印出一串 INSTALL_FAILED 開頭的代碼,而代碼名稱就說明了失敗的原因,例如版本比手機上的舊、簽章和已安裝的版本不同,或手機的 Android 版本太舊。只要對照代碼就能知道該解除安裝、換一個 APK 還是加上安裝參數。

文章目錄

開發 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 則在冒號後面補充說明了原因:

adb install app-v1.apk 失敗並顯示 INSTALL_FAILED_VERSION_DOWNGRADE,adb install app-v3-other-key.apk 失敗並顯示 INSTALL_FAILED_UPDATE_INCOMPATIBLE 與簽章不符的補充說明

下表的每個代碼都在 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 種代碼,都能從代碼名稱與補充說明對應到原因。

延伸閱讀

Ted Liou

Ted Liou

現役軟體工程師,分享 Unity 與 AI 的技術開發經驗,也提供諮詢。

留言