圖解ADB工作原理,建議收藏
介紹
Android 調(diào)試橋 (adb) 是一種功能多樣的命令行工具,它可以讓你與設(shè)備進(jìn)行通信,adb 命令可用于執(zhí)行各種設(shè)備操作(例如安裝和調(diào)試應(yīng)用),并提供對(duì) Unix shell(可用來在設(shè)備上運(yùn)行各種命令)的訪問權(quán)限,它是一種C/S架構(gòu)的程序,包括以下三個(gè)組件:
客戶端:主要用于發(fā)送命令,adb client在開發(fā)機(jī)器上運(yùn)行,你可以通過發(fā)出 adb 命令從命令行終端調(diào)用客戶端,它主要的工作是:解析像:push、shell、install等命令的參數(shù),做必要預(yù)處理,然后轉(zhuǎn)移為指令或數(shù)據(jù),發(fā)送給adb server。
守護(hù)程序 (adbd):是運(yùn)行在Android設(shè)備(真機(jī)/模擬器)后臺(tái)的一個(gè)進(jìn)程,它是由init進(jìn)程啟動(dòng)的,并且系統(tǒng)一開機(jī)就已經(jīng)啟動(dòng),它的主要作用是處理來自 adb server的命令行請(qǐng)求,然后獲取對(duì)應(yīng)Android設(shè)備的信息,再將結(jié)果返回給adb server。
服務(wù)器:是運(yùn)行在開發(fā)機(jī)器上的一個(gè)后臺(tái)進(jìn)程,它有兩個(gè)作用:1)檢測(cè)USB端口感知設(shè)備的連接和拔除,以及模擬器實(shí)例的啟動(dòng)或停止;2)將adb client的請(qǐng)求通過usb或者tcp的方式發(fā)送到對(duì)應(yīng)的adbd上。
工作原理
當(dāng)你啟動(dòng)某個(gè) adb 客戶端時(shí),該客戶端會(huì)先檢查是否有 adb 服務(wù)器進(jìn)程正在運(yùn)行,如果沒有,它會(huì)先啟動(dòng)服務(wù)器進(jìn)程,服務(wù)器在啟動(dòng)后會(huì)與本地 TCP 端口 5037 綁定,并監(jiān)聽 adb 客戶端發(fā)出的命令(所有 adb 客戶端均通過端口 5037 與 adb 服務(wù)器通信)如下圖:
然后,服務(wù)器會(huì)與所有正在運(yùn)行的設(shè)備建立連接,它通過掃描 5555 到 5585 之間(該范圍供前 16 個(gè)模擬器使用)的奇數(shù)號(hào)端口查找模擬器,服務(wù)器一旦發(fā)現(xiàn) adb 守護(hù)程序 (adbd),便會(huì)與相應(yīng)的端口建立連接,請(qǐng)注意,每個(gè)模擬器都使用一對(duì)按順序排列的端口(用于控制臺(tái)連接的偶數(shù)號(hào)端口和用于 adb 連接的奇數(shù)號(hào)端口)例如:
模擬器 1,控制臺(tái):5554 模擬器 1,adb:5555 模擬器 2,控制臺(tái):5556 模擬器 2,adb:5557 依此類推
如上所示,在端口 5555 處與 adb 連接的模擬器與控制臺(tái)監(jiān)聽端口為 5554 的模擬器是同一個(gè)。
服務(wù)器與所有設(shè)備均建立連接后,你便可以使用 adb 命令訪問這些設(shè)備,由于服務(wù)器管理與設(shè)備的連接,并處理來自多個(gè) adb 客戶端的命令,因此你可以從任意客戶端(或從某個(gè)腳本)控制任意設(shè)備。
通信流程
如下圖:
舉個(gè)例子:
我們通過Android Studio工具或者命令行界面直接或間接的調(diào)用某個(gè)adb命令,比如adb install或者adb devices
這時(shí)候adb進(jìn)程會(huì)fork出一個(gè)子進(jìn)程作為adb server,而這個(gè)fork出的進(jìn)程將常駐PC端,監(jiān)聽來自Client端的請(qǐng)求
adb server查找當(dāng)前連接的真機(jī)或者模擬器,并接收來自Client端發(fā)出的請(qǐng)求
adb server處理請(qǐng)求:如果是本地能直接處理的請(qǐng)求比如:adb devices就直接處理,如果是本地處理不了的請(qǐng)求就會(huì)轉(zhuǎn)發(fā)給連接的真機(jī)或者模擬器來進(jìn)行處理,可以通過數(shù)據(jù)線和TCP/IP的方式通信
位于真機(jī)或者模擬器后臺(tái)的adbd進(jìn)程接收到請(qǐng)求后,通過JDWP協(xié)議轉(zhuǎn)發(fā)給對(duì)應(yīng)的Java虛擬機(jī)進(jìn)程處理
adbd將處理后的結(jié)果返回給adb server
adb server再將結(jié)果返回給Client,這時(shí)候我們就在命令行界面中看到展示結(jié)果了
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。