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
