Adb源碼學習

來源:互聯網
上載者:User

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來讀取的。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.