ADB(Android Debug Bridge)技術(shù)實現(xiàn)
===============
I、總覽
===============
ADB用來做下面兩件事:
- 跟蹤所有已連接的Android設(shè)備或運行在開發(fā)者機器上的模擬器實例,。
- 為滿足客戶端的需求實現(xiàn)豐富的控制命令,。客戶端包括命令行用戶或者像DDMS一樣的幫助程序,,控制命令包括“adb shell”,,“adb pull”等等。這些控制命令在ADB中被稱作“服務(wù)”,。
總體來看,,ADB中的每項工作通過下列組件的配合完成:
1. ADB服務(wù)器
ADB服務(wù)器是運行在主機上的一個后臺進程,。它的作用在于檢測USB端口感知設(shè)備的連接和拔除,以及模擬器實例的啟動或停止,。
ADB服務(wù)器維護了一個已連接設(shè)備的列表,,并且為每一個連接設(shè)備分配一個狀態(tài)值,狀態(tài)值包括:OFFLINE,、BOOTLOADER,、RECOVERY、ONLINE,。
ADB服務(wù)器實際上是一個龐大的多路傳輸循環(huán),,它精妙的協(xié)調(diào)客戶端、服務(wù)與設(shè)備之間的數(shù)據(jù)交換(實際上是包交換),。
2. ADB守護進程(adbd)
程序“adbd”作為一個后臺進程在Android設(shè)備或模擬器系統(tǒng)中運行,。它的作用是連接ADB服務(wù)器(通過USB連接設(shè)備,通過TCP連接模擬器),,并且為運行在主機上的客戶端提供一些服務(wù),。
當(dāng)ADB服務(wù)器成功的與一個設(shè)備上的adbd守護進程建立連接時,ADB服務(wù)器認為這個設(shè)備是“ONLINE”狀態(tài),。否則,,ADB服務(wù)器認為設(shè)備是“OFFLINE”狀態(tài),“OFFLINE”表明ADB服務(wù)器偵測到一個新的設(shè)備或模擬器,,但是無法與該設(shè)備或模擬器上的adbd守護進程建立連接,。
“BOOTLOADER”狀態(tài)表明設(shè)備處于bootloader模式下,“RECOVERY”狀態(tài)表明設(shè)備處于recovery模式下,。
3. ADB命令行客戶端
命令行程序“adb”用于從shell或腳本中運行adb命令,。首先,“adb”程序嘗試定位主機上的ADB服務(wù)器,,如果找不到ADB服務(wù)器,,“adb”程序自動啟動一個ADB服務(wù)器。
接下來,,客戶端向ADB服務(wù)器發(fā)送服務(wù)請求,。這里面的細節(jié)不需要了解。
通常,,一個單一的“adb” 二進制程序文件包含了服務(wù)器和客戶端的實現(xiàn),。這樣,服務(wù)器的分發(fā)和啟動都更加容易,。
4. 服務(wù)
與客戶端交互的服務(wù)有兩種:
主機服務(wù):
主機服務(wù)運行在ADB服務(wù)器中,,因此它們根本不和設(shè)備通訊。一個典型的例子就是“adb devices”,,它請求返回當(dāng)前已知的設(shè)備及其狀態(tài)的列表,。
本地服務(wù):
本地服務(wù)運行在adbd守護進程中,或者被設(shè)備上的adbd守護進程啟動,。ADB服務(wù)器被用于客戶端與本地服務(wù)之間的多路傳輸數(shù)據(jù)流,。在這種情況下,本地服務(wù)的任務(wù)是初始化連接,,然后為ADB服務(wù)器提供服務(wù)響應(yīng)數(shù)據(jù),。
===============
II、協(xié)議細節(jié)
===============
1. 客戶端<->服務(wù)器 交互協(xié)議
下面詳細說明ADB客戶端和ADB服務(wù)器之間交互的協(xié)議,。ADB服務(wù)器監(jiān)聽在TCP:localhost:5037,。
客戶端用下列格式發(fā)送請求:
A. 開頭4個字節(jié)的十六進制字符串給出請求的長度;
B. 后面緊跟請求內(nèi)容,。
舉例來說,,為了獲得ADB服務(wù)器的內(nèi)部版本號,客戶端將做下列工作:
A. 建立tcp:localhost:5037的socket連接,;
B. 通過socket發(fā)送字符串“000Chost:version”,。
前綴“host:”用來指示請求被定位到ADB服務(wù)器本身(稍后我們將討論其他類型的請求)。為了便于調(diào)試排錯,,請求內(nèi)容的長度按ASCII編碼計算,。
服務(wù)器用下列格式回應(yīng)客戶端請求:
A. 成功:回應(yīng)4個字節(jié)的“OKAY”字符串;
B. 失?。夯貞?yīng)4個字節(jié)的“FAIL”字符串 + 4個字節(jié)的十六進制長度說明 + 指定長度的字符串說明失敗原因,;
C. “host:version”是一個例外,它的回應(yīng)是4個字節(jié)的十六進制字符串,,說明服務(wù)器的內(nèi)部版本號,。
注意:回應(yīng)“OKAY”之后,連接仍然是活動的,,這樣,,客戶端可以通過這個連接發(fā)送其他的請求。但是在特定的情況下,,“OKAY”回應(yīng)會改變連接的狀態(tài),。
舉例來說,客戶端發(fā)出“host:transport:<serialnumber>”請求,,“<serialnumber>”被用來標識一個指定的設(shè)備或模擬器,;在服務(wù)器回應(yīng)“OKAY”之后,客戶端再發(fā)起的請求會直接送達至對應(yīng)的adbd守護進程,。
在以后的文章中,,SSW會列舉當(dāng)前ADB實現(xiàn)的所有服務(wù)。
2. 傳輸協(xié)議
ADB傳輸協(xié)議對ADB服務(wù)器與一個設(shè)備或模擬器之間的連接進行建模,。當(dāng)前有兩種類型的傳輸協(xié)議:
- USB傳輸協(xié)議,,用于通過USB與物理設(shè)備的連接,。
- 本地傳輸協(xié)議,用于通過TCP連接到ADB服務(wù)器,,運行在主機上的模擬器,。
雖然現(xiàn)在還沒有實現(xiàn),但是理論上存在這樣的可能:寫一個本地傳輸協(xié)議,,讓它代理ADB服務(wù)器與連接到另一臺機器的設(shè)備之間的連接,,以及ADB服務(wù)器與運行在另一臺機器上的模擬器之間的連接。
每次傳輸能夠在客戶端和它們所指向的設(shè)備或模擬器之間完成一個或多個多路復(fù)用數(shù)據(jù)流,。ADB服務(wù)器必須正確處理意料之外的傳輸中斷,。(比如:設(shè)備被物理拔除)