ADB-server |
运行在PC端,是一个始终在后台运行的进程,作为与手机端交互的唯一接口。ADB-server处理ADB-client的请求,一部分请求无须与设备交互,直接在PC本地完成;剩下的请求需要与设备端的adbd交互,ADB-server起到了一个switcher的作用。 |
ADB-client |
运行在PC端,可以同时存在多个。每个ADB-client由用户启动,完成多种功能。其作用是与ADB-server交互,实现用户请求的功能。 |
adbd |
运行在设备端的常驻进程,同时只存在一个。作用是接收PC端的ADB-server发来的请求,并作出对应操作。 |
这三个可执行程序都是同一套代码编译出来的,位于<Android Source Dir>/system/core/adb/
在adb源码中找到了:
#define
DEFAULT_ADB_PORT
5037
#define
DEFAULT_ADB_LOCAL_TRANSPORT_PORT
5555
#define
ADB_CLASS
0xff
#define
ADB_SUBCLASS
0x42
#define
ADB_PROTOCOL
0x1
其中,class,subclass,protocol对应的是“
USB\\Class_FF&SubClass_42&Prot_01
”中的FF,42和01,果然代码里有大部分的信息。
service用了一个结构体
asocket保存了用于连接的两个socket,这个socket对一个是本地的,一个是设备上的,也就是service接收到本地socket的数据会将收到的数据发向这个结构中对应的设备的socket。
atransport,用于传输数据的对象,可以设置成不同类型,而分别与本地或usb设备进行数据传输。本地用的是socket 文件描述符,usb设备用的是usb连接的句柄。
alistener是一个结构,只保存了一些数据 , 当socket监听收到连接请求时用于绑定本地端口和请求端口。
usb通信的部分是通过adb_api,就是那两个dll里的代码,它们用到了DeviceIoControl来与设备通信
fdevent 用一个结构体,保存了事件及事件处理的函数的指针。
adb 启动时会先检查是否有设置相关的环境变量,有
ANDROID_PRODUCT_OUT,
ANDROID_SERIAL,
ANDROID_ADB_SERVER_PORT,主要是port,如果没有port将会使用5037这个端口。然后adb客户端会尝试发送版本检查的信息,如果返回-2,说明服务端没有启动,就获取自身所在的路径,以服务端的参数启动一个服务进程,这个进程与原adb是同一个程序。