一、什么是adb?
ADB 是 Android Debug Bridge 的简称,是 Android 平台的调试工具。通过 adb 命令可以去获取安卓设备上的一些信息,也可以直接操作管理 Android 模拟器或者真实的 Android 设备。
ADB 采用客户端-服务端程序架构,简称 C-S 架构。主要包含以下三个组件:
1)客户端(adb client):运行在PC上,用来发送 adb 命令。
2)服务端(adb server):运行在PC上的一个守护进程,用来管理 adb client 端和 Android 设备上的 adbd 进程之间的通信。具体有以下两个作用:
- 检测 USB 端口感知设备的连接和拔除,以及模拟器实例的启动或停止。
- 将 adb client 的请求通过 usb 或者 tcp 的方式发送给 Android 设备上的 adbd 进程进行处理。
3)守护程序(adbd):运行在 Android 设备(真机/模拟器)后台的一个进程,它的主要作用是处理来自 adb server 的命令,然后获取对应 Android 设备的信息,最后将结果返回给 adb server。
二、adb的工作原理
当启动某个 adb client 时,该客户端会先检查是否有 adb server 进程正在运行。如果没有,它会先启动服务器进程,服务器进程在启动后会绑定到 5037 端口,并监听 adb client 发出的命令(所有 adb client 均通过 5037 端口与 adb server 进行通信)。如下图:
然后,服务器会与所有正在运行的设备建立连接,建立连接后,你便可以使用 adb 命令访问这些设备,由于服务器管理着设备的连接,并处理来自多个 adb client 的命令,因此你可以从任意客户端控制任意设备。
三、adb的通信流程
1)我们通过命令行界面或者 Android Studio工具等直接或间接的调用某个 adb 命令,比如 adb install 或者 adb devices。
2)这时候 adb client 进程会 fork 出一个子进程作为 adb server,而这个 fork 出的进程将常驻 PC 端,监听来自 adb client 端的请求。【fork()函数用于从一个已经存在的进程内创建一个新的进程,新的进程称为“子进程”,相应地称创建子进程的进程为“父进程”。使用fork()函数得到的子进程是父进程的复制品,子进程完全复制了父进程的资源,包括进程上下文、代码区、数据区、堆区、栈区、内存信息、打开文件的文件描述符、信号处理函数、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等信息&#x