博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
adb 协议
阅读量:4207 次
发布时间:2019-05-26

本文共 2136 字,大约阅读时间需要 7 分钟。

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

转载地址:http://hvlli.baihongyu.com/

你可能感兴趣的文章
电脑开关那几个小插头怎么插
查看>>
解决Win7 64位玩游戏不兼容的问题
查看>>
inter处理器台电平板p90h3u6怎么完美root
查看>>
中国企业一扎堆 这个产业就完蛋!
查看>>
董宝珍:从股市总市值占GDP比例看本轮牛市的归宿
查看>>
神经性皮炎如何治疗
查看>>
君乐宝换奶粉方法
查看>>
如何办理提前还贷
查看>>
12种逼死“强迫症”的创意家居设计
查看>>
常用药列表
查看>>
宝宝生病
查看>>
各种皮肤病——谁用谁灵!
查看>>
上海房屋租赁合同登记备案证明办理流程
查看>>
持居住证能落户?子女还能在沪高考
查看>>
虚拟机(Vmware)怎么进入BIOS
查看>>
Teradata Table Type
查看>>
Teradata IDENTITY Column
查看>>
Teradata Explain
查看>>
Teradata 之top n与sample n
查看>>
用trim去掉字符串末尾的任意字符
查看>>