pm uninstall
破壞性移除套件,或只針對一個 Android 使用者移除——這是不用 root 也能處理掉預載 app 的方法。
- 指令
- adb shell pm uninstall
- 指令
- 套件(pm)
- 風險
- 破壞性
語法
pm uninstall [-k] [--user <id>] <package>旗標與參數
| token | 意義 |
|---|---|
| -k | 保留 app 的資料與快取目錄。移除之所以能還原,靠的就是它。 |
| --user <id> | 只從一個 Android 使用者移除。對預載 app 來說,這是不用 root 唯一可行的形式:APK 還留在系統映像裡,只是對那個使用者而言 app 不存在了。 |
範例
pm uninstall com.example把側載的 app 連資料一起完整移除。
pm uninstall -k --user 0 com.manufacturer.bloat把預載 app 從主要使用者移除,保留資料以便還原。
cmd package install-existing --user 0 com.manufacturer.bloat上一行的解藥:把 app 對那個使用者恢復回來。
輸出怎麼讀
輸出範例
Success只有一個字。成功訊息就是 `Success`;失敗是 `Failure [<原因>]`,括號裡才是重點——`DELETE_FAILED_INTERNAL_ERROR`,或那個使用者本來就沒裝時的 `Failure [not installed for 0]`。別只信這一行,事後用 `pm list packages -u` 把狀態讀回來。
輸出欄位
| 欄位 | 意義 |
|---|---|
| Success | 套件已從你詢問的使用者移除。 |
| Failure [<reason>] | 什麼都沒移除。括號裡是平台自己的代碼。 |
| Failure [not installed for 0] | 那個使用者本來就沒有這個套件——這常常是答案,不是錯誤。 |
需要什麼權限
一條授權過的 `adb` 連線就夠,前提是你走 `--user` 那個形式。把預載 app 從某個 Android 使用者移除之所以不用 root,正是因為沒有任何東西離開系統映像:APK 還留在廠商放它的位置,只是那個使用者眼中這個套件不存在了,這也是事後 `cmd package install-existing --user 0 <pkg>` 能把它裝回來的原因。真正需要特權的是「把住在唯讀系統分割區上的套件整個移掉」,而那會被直接拒絕,不會做到一半。開發人員選項裡沒有任何開關能解開這件事,正式版上 `adb root` 也用不了,所以被拒絕時該做的是換一條指令,而不是去找開關。平台在刪除本身檢查的是哪一個權限,這個 repo 沒有查證;查證過的是回覆的形狀——這也是 Android Debloat Tool 事後把套件清單重讀一次、而不是相信那一行字的原因。
失敗訊息對照
| 訊息 | 意義 |
|---|---|
| Failure [DELETE_FAILED_INTERNAL_ERROR] | 套件管理員拒絕了這次刪除,而且沒給更多細節。`runUninstall` 把括號裡的原因原封不動傳出來,所以這是平台自己的用字,不是誰的詮釋。第一個要排除的是:套件在唯讀的系統映像上,而你沒帶 `--user`。哪些狀況對應到哪個括號代碼,這個 repo 沒有在實機上確認過。 |
| Failure [not installed for 0] | 什麼都沒移除,因為那個使用者本來就沒有這個套件。這常常是答案而不是錯誤——一次已經成功的移除再跑第二次就會印這個。要定案就重讀 `pm list packages -u`,用 `-k` 移掉的東西在那份清單裡還在。 |
| Exception occurred while executing 'uninstall': | 外層抓到 `Throwable`,下一行才會說是什麼。`classifyPmUninstall` 只要看到這種橫幅就判定失敗,就算旁邊還印著 `Success` 也一樣,因為兩者同時出現的那一次,不是可以回報成功的一次。 |
會改變什麼,以及怎麼回頭
`pm uninstall --user 0 <pkg>` 會把 app 從那個使用者移除。加上 `-k` 會保留它的資料,之後可以用 `cmd package install-existing --user 0 <pkg>` 裝回來;不加 `-k` 資料就沒了,只能重新從 APK 安裝。用這招移掉系統元件可能讓手機停在初始設定過不去,那時只剩恢復原廠設定一條路。所以要一個一個判斷,不要整批來。
版本與廠商注意事項
- 用 `-k` 移除後,套件會出現在 `pm list packages -u` 但不在預設清單裡。這個差異是找出「哪些還能還原」唯一可靠的方法。
- 改寫過成功訊息的廠商版本,會讓一次成功的移除看起來像失敗。能定案的是把套件清單重讀一次。
這個我們有 UI
Android Debloat Tool 會透過 USB 執行這個指令並解析回應——只要 Chromium 系瀏覽器,不必安裝 SDK,也不會上傳任何東西。
相關指令
和 pm uninstall 會在同一次作業裡出現的指令。
| 指令 | 做什麼 |
|---|---|
| pm list packages | 列出已安裝的套件,也能一次帶出 APK 路徑、uid、版本碼與安裝來源。 |
| pm disable-user | 在不移除的前提下,把套件對某個 Android 使用者關掉——比解除安裝安全,而且確定能還原。 |
| pm clear | 清除某個 app 的資料——在 Android 13 之後也可以只清快取。 |
| dumpsys package | 套件管理員知道的一切:版本、路徑、flags、安裝來源,以及每個使用者的狀態。 |
其他套件(pm)指令
| 指令 | 做什麼 |
|---|---|
| pm path | 印出組成某個已安裝套件的 APK 檔絕對路徑。 |
| pm trim-caches | 要求系統一直丟掉快取檔案,直到剩下你指定的空間為止。 |
| pm install | 安裝一個已經在裝置上的 APK,也就是 `adb install` 底層在做的事。 |
| pm install-create | 開一個安裝工作階段,讓 base 與它的 split 作為一個不可分割的整體一起安裝。 |
這些行為是在撰寫 Web ADB 工具背後的解析程式時,對照 AOSP、toybox 與核心原始碼查證的。真的會因 Android 版本或廠牌而異的地方,這一頁會直接說明,而不是給你一個在半數手機上都是錯的數字。