概念
-
ADB 是 Android 平臺的 調試橋接協議,允許主機(PC)與 Android 設備通信。
-
通過 ADB,開發者可以執行命令、調試應用、傳輸文件、訪問 shell、調試 logcat 等。
-
ADB 運行在 USB 或 TCP/IP 上,但最常用的是 USB 連接。
USB 層實現
-
USB 模式:ADB 依賴 USB CDC 或自定義 USB Interface(Android Device Class)實現。
-
端點類型:通常使用 Bulk IN / Bulk OUT 端點傳輸數據。
-
Bulk OUT:主機發送數據到設備
-
Bulk IN:設備發送數據到主機
-
-
USB 描述符:ADB 設備在 USB 枚舉階段提供自定義接口描述符,標識它支持 ADB 服務。
ADB 協議層
ADB 協議主要由 四種消息類型組成,每條消息長度固定(24 字節 header + 可選 payload):
-
CNXN(Connect)
-
建立 ADB 連接,初始化主機和設備之間的會話。
-
-
AUTH(Authentication)
-
認證主機和設備,確保安全通信。
-
使用 RSA 公鑰進行簽名驗證。
-
-
OPEN / OKAY / CLSE(Channel Management)
-
管理邏輯通道,每個應用或服務可使用不同 channel ID。
-
OPEN:打開新 channel
-
OKAY:確認 channel 已打開或接收數據
-
CLSE:關閉 channel
-
-
WRTE(Write Data)
-
用于在 channel 上傳輸實際數據。
-
設備或主機將數據寫入 channel 對應緩沖區,并等待 OKAY 確認。
-
數據傳輸流程
-
USB 枚舉:設備連接 PC,枚舉 USB 設備,識別 ADB 接口。
-
連接建立:主機發送 CNXN 消息,設備響應 CNXN。
-
認證:如果需要,設備發送 AUTH 消息進行公鑰認證。
-
通道管理:主機請求打開 channel(OPEN),設備返回 OKAY。
-
數據傳輸:主機或設備通過 WRTE 發送數據,接收方返回 OKAY 確認。
-
通道關閉:數據傳輸完成后發送 CLSE 關閉 channel。
ADB 特點
-
多路復用:ADB 支持多個 channel 并行傳輸(例如 shell、文件傳輸、調試端口)。
-
可靠傳輸:通過 ACK/OKAY 確保數據可靠送達。
-
基于 USB Bulk 傳輸:確保大數據量傳輸穩定。
-
安全機制:通過 RSA 公鑰認證防止未授權主機訪問設備。
應用場景
-
調試應用(adb logcat, adb shell)
-
文件傳輸(adb push / pull)
-
遠程安裝 APK(adb install)
-
Bootloader 或 Recovery 模式調試
-
跨平臺開發和設備自動化測試
當你啟動某個 adb 客戶端時,該客戶端會先檢查是否有 adb 服務器進程正在運行,如果沒有,它會先啟動服務器進程,服務器在啟動后會與本地 TCP 端口 5037 綁定,并監聽 adb 客戶端發出的命令(所有 adb 客戶端均通過端口 5037 與 adb 服務器通信)
然后,服務器會與所有正在運行的設備建立連接,它通過掃描 5555 到 5585 之間(該范圍供前 16 個模擬器使用)的奇數號端口查找模擬器,服務器一旦發現 adb 守護程序 (adbd),便會與相應的端口建立連接,請注意,每個模擬器都使用一對按順序排列的端口(用于控制臺連接的偶數號端口和用于 adb 連接的奇數號端口)例如
模擬器 1,控制臺:5554
模擬器 1,adb:5555
模擬器 2,控制臺:5556
模擬器 2,adb:5557
依此類推
-
我們通過Android Studio工具或者命令行界面直接或間接的調用某個adb命令,比如adb install或者adb devices
-
這時候adb進程會fork出一個子進程作為adb server,而這個fork出的進程將常駐PC端,監聽來自Client端的請求
-
adb server查找當前連接的真機或者模擬器,并接收來自Client端發出的請求
-
adb server處理請求:如果是本地能直接處理的請求比如:adb devices就直接處理,如果是本地處理不了的請求就會轉發給連接的真機或者模擬器來進行處理,可以通過數據線和TCP/IP的方式通信
-
位于真機或者模擬器后臺的adbd進程接收到請求后,通過JDWP協議轉發給對應的Java虛擬機進程處理
-
adbd將處理后的結果返回給adb server
-
adb server再將結果返回給Client,這時候我們就在命令行界面中看到展示結果了
基本使用方法
-
安裝ADB:在電腦上安裝Android SDK,其中包含了ADB工具。確保將其添加到系統環境變量中,以便在命令行中直接訪問。
-
連接設備:通過USB將Android設備連接到電腦。確保設備開啟了開發者選項和USB調試模式。
-
識別設備:在命令行中輸入
adb devices
,如果設備正確連接,會顯示設備的序列號。 -
安裝應用:使用
adb install <應用路徑>
命令,可以安裝應用到設備上。 -
查看日志:通過
adb logcat
命令,可以查看設備的日志信息。 -
無線連接:通過
adb tcpip 5555
命令,可以將設備從USB模式切換到無線模式,通過TCP/IP進行連接。之后可以使用adb connect <設備IP>
進行連接。 -
安裝APK:除了從本地文件系統安裝APK,還可以從網絡下載并安裝APK。使用
adb shell wget <APK URL>
命令即可。 -
清除應用數據:使用
adb uninstall <應用包名>
命令可以卸載應用,但如果你想保留應用及其數據,可以使用adb uninstall -k <應用包名>
命令。 -
截屏和錄屏:使用
adb shell screencap <截圖路徑>
可以截取設備的屏幕,而adb shell screenrecord <錄屏路徑>
則可以錄制屏幕。 -
管理權限:使用
adb shell pm grant <應用包名> <權限名稱>
可以為應用添加權限,使用adb shell pm revoke <應用包名> <權限名稱>
則可以移除權限。 -
模擬按鍵事件:使用
adb shell input keyevent <鍵值>
可以模擬按鍵事件,如模擬按下Home鍵、電源鍵等。 -
文件管理:使用
adb pull <設備路徑>
可以從設備上拉取文件,使用adb push <源路徑> <目標路徑>
則可以將文件推送到設備上 -
調試服務:使用
adb shell service list
可以查看設備上可用的服務列表,使用adb shell service <服務名稱> <操作>
可以對服務進行操作。 -
安裝測試腳本:可以使用
adb shell sh <腳本路徑>
來運行存儲在設備上的腳本文件。 -
查看電池狀態:使用
adb shell dumpsys batterystats
可以查看電池的詳細使用情況。 四、常見問題與解決方案 -
設備未正確連接:檢查USB連接是否穩定,重新插拔USB線或更換USB端口嘗試。確保設備開啟了開發者選項和USB調試模式。
-
ADB未識別設備:嘗試重啟ADB服務,或在命令行中輸入
adb kill-server
后再次嘗試連接設備。確保驅動程序已正確安裝。 -
應用安裝失敗:檢查APK文件是否完整無損,嘗試使用不同的APK安裝工具或重新下載APK文件。
-
日志輸出異常:檢查日志輸出是否被其他程序干擾,或嘗試重啟設備和電腦后再查看日志。
-
無線連接問題:確保設備已開啟無線調試功能,并正確輸入驗證碼進行連接。
-
權限問題:檢查應用的權限是否正確配置,或嘗試使用root權限執行相關操作。
-
其他問題:查看ADB的錯誤提示信息,根據提示查找解決方案或查閱相關文檔和論壇獲取幫助。 總結:ADB是一個強大且靈活的工具,通過掌握其基本原理和使用方法,開發者可以更高效地進行Android開發與調試。通過不斷實踐和探索高級技巧,可以更好地應對各種復雜的問題和需求。