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