正在檢查瀏覽器支援…
無線除錯(透過 Wi-Fi 的 adb)
把手機的 ADB daemon 切到 TCP 連接埠 5555,並產生給桌機終端機用的連線指令。兩台機器要在同一個網路,而這個切換在手機重開機後就沒了。
adb tcpip 5555接上手機才能用這一節。上面那條指令在任何 shell 裡都能用。
截圖
用手機自己的 screencap 拍一張 PNG,以原始解析度透過線傳回來。有 DRM 保護的內容會是全黑,因為合成器不會把那些畫面交給任何人。
screencap -p接上手機才能用這一節。上面那條指令在任何 shell 裡都能用。
傳送文字與按鍵
往手機上目前有焦點的地方打字,用的是平台給 adb 的同一個 input text。長密碼、URL、不想用拇指輸入的測試資料都很好用。
input text 'hello world'
input keyevent 3接上手機才能用這一節。上面那條指令在任何 shell 裡都能用。
Deep link 測試器
對一個 URL 發出 VIEW intent,讀回有沒有東西接手、哪個 activity 贏了、啟動花了多久。query string 會完整送到:那些 & 是給手機的,不是給 shell 的。
am start -W -a android.intent.action.VIEW -d 'myapp://open/item/42'接上手機才能用這一節。上面那條指令在任何 shell 裡都能用。
假造螢幕尺寸與密度(wm size)
讓手機假裝自己是另一塊螢幕,這是在真機上看不同斷點版面最便宜的方法。斷點反應的是 dp——像素乘 160 再除以 dpi——所以每個預設檔都同時設兩個值。
wm size 1080x2340
wm density 420
wm size reset
wm density reset接上手機才能用這一節。上面那條指令在任何 shell 裡都能用。
開發者開關
把手機開發者選項裡的開關搬出來,不用點過六層選單:動畫速度、顯示觸控、指標位置、不保留 activity、強制從右到左的版面。
settings put global window_animation_scale 0.0
settings put system show_touches 1接上手機才能用這一節。上面那條指令在任何 shell 裡都能用。
裝置 proxy(mitmproxy、Charles、Fiddler)
把手機的 HTTP 堆疊指向你機器上的 proxy,就是每份抓包教學開頭那段接線的一行版。清除只要按一下,而它是這一節的第一顆按鈕,這是刻意的。
settings put global http_proxy 10.0.0.5:8080
settings put global http_proxy :0接上手機才能用這一節。上面那條指令在任何 shell 裡都能用。
系統屬性(getprop)
整張屬性表——通常超過一千筆——可以搜尋,而回答「這是什麼裝置」的那十五筆釘在最上面。你在這裡打的字不會到手機上:搜尋是在這個分頁裡做的。
getprop接上手機才能用這一節。上面那條指令在任何 shell 裡都能用。
可除錯 app 的資料庫
列出 debug 版 app 私有資料目錄裡的 SQLite 檔並取出一個,不需要 root。這是 run-as 真正有用的那一半:shell 讀不到 app 的資料,但 app 自己的 uid 讀得到,而 run-as 會把那個 uid 借你用一條指令。
run-as com.example.app ls -l databases
run-as com.example.app cat 'databases/app.db'接上手機才能用這一節。上面那條指令在任何 shell 裡都能用。
最近的當機與 ANR
讀 DropBoxManager——平台自己那個「出了什麼事」的環形緩衝:app 當機、ANR、原生當機、Log.wtf 與 kernel 的 tombstone,都帶著時間。
dumpsys dropbox
dumpsys dropbox --print data_app_crash接上手機才能用這一節。上面那條指令在任何 shell 裡都能用。
螢幕錄影
錄影跟鏡射放在同一頁而不是這裡,因為兩者都是關於螢幕,而且 screenrecord 有一份實作比兩份安全——那個程序必須在每一條路徑上都被停掉,否則它會在沒人看的情況下一直編碼。
screenrecord --time-limit 180 --bit-rate 20000000 /sdcard/out.mp4瀏覽器用 ADB 做不到的事
這不是一張等著被實作的功能清單。這些是平台或瀏覽器沙箱讓它不可能的事,在你開始找繞法之前,值得先知道原因。
- adb forward / adb reverse
連接埠轉發需要一個 TCP listener,而網頁不可能是。任何瀏覽器的分頁都沒有伺服器 socket,這是設計如此——也就是說你機器上的 localhost:8080 沒有東西可以指。這一項留給桌機的 adb。
- adb backup / adb restore
adb backup 在 Android 12 被標為棄用,而更早之前多數 app 就用 allowBackup=false 退出了,所以它在現代手機上產出的是一個幾乎空的封存檔。真正要的檔案,用檔案瀏覽器取出。
- fastboot
fastboot 是另一個 USB 介面上的另一套協定,說話的是 bootloader 而不是 Android。它可以用 WebUSB 實作,但 ADB 那條路徑的程式碼一點都用不上,所以它該是獨立的工具,而不是這裡的一個勾選框。
- input text (non-ASCII)
input text 只能產生虛擬鍵盤按鍵對照表裡有的字元,也就是可列印的 ASCII。這是平台指令本身的限制:桌機的 adb 一樣打不出中文。
- adb root / su
adb root 只在 eng 或 userdebug 版本上有用,而 su 只存在於 root 過的手機。這個頁面上的一切都是照著兩者都沒有來設計的,這也是其中某些功能會禮貌地拒絕的原因。
這個頁面上其他所有東西,都是在一支市售手機上、只把 USB 除錯打開、透過普通的 ADB shell 執行的,沒有任何要安裝的東西。