adb 协议

来源:互联网 发布:网络成瘾的课件 编辑:程序博客网 时间:2024/06/06 15:00

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

0 0
原创粉丝点击