博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ADB运行框架原理解析【转】
阅读量:5986 次
发布时间:2019-06-20

本文共 1769 字,大约阅读时间需要 5 分钟。

本文转载自:

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

你可能感兴趣的文章
《PHP、MySQL和Apache入门经典(第5版)》一一1.4 在Mac OS X上安装XAMPP
查看>>
《树莓派用户指南(第3版)》——1.2 Model A
查看>>
【SQL 性能优化】表的三种连接方式
查看>>
spark1.3.0__for_hadoop2.4.1编译、安装与初步测试
查看>>
利用perl计算列表中高于平均值的数字
查看>>
我的友情链接
查看>>
做了「负载均衡」就可以随便加机器了吗?这三招来帮你!
查看>>
discuz后台权限管理
查看>>
数据库同步热备方案(武汉某医院)
查看>>
vb.net制作简单的下拉菜单
查看>>
mockito_mock测试
查看>>
linux 下的postfix的搭建
查看>>
Content-type 的说明 ,即 HTTP请求头的类型有哪些?
查看>>
CISSP-CBK十大知识体系
查看>>
使用JMeter进行负载测试——终极指南
查看>>
MYSQL的InnoDB Buffer Pool内部机制
查看>>
部署 dubbo + zookeeper
查看>>
sql重写后比较是否一致
查看>>
python模块pymysql
查看>>
IOS UIScrollView详解 & 图片缩放功能
查看>>