pm trim-caches
會改變裝置要求系統一直丟掉快取檔案,直到剩下你指定的空間為止。
- 指令
- adb shell pm trim-caches
- 指令
- 套件(pm)
- 風險
- 會改變裝置
語法
pm trim-caches <free space target>[K|M|G]旗標與參數
| token | 意義 |
|---|---|
| <target> | 希望留下的空間。後綴是 1024 的次方,所以 `512G` 是 512 GiB,比任何手機都大——這是「把你願意丟的都丟掉」的寫法。 |
範例
pm trim-caches 512G把系統認為可丟的快取全部釋放。
pm trim-caches 2G空間到 2 GiB 就停。
輸出怎麼讀
什麼都沒有。成功就是沒有輸出:它等平台做完,然後什麼都不印就返回,而且它不會回報釋放了多少——連「有沒有釋放到東西」都不會說。唯一誠實的「幫你空出 N MB」是用 `df` 或 `dumpsys diskstats` 前後各量一次。只要有任何輸出就是拒絕:後綴不合法、少了數字,或這個版本沒把所需權限給 shell 而拋出例外。
輸出欄位
| 欄位 | 意義 |
|---|---|
| (no output) | trim 執行了。釋放多少不會回報。 |
| Invalid suffix: … | 大小參數看不懂。 |
| Error: expected number at: … | 大小參數不是數字。 |
需要什麼權限
一條授權過的 `adb` 連線,其他都不用:`android16-release` 分支的 `packages/Shell/AndroidManifest.xml` 宣告了 `CLEAR_APP_CACHE`,正是 `freeStorageAndNotify` 檢查的那個權限。不用 root、不用 `adb root`、沒有開發人員選項要開,也沒有逐個 app 的授權。有意思的是這個權限買不到什麼。`runTrimCaches` 帶著 `StorageManager.FLAG_ALLOCATE_DEFY_ALL_RESERVED` 呼叫 `freeStorageAndNotify`,在觀察者上等到它做完,然後回傳 0,從頭到尾沒看過 `obs.result` 一眼——shell 使用者被允許問,但永遠不會被告知答案。整份拒絕的版本還是看得出來,因為外層印出的例外會打破「安靜等於成功」這條規則;但一個給了權限卻什麼都沒釋放的版本,和釋放了一 GB 的版本長得一模一樣。前後各量一次剩餘空間——Android Storage Analyzer 就是這樣做的——是唯一能拿到誠實數字的路。
失敗訊息對照
| 訊息 | 意義 |
|---|---|
| Invalid suffix: | `runTrimCaches` 自己解析大小參數,遇到不認識的後綴就印這個,後面接著你打的字。什麼都沒 trim。乘法也在同一個解析器裡,而它算的是 1024 的次方,所以就算後綴它收,意思也可能和硬碟廠商講的不一樣。 |
| Error: expected number at: | 參數根本不是數字——最常見的是參數順序寫反,或延續 `pm clear` 的習慣在指令後面打了套件名稱。什麼都沒跑。跟這裡每一種拒絕一樣,判斷方式很簡單:這個指令印出了任何東西。 |
| Exception occurred while executing 'trim-caches': | 外層抓到從 `freeStorageAndNotify` 丟出來的 `Throwable` 並倒出堆疊追蹤;沒把 `CLEAR_APP_CACHE` 給 shell 使用者的版本就是這一類。`classifyTrimCaches` 把所有非空輸出都當成拒絕,而在「成功本身沒有任何正面訊號」的情況下,這是唯一安全的讀法。 |
會改變什麼,以及怎麼回頭
刪的是快取檔,不是使用者的資料:帳號、存檔、下載內容都不會動,每個 app 下次啟動時會自己重建需要的東西。沒有什麼需要還原的,也沒有指令能還原——回頭的路就是繼續使用那些 app,快取自然會補回來。你會感覺到的是代價:快取補回來之前,app 開啟與重新載入會比較慢。而且這個指令不會回報釋出了多少,要知道請在前後各用 `df` 或 `dumpsys diskstats` 量一次剩餘空間。
版本與廠商注意事項
- 決定什麼可丟的是系統而不是你。哪些 app 的快取會被丟、依什麼順序丟,都是這個指令無法影響的平台政策。
- 後綴按 1024 的次方解讀,所以 `1G` 是 1 GiB 而不是 1 000 000 000 個位元組。
這個我們有 UI
Android Storage Analyzer 會透過 USB 執行這個指令並解析回應——只要 Chromium 系瀏覽器,不必安裝 SDK,也不會上傳任何東西。
相關指令
和 pm trim-caches 會在同一次作業裡出現的指令。
| 指令 | 做什麼 |
|---|---|
| pm clear | 清除某個 app 的資料——在 Android 13 之後也可以只清快取。 |
| dumpsys diskstats | 每個分割區的剩餘空間、一次磁碟寫入延遲的實測,以及一份快取起來的各 app 空間用量。 |
| df | 回報每個已掛載檔案系統的剩餘與已用空間。 |
| du | 回報一棵目錄樹占掉多少磁碟空間。 |
其他套件(pm)指令
| 指令 | 做什麼 |
|---|---|
| pm list packages | 列出已安裝的套件,也能一次帶出 APK 路徑、uid、版本碼與安裝來源。 |
| pm path | 印出組成某個已安裝套件的 APK 檔絕對路徑。 |
| pm uninstall | 移除套件,或只針對一個 Android 使用者移除——這是不用 root 也能處理掉預載 app 的方法。 |
| pm disable-user | 在不移除的前提下,把套件對某個 Android 使用者關掉——比解除安裝安全,而且確定能還原。 |
| pm install | 安裝一個已經在裝置上的 APK,也就是 `adb install` 底層在做的事。 |
| pm install-create | 開一個安裝工作階段,讓 base 與它的 split 作為一個不可分割的整體一起安裝。 |
這些行為是在撰寫 Web ADB 工具背後的解析程式時,對照 AOSP、toybox 與核心原始碼查證的。真的會因 Android 版本或廠牌而異的地方,這一頁會直接說明,而不是給你一個在半數手機上都是錯的數字。