Adb源碼學習


Adb源碼學習

關於 init_transport_registration函數
在初始化 transport注冊系統時,創建一對 sockpair( transport_registration_send, transport_registration_recv)用於異步處理注冊事件 , 並在 transport_registration_recv上安裝一個異步事件回調函數 transport_registration_func. 當向 adb系統中注冊 /刪除一個 transport時,會調用 transport_write_action將一個 tmsg寫入到 transport_registration_send端,那么 transport_registration_recv端上的回調函數 transport_registration_func就會被觸發。

transport_registration_func的主要工作是異步處理 transport的注冊和刪除操作:

刪除一個 transport:刪除與該 transport相關的異步 IO,更新 adb系統中 transport列表,運行 disconnect操作,最后釋放 memory。如果是 host端, 還要更新 device tracker???
注冊一個新的 transport: 為這個新的 transport對象創建一對 socketpair用來做線程間通信,安裝異步 IO事件,然后創建 output thread和 input thread用於做異步 IO。根據 adb的文檔說明, output線程和 input線程的引人主要是為了解決 USB endpoint不支持非阻塞讀寫,所以就專門為 usb讀操作開一個 output線程,為 usb寫操作創建一個 input線程。所以,數據流方向是遠程連接 ->output線程 ->主線程 ->input線程 ->遠程連接。剛開始時, output線程會發一個 SYNC消息給 input線程,啟動這個 transport。
關於 usb_vendors_init函數
初始化 usb vendor的信息,有一些是內置的 ID號,如 Google, HTC, SAMSUNG等廠家的 ID,其他的可以從 $HOME/.android/adb_usb.ini文件中讀取。

關於 usb_init函數
PC host端和 android device端有不同的實現:

device端 (usb_linux_client.c): usb_init首先試着以 RDWR的方式打開 /dev/android_adb_enable設備文件告訴 kernel要開始啟用 adb的 USB調試功能了。一旦 kernel成功啟用了 adb的 usb功能,就會一個新的線程 usb_open_thread每隔 1000ms掃描一次,判斷 adb是否就緒了。在 Android中,當 device通過 usb線連接到 host端, kernel就會加載相應的 usb驅動 (???)並創建設備文件 /dev/android_adb,反復讀取這個文件就可以判斷 device是否連接到 pc端了。如果返回的 fd大於 0,那么說明已經連接好了,這個時候調用 register_usb_transport將 usbtransport注冊到 adb系統中,等候在 transport_registration_recv的異步 IO事件發生了。如上所述, init_registration_func中的 output線程會首先發送 A_SYNC消息啟動 device和 host的握手協商過程。整個 adb系統將會按照既定的協議運作起來。 host端也是這樣一個過程。此時, host端會首先調用 send_connect給 device端發送 A_CNNX消息告訴自己能夠接受多大的 payload, device收到這個消息后,也會調用 send_connect給 host端發送 A_CNNX消息告訴自己能夠接受多大的 payload,,一來一回,完成了傳輸的握手協議了。

host端的 usb_init: 支持 FreeBSD, MAC OSX, Windows平台。大致流程與 device端的相仿,都創建一個專門掃描 usb端口的線程判斷是否有 device連接,如果有,就調用 register_usb_transport函數啟動整個 adb系統。 linux是通過 libusb來讀取 usb endpoint中的信息, windows平台上是通過 Android系統提供的 API來讀取的。

 


免責聲明!

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



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