老李推荐:第4章1节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览 2

II. 协议详情


1. 客户端<->服务器端协议


以下是对ADB客户端和ADB服务器自身之间通信所用到的协议的详细描述。ADB服务器监听的TCP端口是localhost:5037。

客户端会使用下面的格式往ADB服务器发送服务请求:

  1. 一个包含指定服务请求数据长度的4字节的16进制字串

  2. 紧跟着该4个字节的就是服务请求数据自身

比如,为了查询ADB服务器的内部版本号,客户端会做以下的动作:

  1. 连接到ADB服务器监听的本地Socket端口tcp:localhost:5037

  2. 发送一个服务请求字串”000Chost:version”到上面对应的Socket

‘host:’这个前缀是用来指示该服务请求是一个主机请求,是一个放松给ADB服务器自身的请求(往下我们会讨论其他的一些类型的请求)。为了方便调试,请求内容长度是以ASCII码的方式进行编码的。

ADB服务器应该用以下格式中的一个对客户端的服务请求进行应答:

  1. 如果服务请求成功,返回一个4字节的”OKAY”字串

  2. 如果服务请求失败的话,返回结果字串的前面是由一个4字节的”FAIL”字串组成,紧跟着该字串后面的是一个代表后面的数据长度的4字节的十六进制数,最后紧跟着的就是描述错误原因的字串内容。

  3. 作为一个例外,对于’host:version’这个服务请求,返回的结果将是一个对应ADB服务器内部版本号的4字节的十六进制字串。

需要注意的是,在服务请求完成,且ADB服务器已经回应了OKAY这个成功代表服务请求成功的应答后,ADB服务器和服务请求客户端之间还是保持在连接状态的,这样就让客户端可以紧接着发送其他的服务请求了。但在一些特别的情况下,ADB服务器的一个OKAY应答将会改变连接的状态。

比方说,以‘host:transport:’这个服务请求为例,这里的’‘的作用是用来标识一个已定的设备/模拟器;在服务请求成功,ADB服务器返回‘OKAY’应答给客户端后,所有客户端紧跟着发送的服务请求都会直接发送到对应设备(由上面服务请求命令中的指定的设备)的adbd守护进程。

文件SERVICES.TXT列出了当前ADB已经实现的所有的服务。

2. 传输模式


一个ADB的传输模式代表的是一个ADB服务器和目标设备或者模拟器之间的连接模型。

  • USB传输模式,应用在物理设备通过使用USB协议连接到主机端的ADB服务器的的情况

  • 本地传输模式, 应用在运行在主机上的模拟器通过TCP协议和ADB服务器连接的情况

理论上来说,编写一个本地传输模式来实现ADB服务器和连接到/运行在另外一台主机的安卓设备/模拟器的连接代理是可行的。但这个现在还没有完成。(译者注: 这份文档google开发人员应该是没有及时更新,因为以4.4.2版本为例,我们是可以通过‘adb connect’命令连接到同一局域网内任意一台设备或者模拟器的)

每个传输模式都可以承载客户端和客户端指向的目标安卓设备/模拟器的一路或者多路数据流。ADB服务器必须合理的处理好该传输模式异常断开的情况(比如,当一个设备被从主机拔掉的情况)。

posted @ 2015-12-24 17:14  北京茑萝信息  阅读(158)  评论(0编辑  收藏  举报