adb源码 笔记

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是同一个程序。

你可能感兴趣的:(源码,安卓,adb,usb)