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負責寫入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM