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

  • 相关阅读:
    First Missing Positive
    Find Minimum in Rotated Sorted Array II
    switch两种写法对比
    常用的前端JavaScript方法封装
    如何保证缓存和数据库的一致性?
    14个前端小知识
    dataTable转换特定的类
    C# MD5 32大写位加密 UTF-8编码
    另一个 SqlParameterCollection 中已包含 SqlParameter
    C#实现数据回滚,A事件和B事件同时执行,其中任何一个事件执行失败,都会返回失败
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/8166245.html
Copyright © 2011-2022 走看看