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

本文共 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://gakci.baihongyu.com/

你可能感兴趣的文章
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>
Brackets安装及常用插件安装
查看>>
Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
查看>>
fastcgi_param 详解
查看>>
Nginx配置文件(nginx.conf)配置详解
查看>>
标记一下
查看>>
IP报文格式学习笔记
查看>>
autohotkey快捷键显示隐藏文件和文件扩展名
查看>>
Linux中的进程
查看>>
学习python(1)——环境与常识
查看>>
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
自然计算时间复杂度杂谈
查看>>
当前主要目标和工作
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
一文看清HBase的使用场景
查看>>
解析zookeeper的工作流程
查看>>
搞定Java面试中的数据结构问题
查看>>
慢慢欣赏linux make uImage流程
查看>>