adb 協議


adb通信分為兩部分:adb client和adb server,以及adb server和adb daemon。

 client和server之間的通信協議

adb server對本地的tcp 5037號端口進行監聽,等待adb client的命令。client的每個命令都會包含兩個部分,前一部分固定4個字節,以十六進制方式指定命令部分的長度。后一部分是真正的內容。發送命令的接口為writex,並最終調用_fh_socket_write,通過send發送出去。因此這兩部分至少需要發送兩個tcp包。

例如想要獲取adb server的版本號,client首先連接本機的tcp 5037端口,然后發送“000C”和“host:version”。

server對client回復,分為如下情況

1、 成功,回復四字節串“OKAY”,后面跟的內容根據不同的命令而不同。

2、 失敗,回復四字節串“FAIL”,然后跟四字節的十六進制長度,以及失敗原因。

3、 對於host:version,回復4個字節的十六進制字串,代表server的內部版本號。

具體的命令如下。

命令

解釋

host:version

 

host:kill

停止server

host:devices

 

host:track-devies

 

host:emulator:<port>

 

host:transport:<serial-number>

連接指定serial-number的設備或者模擬器

host:transport-usb

連接usb上的設備,如果usb上有不止一個設備,會失敗。

host:transport-local

通過tcp方式連接模擬器,如果有多個模擬器在運行,會失敗。

host:transport-any

連接usb設備或者模擬器都可以,但是如果有超過一個設備或模擬器,會失敗。

host-serial:<serial-number>:<request>

host-usb:<request>

host-local:<request>

向指定的設備發送特定的請求。同樣如果存在多個設備的沖突,會失敗。

host:<request>

向當前連接的設備發送請求

<host-prefix>:get-serialno

獲取設備的serial-number

<host-prefix>:get-state

獲取設備狀態

<host-prefix>:forward:<local>;<remote>

 

下面這些命令僅僅用於已經連接到某個設備,即在上面命令使用成功,連接到特定設備后,向特定設備發送命令,操作特定設備。

 

命令

解釋

shell:command arg1 arg2 ...

在設備上執行命令行操作

shell:

參見commandline.c中的interactive_shell()

remount:

以讀/寫模式加載設備的文件系統

dev:<path>

為client打開設備上的特定路徑,用於讀寫問題。有可能由於權限問題而失敗。

tcp:<port>

嘗試從設備連接本主機的某個tcp端口

tcp:<port>:<server-name>

嘗試從設備連接特定主機名的某個tcp端口

local:<path>

嘗試連接設備上的特定路徑,路徑是UNIX域名形式

localreserved:<path>

localabstract:<path>

localfilesystem:<path>

嘗試連接設備上的特定路徑。

log:<name>

打開設備上的特定日志文件,以便讀取日志

framebuffer:

嘗試獲取framebuffer的快照。即涉筆的屏幕快照

dns:<server-name>

由serer執行來解析特定設備名

recover:<size>

更新設備的恢復鏡像

jdwp:<pid>

連接特定VM進程上面的JDWP線程

track-jdwp

 

sync:

同步設備和主機上的文件

 

 

關於命令內容以及回復信息的更詳細說明,參見adb源碼文件夾下的SERVICES.TXT。

 

 Transports

這個名詞用於代表server和設備或者模擬器之間的通信協議。包含如下兩種情況:

1、 USB transports。通過USB方式和物理設備通信。

2、 Local transports。通過本機的TCP連接方式和模擬器通信。

由此可以想到,其實可以通過TCP方式和其他機器上面的模擬器或者設備進行通信,但是這點還沒有實現。

transport層用於處理消息,每個消息包含24個字節的頭部,定義如下。

struct message {

   unsigned command;

   unsigned arg0;

   unsigned arg1;

   unsigned data_length;

   unsigned data_crc32;

   unsigned magic;

};

此部分具體內容參見protocol.txt。

參考文獻:

1、 adb源碼文件夾下OVERVIEW.TXT

2、 adb源碼文件夾下SERVICES.TXT

3、 adb源碼文件夾下protocol.txt


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM