ByteScope

adb shell 指令參考

值得知道的 adb shell 指令,一個指令一頁——語法、範例、輸出怎麼讀,以及我們哪個工具已經幫你跑了它。

檔案不會離開你的瀏覽器 — 全部在本機處理。

← 回到 Web ADB Toolkit

一個指令一頁:語法、值得複製的範例、逐欄說明輸出代表什麼,以及連到本站那個會幫你執行它的工具。

從你自己的機器上就在前面加 adb shell,在裝置的 shell 裡就直接打。

套件(pm)

活動與 intent(am)

系統服務(dumpsys)

設定提供者

輸入與觸控

畫面與擷取

檔案與空間

系統與紀錄

關於這個工具

這是一份針對「你隔著一條 USB 線真的會用到」的指令參考:套件管理員、活動管理員、值得 dump 的那些 dumpsys 服務、設定提供者、輸入與畫面相關的指令,以及 Android 內建的那幾個 shell 工具。一個指令一頁,每頁都有語法、2 到 4 個不是教科書式的範例、逐欄說明輸出代表什麼,以及——如果存在的話——連到本站那個會幫你執行指令並解析回應的瀏覽器工具。

為什麼還要再做一份 adb 參考

因為大多數都是把說明文字抄一遍,而說明文字不會告訴你:Android 的 du 數的是向上取整的 1024 位元組區塊而不是檔案大小、df -hdf -H 從輸出上分不出來、在 Android 12 上 pm clear --cache-only 會把整個 app 清光、getevent 的 tracking id 是 ffffffff 代表手指離開螢幕,或是 dumpsys battery 的溫度是十分之一度而 dumpsys thermalservice 印的是單純的浮點數。上面每一件都是那種會生出「看起來很合理但是錯的」答案的錯誤,而它們全都寫在對應的頁面上——因為我們在寫 Web ADB 這些工具的解析程式時全都踩過。

Android 的 shell 工具是 toybox 而不是 GNU

topdfdufind 都是 toybox 的實作,而去讀 GNU 的手冊頁而不是 toybox 的原始碼,是把它們搞錯最可靠的方法。find -size +100 既不是 100 個位元組也不是 100 MB;top 被排序的那一欄外面包著方括號,而那個括號會黏到隔壁的欄位上;TIME+ 數的是總分鐘數,所以兩小時的 CPU 時間會印成 120:00.00。這四個指令的頁面寫的是程式碼裡真正的行為,以及你該加上哪個旗標來消除歧義。

破壞性的指令都標出來了,並附上回頭的路

會改變裝置的指令都帶著一個等級,以及一段點名「確切用哪個指令還原」的說明:pm uninstall -k --user 0cmd package install-existing 還原、pm disable-userpm enable 還原、wm sizewm density 由各自的 reset 還原,而 settings put 只能靠你在寫入之前讀到的那個值還原。有三個指令完全沒有回頭路——沒加 --cache-onlypm clearrm,以及沒加 -k 的解除安裝——那些頁面把這件事寫在第一段而不是註腳裡。Android 沒有垃圾桶。

每一頁在有對應工具時也會連過去:套件相關的指令連到 debloat 工具,dudffinddiskstats 連到空間分析,dumpsys battery 連到電池頁,getevent 連到感測器測試。我們沒有工具在跑那個指令的時候,那一頁就什麼都不寫,而不是硬湊一個連結——一份會誇大的參考,遲早會讓人不再相信。

常見問題

這些指令需要 root 嗎?

幾乎都不用。這份參考裡的東西都以 `shell` 使用者(uid 2000)的身分執行,也就是在開了開發者選項與 USB 除錯的手機上,`adb shell` 會給你的權限。這個使用者可以針對自己的 Android 使用者列出與移除套件、讀取大多數 `dumpsys` 服務、寫入設定提供者、注入輸入、擷取畫面,以及讀取共用儲存空間。它做不到的是讀取其他 app 的私有資料(唯一的例外是對以可除錯方式出貨的 app 使用 `run-as`),以及碰 `/data/anr`——這正是當機那一頁改用 `dumpsys dropbox` 的原因。

為什麼同樣的指令在我的手機上行為不一樣?

有兩個各自獨立的原因,而這份參考試著把它們分開。有些行為是版本相關、而且查得到的:`pm list packages` 的 `-U` 是 Android 8.0 才有、`--cache-only` 是 Android 13、`find -printf` 是 Android 11。其餘的是廠商改動,而咬得最兇的地方是 `dumpsys`——一份 dump 的文字就是那個服務的作者最後想印什麼,而廠商既會改它、也會把自己的改動往回移植。屬於這種情況的地方,頁面會寫「格式會變」,而不是假裝某一種形狀才是正統。

把這些指令直接貼進終端機安全嗎?

唯讀的那些是安全的。任何標示為會改變裝置的,先讀它旁邊那段說明:那裡寫了什麼會改變,以及哪個指令能反過來。兩個習慣就能解決大部分問題——每個路徑與網址都用單引號包起來,因為一個空白或一個沒引號的 `&` 會改變 shell 實際執行的東西;還有一次指令只給一個確切目標而不是萬用字元,這樣出錯的代價是一個檔案而不是一整棵目錄樹。

可以改用瀏覽器來跑嗎?

很多都可以。本站的 Web ADB 工具從 Chromium 系的桌面瀏覽器透過 WebUSB 和手機對話,不需要安裝 SDK,也不會把任何東西上傳到任何地方——這裡的頁面會連到那個會執行它所描述指令的工具。限制是誠實的:WebUSB 只支援 Chromium 系而且只有桌面版;同一時間只有一個程式能持有 ADB 介面(所以桌面的 `adb server` 要先停掉);而 `adb forward` 與 `adb reverse` 在瀏覽器裡不可能,因為網頁開不了 TCP 的接聽端。