一、adb守护进程的初始化
源码路径:~/system/core/adb/adb.c int main(int argc, char **argv) ---> start_device_log() ---> property_get("persist.adb.trace_mask", value, "") // 如果定义了该属性,则打开对应adb log开关 ---> adb_main(0, DEFAULT_ADB_PORT) ---> init_transport_registration() //在注册adb传输通道之前,初始化注册通道的处理函数
---> property_get("service.adb.tcp.port", value, "") ---> local_init(port) //如果定义了该属性,则使用指定接口通过tcp连接adbd ---> adb_thread_create(&thr, server_socket_thread, (void *)port) //创建adbd socket传输线程 ---> adb_socket_accept(serverfd, &addr, &alen) //侦听来自adb server的连接请求 ---> register_socket_transport(fd, "host", port, 1) //如果连接成功, //则注册一个socket传输通道和server进行命令交互
---> access("/dev/android_adb", F_OK) ---> usb_init() //如果没有设置tcp端口,并且android_adb存在,则使用usb连接adbd ---> adb_thread_create(&tid, usb_open_thread, h) //创建打开android_adb文件的线程 ---> usb_open_thread() ---> unix_open("/dev/android_adb", O_RDWR) //打开android_adb ---> register_usb_transport(usb, 0, 1) ---> init_usb_transport(...) //初始化usb传输通道的数据结构 ---> register_transport(t) //往transport_registration_send描述符写注册命令
---> transport_registration_recv() //处理函数通过transport_registration_recv描述符接收到的命令 ---> adb_thread_create(&input_thread_ptr, input_thread, t) //创建adb输入通道 ---> adb_thread_create(&output_thread_ptr, output_thread, t) //创建adb输出通道
以上为adb守护进程初始化的大致流程,创建传输通道的细节,大家可以跟踪代码看看。
二、adb的运行机制和框架结构 下面以一张图来进行分析: 完整的数据处理流程: 1:PC端adb server发送cmd到小机端 2:adbd(adb daemon)的output thread从/dev/android_usb读取到cmd并解析 (adbd和内核usb driver通过/dev/android_usb进行数据交互) 3:output_thread将解析的cmd写到socketpair的A端 4:fdevent_loop通过select socketpair的B端,得知A端有数据写入,B端可读,然后读取cmd, 进行处理(handle_packet) 5:处理完后将结果写到socketpair的B端 6:Input_thread阻塞式读取socketpair的A端 7:Input_thread读取到数据后,写入/dev/android_usb 8:由usb driver将response发给pc端 output_thread负责读取/dev/android_usb,Input_thread负责写入 |
|
来自: lifei_szdz > 《Android》