ByteScope

Android Storage Analyzer

找出手機空間被什麼吃掉——經由 USB 線,用的是 adb 的權限,不是清理 app 的權限。

這頁的每個大小都是手機自己量的,經 USB 線讀回來。檔案、檔名、目錄清單一律不會上傳。

正在檢查瀏覽器支援…

關於這個工具、FAQ 與相關工具

關於這個工具

把 Android 手機用 USB 接上 Chromium 系瀏覽器,這頁就會量出空間跑去哪了。它讀 dumpsys diskstats 取得整個磁碟區的分解(app、app 資料、快取、照片、影片、音訊、下載、系統),把 app 別大小跟 pm list packages 對照,讓每一列都標明是系統 app 還是你自己裝的,對 /sdcarddu 並畫成可以往下鑽的 squarified treemap,另外提供四個獨立掃描:大檔案、留在 Downloads 的 APK、空資料夾,以及你到底揹著幾 GB 的截圖。手機上不裝任何東西,也不上傳任何東西——大小都是手機自己量的,只是經由線讀回來。

為什麼 adb 看得到清理 app 看不到的東西

這不是方便的問題,是權限的問題,也是 Play 商店上那些清理工具悄悄失效的原因。清*別的* app 的快取需要 CLEAR_APP_CACHE,它從 Android 6 起就是 privileged 權限,所以已安裝的 app 再也不能幫你釋放快取。scoped storage 讓 app 無法列出 /sdcard/Android/data,而那正是解除安裝的 app 留下殘骸的地方,所以 SD Maid 當年出名的孤兒資料掃描,在 2026 年的 app 身上根本做不到。第三方 app 也完全無法移除預載 app。adb shellshell 使用者執行,沒有這些限制:它讀得到框架自己的統計、走得進共用儲存、也動得了找到的東西。瀏覽器只是介面,權限來自 ADB。

這些數字的意思,包括它們對不上的地方

dumpsys diskstats 有兩半,來源不同,這頁絕不把它們混在一起。總容量與可用空間是當下的 StatFs 呼叫。類別大小與 app 別大小來自 diskstats_cache.json,Android 大約一天才重寫一次——所以剛刷機或剛重開的手機還沒有那一半,而任何手機上它都可能舊了一天。兩者因此永遠不會剛好相等。已用空間多於類別合計時,差額會畫成獨立且有標籤的一段;類別聲稱的比磁碟區報告的已用還多時,則寫成一條說明。我們不會為了讓長條好看而重新縮放、截斷或悄悄四捨五入。其他部分同一套規矩:du 碰到權限不足就把那行報告出來,app 別區段的平行陣列長度對不上時顯示說明而不是一份看起來很合理的表,而孤兒掃描在拿來對照的套件清單不完整時,連清單都不會給。

刪除刻意跟掃描分開

刪東西和量東西是兩回事,程式也照這個分別去寫。刪除只動掃描器找到的路徑:這頁沒有讓你自己打路徑的欄位,也加不上去——因為授權一次 rm 所需的那個內部憑據,只有在解析掃描結果的過程中才生得出來。每次刪除都會把完整清單原原本本列兩次,動手前再回頭讀一次手機上的每一個路徑:只要有一個檔案的大小或時間戳跟掃描當下不一樣,整批就取消,不會刪到一半。真的刪的時候是一個路徑一道指令,所以結果也是一個檔案一個檔案回報——刪掉了、被拒絕(附上手機自己的說法)、還是本來就不在。一道指令刪四十個檔案只會回一個結果,你根本不知道哪一個還活著。Android 沒有垃圾桶,ADB 也沒有還原,刪掉就是真的沒了;還原中心會列出這個瀏覽器刪過什麼,並且明講這些操作沒有解藥。

從另一頭過來:Web ADB Toolkit 的 hub 放著裝置儀表板與其他工具,APK Analyzer 則讓你在決定安裝前先看清安裝檔要什麼權限、有多大。

常見問題

為什麼 Play 商店的清理 app 做不到這些?

因為 Android 把權限收走了。清別的 app 的快取需要 `CLEAR_APP_CACHE`,那是 privileged 權限,一般 app 拿不到。列出解除安裝的 app 留下資料的 `/sdcard/Android/data`,被 scoped storage 擋住。移除預載 app 對第三方 app 來說完全不可能。`adb shell` 沒有這些限制——所以這件事要靠一條線,而不是靠安裝一個 app。

類別大小和可用空間應該要加得起來嗎?

不會,而且真實手機上永遠不會。可用空間是當下量的;類別與 app 別大小來自 Android 大約一天重寫一次的快取。這頁把差額畫成獨立的一段(快取那半聲稱得比磁碟區報告的已用還多時,則寫成說明),不會為了湊齊而縮放各段。剛刷機的手機完全沒有快取那一半,這時頁面會直接說明,而不是畫一條空長條。

可以掃 /sdcard/Android/data 找孤兒 app 資料嗎?

會試,而且會告訴你結果如何。`adb shell` 能不能列出那個目錄,各 Android 版本與各廠牌行為不一,所以三個區域各自報告:列得出來、列得出來但是空的、列不出來。讀得到但是空的會被標記出來,而不是報告成「沒東西可清」——因為 Android 11 以後,從外面看到的限制就長這樣。

會自動刪掉東西嗎?

沒有任何東西會自己跑——掃描不會,刪除更不會。`du` 走訪與四個 `find` 掃描都要你按下按鈕才跑,因為它們會走上幾萬個檔案,那要花手機的電力與反應速度。勾選只是把項目加進清單,不會送出任何指令。刪除需要另外按一次、看過每一個路徑的完整清單、勾選「我了解後果」、等兩秒倒數,然後在動手前重讀手機上的每一個路徑——只要掃描之後有東西變動就整批中止。唯一按一下就跑的是 `pm trim-caches`,那是請 Android 釋放它本來就當成可丟棄的快取檔,不會動到 app 的資料,也沒有東西會損失。

支援哪些瀏覽器和手機?

桌面版 Chrome 或 Edge,因為 WebUSB 只有 Chromium 有;Firefox 和 Safari 完全開不了 USB 裝置。手機要在開發者選項裡打開 USB 偵錯,而在 Windows 上它的 ADB 介面通常要用 Zadig 裝 WinUSB 驅動——連線失敗時這頁會一步步帶你做。macOS、Linux、ChromeOS 都不需要驅動。

treemap 可以用鍵盤或螢幕閱讀器操作嗎?

可以——canvas 從來不是唯一的呈現方式。同一份 `du` 資料也是一個真正的表格,每個資料夾一顆按鈕,所以每個方塊都能用 Tab 走到、也能被螢幕閱讀器讀出來,麵包屑同樣是一排按鈕。窄螢幕上 treemap 的格子小到點不到,所以預設就是清單檢視,而且頁面會算出並顯示有幾格小於那個尺寸。