本文转载自:http://blog.csdn.net/wlwl0071986/article/details/50935496

一、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负责写入

最新文章

  1. Gitlab完美安装【CentOS6.5安装gitlab-6.9.2】
  2. Python中的网络编程
  3. 使用Unity Container
  4. Git——2
  5. BZOJ 1068: [SCOI2007]压缩
  6. IOS第13天(3,私人通讯录,登陆状态数据存储,数据缓存, cell的滑动删除,进入编辑模式,单个位置刷新 )
  7. iOS获取手机相关信息
  8. Java [leetcode 20]Valid Parentheses
  9. C++ Primer 学习笔记_76_模板和泛型编程 --模板定义[继续]
  10. CodeForces 190D Non-Secret Cypher
  11. UNIX网络编程——客户/服务器程序设计示范(六)
  12. 洲阁筛 & min_25筛学习笔记
  13. css点滴3—5种方式实现圆环
  14. mybatis-generator 自动生成查询Vo
  15. 2、evaluate-reverse-polish-notation
  16. Python Socket实现文件上传(TCP协议)
  17. Oracle 22表空间
  18. Zabbix安装(debian,centos)
  19. 每天CSS学习之border-radius
  20. linux basename学习

热门文章

  1. EC++学习笔记(四) 设计与声明
  2. Codevs 2956 排队问题
  3. [UIScreen mainScreen].applicationFrame与[UIScreen mainScreen].bounds区别
  4. mongodb的入门学习
  5. Golang 入门 : 等待 goroutine 完成任务
  6. [Bzoj5043][Lydsy1709月赛]密码破译(按位dp)
  7. Java面试题总结之数据结构、算法和计算机基础(刘小牛和丝音的爱情故事1)
  8. 当传入数据只有一个时mybatis中<if>判断会出现There is no getter for property named 'subjectId' in 'class java.lang.Intege
  9. Flink的安装配置
  10. jQuery学习总结(一)——jQuery基础与学习资源