本文轉載自: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負責寫入