Android 調試橋 (adb) 是一種功能多樣的命令行工具,可讓您與設備進行通信。adb 命令可用於執行各種設備操作(例如安裝和調試應用),並提供對 Unix shell(可用來在設備上運行各種命令)的訪問權限。它是一種客戶端-服務器程序,包括以下三個組件:
- 客戶端: 用於發送命令。客戶端在開發計算機上運行。您可以通過發出 adb 命令來從命令行終端調用客戶端。
- 守護進程 (adbd): 在設備上運行命令。守護進程在每個設備上作爲後臺進程運行。
- 服務器: 管理客戶端和守護進程之間的通信。服務器在開發機器上作爲後臺進程運行。
adb 下載與安裝:
如果經常使用
adb
工具,強烈建議把 adb 運行路徑配置到系統的運行環境中
- 如果你安裝了
android
開發環境,那麼你可以直接打開Android sdk
的安裝路徑,找到文件夾android_sdk/platform-tools/
,就可以找到adb.exe
,然後通過命令行模式使用adb
命令了; - 當然也支持下載
adb
獨立程序,請點擊下載;下載完成後解壓並進入目錄即可;
adb 工作原理
當啓動某個 adb 客戶端時,客戶端會先檢查是否有 adb 服務器進程正在運行。如果沒有,它將啓動服務器進程。服務器在啓動後會與本地 TCP 端口 5037 綁定,並監聽 adb 客戶端發出的命令 - 所有 adb 客戶端均通過端口 5037 與 adb 服務器通信。
C:\Users\admin>adb start-server
* daemon not running; starting now at tcp:5037
* daemon started successfully
然後,服務器會與所有正在運行的設備建立連接。它通過掃描 5555 到 5585 之間(該範圍供前 16 個模擬器使用)的奇數號端口查找模擬器。服務器一旦發現 adb 守護進程 (adbd),便會與相應的端口建立連接。請注意,每個模擬器都使用一對按順序排列的端口 - 用於控制檯連接的偶數號端口和用於 adb 連接的奇數號端口。例如:
模擬器 1,控制檯:5554
模擬器 1,adb:5555
模擬器 2,控制檯:5556
模擬器 2,adb:5557
依此類推
如上所示,在端口 5555 處與 adb 連接的模擬器與控制檯監聽端口爲 5554 的模擬器是同一個。
服務器與所有設備均建立連接後,您便可以使用 adb 命令訪問這些設備。由於服務器管理與設備的連接,並處理來自多個 adb 客戶端的命令,因此您可以從任意客戶端(或從某個腳本)控制任意設備。
在設備上啓動 ADB 調試
想要連接 Android 設備並使用adb
命令必須在設備的系統設置中啓用USB調試
(位於開發者選項下)
在搭載 Android 4.2 及更高版本的設備上,開發者選項
屏幕默認情況下處於隱藏狀態。如需將其顯示出來,請依次轉到設置
> 關於手機
,然後點按版本號
七次。返回上一屏幕,在底部可以找到開發者選項
進入該頁面打開USB調試
即可。
部分機型還要修改
USB連接方式
爲傳輸文件
模式,纔可以正常連接
通過 adb 服務連接 Android 設備
通常連接 Android 設備我們都是通過 USB 數據線進行連接,這是被大家周知的;在確保設備打開了調試模式的前提,連接設備後計算機會自動檢測 usb 驅動進行適配連接,然後屏幕右下角會給出相對應的彈窗提示;
然後使用命令行終端進行連接狀態查看:adb devices
(如果沒有把adb.exe
配置到系統的環境變量中操作檯會提示‘沒有 adb 命令’等類似錯誤信息,那就只能切換到adb.exe
所在目錄再試,例如命令行輸入cd d:/sdk/platform-tools/
)
C:\Users\admin>cd /d d:\adb\
D:\adb> adb devices
UYT7N17A28000401 device
除了線連以外還可以使用wlan
的方式進行連接,需要在通過 USB 完成一些初始設置後通過 WLAN 使用 adb:
- 將 Android 設備和 adb 主機連接到這兩者都可以訪問的同一 WLAN 網絡。請注意,並非所有接入點都適用;您可能需要使用防火牆已正確配置爲支持 adb 的接入點。
- 如果您要連接到 Wear OS 設備,請關閉與該設備配對的手機上的藍牙。
- 使用 USB 數據線將設備連接到主機。
- 設置目標設備以監聽端口 5555 上的 TCP/IP 連接。
adb tcpip 5555
- 拔掉連接目標設備的 USB 數據線。
- 找到 Android 設備的 IP 地址。例如,對於 Nexus 設備,您可以在設置 > 關於平板電腦(或關於手機)> 狀態 > IP 地址下找到 IP 地址.
- 通過 IP 地址連接到設備。
adb connect 192.168.***.***
- 確認主機連接狀態:
adb devices
如果連接過程中斷開了,在確保設備和連接計算機在同一網絡中後,可以使用adb connect [*:port]
進行重新連接,如果還沒有解決問題,那就重置一下 adb 服務 adb kill-server
(與啓動服務相對應start-server
,注意沒有’restart-server’操作)重新開始 adb 連接流程
常用的 adb 命令 [更多詳細命令](https://developer.android.google.cn/studio/command-line/adb.html#-t-option 官方介紹)
adb --help
有問題找助手
-
adb start-server
啓動 adb 服務 -
adb kill-server
停止 adb 服務,通常與adb start-server
聯合做重啓服務使用 -
adb reboot [bootloader | recovery]
重啓 Android 設備(刷機模式|恢復模式)注意:由於很多品牌商對系統的修改的原因刷機模式
可能不能正常啓動 -
adb pull <device> <host>
拉取 Android 設備上的文件到本地主機,注意本地文件路徑不能是根目錄,例如:adb pull -s WOSWRKP799999999 /sdcard/storage/user.txt d:/adb/
-
adb push <host> <device>
複製本地主機文件並推送到 Android 設備,如果指定目標文件名已經存在會替換已有文件,例如:adb push d:/adb/hello.png /sdcard/temp.png
-
adb devices [-l]
查看連接 adb 服務的設備列表,參數-l
僅返回在線設備 -
adb -s <WOSWRKP799999999> [command]
如果主機連接有多臺設備,想要給指定的設備發命令請用-s
指定該設備的標識,如果多設備時沒有使用-s
的話 adb 會報錯 s -
adb install [options] <**.apk>
使用install
進行安裝指定路徑的 apk 文件;
options
可以包含:-r
重新安裝當前 apk 文件,保留已有數據-t
允許安裝測試 apk 文件-g
授權所有清單文件
-
adb unistall [-k] <package>
使用uninstall
進行指定包名卸載,參數-k
清除文件 -
adb shell dumpsys package <package>
查看 app 的相關信息重要,重要
連接 shell
adb shell
使用 shell 命令通過 adb 發出設備命令,也可以啓動交互式 shell;(連接設備 shell)連接後簡單理解直接在 Android 設備上使用命令行,這時就可以使用一些unix
的命令,當然會有很多命令是不能執行的,因爲它們被廠商閹割
掉了,這種閹割
在不同廠商、不同版本的表現還不一致,還有一些是因爲 Android 內核的安全策略限制引起的;可以使用adb shell ls /system/bin
進行查看可以使用的unix
命令
對於
shell
的操作可以一條一條的進行執行,例如:adb shell pwd
,adb shell ls
,adb shell ...
,也可以直接進入shell
然後統一操作
如果要退出shell
界面,可以使用ctrl + d
使用exit
命令也可以
注意:部分需要有 root 權限纔可以執行
調用 Activity 管理器(am)
瞭解更多請點擊
出命令以執行各種系統操作,如啓動 Activity、強行停止進程、廣播 intent、修改設備屏幕屬性,等等
am <command [options]>
是shell
內部命令,需要結合adb shell
進行使用,例如:
adb shell am start -a android.intent.action.VIEW
start [options] <intent>
啓動由’intent’指定的 Activity-d
啓動調試功能-S
:在啓動 Activity 前,強行停止目標應用--start-profiler <file>
:啓動分析器並將結果發送至 file。
startService [options] <intent>
啓動由’intent’指定的 servicebroadcast [options] <intent>
發出廣播 intent。force-stop <package>
強行停止與 package 相關的進程kill <package>
終止與 package 相關的進程,僅終止可安全終止且不會影響用戶體驗的進程kill-all
終止所有後天進程monitor --gdb
開始監控崩潰/anrdumpheap <process> <file>
轉儲 process 的堆,存入到 fileprofile start <process> <file>
開始分析進程並保存到日誌profile stop <process>
停止分析進程instrument [options] <component>
使用 Instrumentation 實例啓動監控。通常情況下,目標 component 採用 test_package/runner_class 格式。
調用軟件包管理器(pm)
瞭解更多請點擊
在 adb shell 中,您可以使用軟件包管理器 (pm) 工具發出命令,以對設備上安裝的應用軟件包執行操作和查詢。
pm <command [options]>
也是shell
內部命令,也是需要結合adb shell
進行使用,例如:
adb shell pm uninstall -k <package> // 使用包管理器卸載指定的包名應用
-
list package [options] <filter>
輸出所有軟件包,或者,僅輸出軟件包名稱包含 filter 中的文本的軟件包。-s
:進行過濾以僅顯示系統軟件包。-3
:進行過濾以僅顯示第三方軟件包。-e
:進行過濾以僅顯示已啓用的軟件包.-d
:進行過濾以僅顯示已停用的軟件包。-i
:查看軟件包的安裝程序。
adb shell pm list packages -3 -i com.tencent adb shell pm list packages | grep com.tencent
-
list permission-groups
輸出所有已知的權限組 -
install [options] <**.apk>
同上 -
uninstall -k <package>
卸載指定的包名的應用 -
clear <package>
清除指定包名的應用的所有數據,與剛安裝完的狀態相同
查看系統信息
adb shell dumpsys meminfo <package>
查看當前包運行的內存情況
查系統日誌
logcat [options]
可以獲取到系統的日誌信息,需要結合adb shell
進行使用
詳細請點擊
-b
log 模塊有個緩存的概念,默認開啓main
,system
,和crash
三個緩存域,但是華爲 mate10 默認並沒有加載crash
,這個緩存域有一個策略週期性清除-c
清除(清空)所選的緩衝區並退出,默認緩衝區集爲 main、system 和 crash。要清除所有緩衝區,請使用 -b all -c。f </sdcard/file>
把當前日誌或緩存域日誌信息報存到文件-s [TAG:property]
設置日誌過濾條件,在 Android 打印的使用:
Log.e(TAG,'content') // 日誌級別分爲'v':'verbose','d':'debug','i':'info','w':'warn','e':'error'
adb shell logcat -s SplashActivity:E -f /sdcard/log.txt // 打印`Log.e()`的日誌信息
打印的格式是 date time process_id-thread-id/package-name log-level/TAG: content
,在設置過濾的時候通過-s
控制TAG
和日誌級別
例如:W/MainActivity
要符合*:TAG
,其中級別分別對應原生級別大寫首字母:V
,I
,D
,W
,E
-S
在輸出中包含統計信息,以幫助您識別和定位日誌垃圾信息發送者。-P <whiteList ~blackList>
設置日誌過濾的白名單和黑名單,白名單"list" 就是進程 pid 及 uid ,黑明單就是前面加上"~"
調用設備政策管理器 (dpm)
adb shell dpm <command>
爲便於開發和測試設備管理(或其他企業)應用,您可以向設備政策管理器 (dpm) 工具發出命令。使用該工具可控制活動管理應用,或更改設備上的政策狀態數據。
由於用到的比較少,瞭解更多請點擊
截取屏幕圖片
screencap /sdcard/.../**.png
命令是一個用於對設備顯示屏截取屏幕截圖的 shell 實用程序,例如:
$adb shell
shell@ $ screencap /sdcard/screen.png
shell@ $ exit
$adb pull /sdcard/screen.png d:/adb/
錄製視頻
screenrecord [options] /sdcard/.../**.mp4
命令是一個用於錄製設備(搭載 Android 4.4(API 級別 19)及更高版本)顯示屏的 shell 實用程序。該實用程序將屏幕 Activity 錄製爲 MPEG-4 文件。
注意:在很多真機上面改命令被移除或者改名了,比如在
華爲Mate10 /system/bin
目錄下是沒有這個可執行程序的
-
--help
幫助 -
--size <width>*<height>
設置視頻的分辨率,默認是 1280*720 -
--time-limit <time>
設置視頻最大時長,以秒爲單位,默認值和最大值均爲 180s(3 分鐘) -
--bit-rate <rate>
設置視頻的比特率(MB/s),默認 4M/s,例如設置 6M/s:screenrecord --bit-rate 6000000 /sdcard/demo.mp4
-
--verbose
打印錄製相關信息
例如:
$adb shell
shell@ $ screenrecord --size 1920*1080 --time-limit 30 --verbose /sccard/video.mp4
shell@ $ exit
$adb pull /sdcard/video.mp4 d:/adb/
sqlite
sqlite3
可啓動用於檢查 sqlite 數據庫的 sqlite 命令行程序。它包含用於輸出表格內容的 .dump 以及用於輸出現有表格的 SQL CREATE 語句的 .schema 等命令。
瞭解詳細sqlite3 相關命令
注意:在很多真機上該命令都被移除或者改名了,比如在
華爲Mate10
目錄下是沒有這個可執行程序的
$adb shell
shell@ $ sqlite3 /data/data/com.example/databases/test.db // 真機通常會被系統權限控制拒絕訪問
shell@ $ .tables
shell@ $ CREATE TABLE test(id INT(4) AUTO_INCREMENT PRIMARY KEY,name VARCHAR(30) NOT NULL,...)