老李推荐:第4章1节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,
关于ADB的实现记录。
I. 概览
安卓调试桥(ADB)是用来: 跟踪管理所有连接上或者运行在开发主机上的安卓设备或者模拟器实例。
其实现了各种控制命令(比如: “adb shell”,”adb pull”,等等…)来为各种客户端(命令行用户,或者如DDMS等开发助手之类的程序)提供便利。这些命令其实就是ADB中所谓的“服务”了。
总的来说,所有工作都是在以下各个组件中完成的:
1. ADB服务器
这是一个运行在主机端的后台守护进程。该进程的目的是去感知(监控)USB端口是否有设备挂载或者移除掉,当然也包括对模拟器实例启动和关闭的监控了。
所以它维护了一系列”已连接设备”的信息,并且每个已连接设备都会被赋予以下的一个状态:OFFLINE,BOOTLOADER,RECOVERY或者ONLINE(往后还会有更多其他状态的支持)。
ADB服务器确实可以号称为一个强大的多路路由,它的目的就是像路由一样去协调ADB命令行客户端,服务,和设备之间的数据(事实上是数据包)交换。
2. ADB守护进程(adbd)
“adbd”是作为一个后台守护进程运行在目标安卓设备或者模拟器系统上面的。他的目的是跟主机端的ADB服务器进行连接(真实设备使用USB连接,模拟器通过TCP进行连接)以为运行在主机端的客户端提供一些服务。(译者注: 其实真实机器也可以通过TCP进行连接)
当ADB服务器连接上一个目标设备的adbd守护进程的时候,ADB服务器就会认为该设备是ONLINE状态的。反之,该设备就被认为是OFFLINE状态,代表ADB服务器可以侦查到一个设备/模拟器,但是不能连接上它的adbd守护进程。
BOOTLOADER和RECOVERY状态是和设备是处于引导状态还是修复状态这两个交替状态中的一个相对应的。
3. ADB命令行客户端
‘adb’命令行客户端是用来在一个shell或者脚本中运行adb命令的程序。它首先会尝试定位主机上的ADB服务器,如果发现ADB服务器没有起来的话会尝试把它启动起来。
定位到已经启动的ADB服务器后,该adb命令行客户端就会将它的服务请求命令发送到ADB服务器。它不需要知道ADB服务器处理该服务请求的任何细节。
迄今为止,同一个‘adb‘二进制文件是同时作为ADB服务器和客户端使用的。这样做的好处是让ADB服务器的发布和启动变得更方便。
4. 服务
本质上客户端会跟这里的两种类型的服务进行交互通信。
主机服务:
这些服务完全是运行在ADB服务器内部的,所以根本不需要和任何目标安卓设备进行通信。一个典型的例子就是用来获得一系列当前连接上来主机的设备信息和状态的命令”adb devices”。当然还有不少的一些其他的服务了。
本地服务:
这些服务或许是在目标设备的adbd守护进程内部运行,或许是由adbd启动运行。 ADB服务器在这里扮演的角色就是在运行在客户端和由adbd守护进程运行的服务之间充当一个多路数据流的路由。在这种情况下,ADB服务器会对adbd守护进程和ADB命令行客户端之间的连接进行初始化,然后在他们之间进行数据接力传递。