adb服務進程一個重要的功能就是查找設備,當插入一個android設備,而且成功安裝手機驅動後,adb的服務進程就能夠發現設備,當adb進程使用devices命令的時候,服務進程把本身保存的設備列表返回給adb進程。這裏解釋一下,adb進程和adb服務進程。其實這兩個東西是一個exe文件,僅僅是在啓動的時候經過不一樣的命令行來區別。這裏貼一下adb的代碼,就能更好的理解adb服務進程了。android
1)進程啓動以後,通過各類的初始化以後,進入了adb_commandline函數。這個函數是用來處理全部的命令行:windows
2)以後解析命令行,其中就有一個關鍵的命令:api
3)在第二步設置了標誌以後,後面就是進入了一個死循環,而後這個服務進程就一直在後臺了:緩存
下面是adb_main函數中代碼片斷,有一個死循環,一直在查找設備:函數
主線程的死循環裏面很簡單,就是從消息隊列獲取消息,處理以後轉發等等:命令行
以上就是adb服務進程啓動的一個大體的過程,adb服務進程在啓動過程當中會作比較多的事情,下面列舉一些重要的事件:線程
1)啓動一個線程,每隔1s掃描一下設備:3d
函數裏面啓動一個線程:接口
線程的實現代碼,find_devices函數內部再遍歷設備,把新設備加入到設備列表中:隊列
接下來重點說一下find_devices函數裏面的一個細節,前一篇文章說到設備序列號,不少手機的序列號是同樣的,就會致使同時插入多個手機的時候區分不開始哪一個手機。因爲序列號相同,因此執行adb命令的時候就不知道發給哪一個手機了。這個過程涉及到USB接口的操做,谷歌的代碼裏面有一套adbwinapi,其實裏面就是用的windows的setupapi函數而已:
能夠根據接口來作一個變換,由於每一個硬件的接口是惟一的,因此能夠根據這個接口來變換,而後返回便可。buffer是保存的序列號,只要把你須要的序列號寫入這個緩存就能夠。buffer_char_size這個參數緩存的是長度。不要越界了。
adb通訊協議分析以及實現(一):www.jianshu.com/p/713c7823d…
adb通訊協議分析以及實現(二):www.jianshu.com/p/4bdd315a9…
adb通訊協議分析以及實現(三):www.jianshu.com/p/23581d48f…
adb通訊協議分析以及實現(四):www.jianshu.com/p/639fd2155…