zoukankan      html  css  js  c++  java
  • ADB运行框架原理解析【转】

    本文转载自: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负责写入

  • 相关阅读:
    SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)
    麦咖啡导致电脑不能上网
    SharePoint 2013 Central Admin 不能打开
    SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)
    SharePoint 2013 APP 开发示例 系列
    synthesize(合成) keyword in IOS
    Git Cmd
    简单的正则匹配
    Dropbox
    SQL Server Replication
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8166245.html
Copyright © 2011-2022 走看看