<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 圖解ADB工作原理,建議收藏

圖解ADB工作原理,建議收藏

發(fā)布人:電子禪石 時(shí)間:2023-02-24 來(lái)源:工程師 發(fā)布文章

介紹

Android 調試橋 (adb) 是一種功能多樣的命令行工具,它可以讓你與設備進(jìn)行通信,adb 命令可用于執行各種設備操作(例如安裝和調試應用),并提供對 Unix shell(可用來(lái)在設備上運行各種命令)的訪(fǎng)問(wèn)權限,它是一種C/S架構的程序,包括以下三個(gè)組件:

客戶(hù)端:主要用于發(fā)送命令,adb client在開(kāi)發(fā)機器上運行,你可以通過(guò)發(fā)出 adb 命令從命令行終端調用客戶(hù)端,它主要的工作是:解析像:push、shell、install等命令的參數,做必要預處理,然后轉移為指令或數據,發(fā)送給adb server。

守護程序 (adbd):是運行在A(yíng)ndroid設備(真機/模擬器)后臺的一個(gè)進(jìn)程,它是由init進(jìn)程啟動(dòng)的,并且系統一開(kāi)機就已經(jīng)啟動(dòng),它的主要作用是處理來(lái)自 adb server的命令行請求,然后獲取對應Android設備的信息,再將結果返回給adb server。

服務(wù)器:是運行在開(kāi)發(fā)機器上的一個(gè)后臺進(jìn)程,它有兩個(gè)作用:1)檢測USB端口感知設備的連接和拔除,以及模擬器實(shí)例的啟動(dòng)或停止;2)將adb client的請求通過(guò)usb或者tcp的方式發(fā)送到對應的adbd上。

工作原理

當你啟動(dòng)某個(gè) adb 客戶(hù)端時(shí),該客戶(hù)端會(huì )先檢查是否有 adb 服務(wù)器進(jìn)程正在運行,如果沒(méi)有,它會(huì )先啟動(dòng)服務(wù)器進(jìn)程,服務(wù)器在啟動(dòng)后會(huì )與本地 TCP 端口 5037 綁定,并監聽(tīng) adb 客戶(hù)端發(fā)出的命令(所有 adb 客戶(hù)端均通過(guò)端口 5037 與 adb 服務(wù)器通信)如下圖:

然后,服務(wù)器會(huì )與所有正在運行的設備建立連接,它通過(guò)掃描 5555 到 5585 之間(該范圍供前 16 個(gè)模擬器使用)的奇數號端口查找模擬器,服務(wù)器一旦發(fā)現 adb 守護程序 (adbd),便會(huì )與相應的端口建立連接,請注意,每個(gè)模擬器都使用一對按順序排列的端口(用于控制臺連接的偶數號端口和用于 adb 連接的奇數號端口)例如:


模擬器 1,控制臺:5554
模擬器 1,adb:5555
模擬器 2,控制臺:5556
模擬器 2,adb:5557
依此類(lèi)推

如上所示,在端口 5555 處與 adb 連接的模擬器與控制臺監聽(tīng)端口為 5554 的模擬器是同一個(gè)。

服務(wù)器與所有設備均建立連接后,你便可以使用 adb 命令訪(fǎng)問(wèn)這些設備,由于服務(wù)器管理與設備的連接,并處理來(lái)自多個(gè) adb 客戶(hù)端的命令,因此你可以從任意客戶(hù)端(或從某個(gè)腳本)控制任意設備。

通信流程

如下圖:



舉個(gè)例子:

  1. 我們通過(guò)Android Studio工具或者命令行界面直接或間接的調用某個(gè)adb命令,比如adb install或者adb devices

  2. 這時(shí)候adb進(jìn)程會(huì )fork出一個(gè)子進(jìn)程作為adb server,而這個(gè)fork出的進(jìn)程將常駐PC端,監聽(tīng)來(lái)自Client端的請求

  3. adb server查找當前連接的真機或者模擬器,并接收來(lái)自Client端發(fā)出的請求

  4. adb server處理請求:如果是本地能直接處理的請求比如:adb devices就直接處理,如果是本地處理不了的請求就會(huì )轉發(fā)給連接的真機或者模擬器來(lái)進(jìn)行處理,可以通過(guò)數據線(xiàn)和TCP/IP的方式通信

  5. 位于真機或者模擬器后臺的adbd進(jìn)程接收到請求后,通過(guò)JDWP協(xié)議轉發(fā)給對應的Java虛擬機進(jìn)程處理

  6. adbd將處理后的結果返回給adb server

  7. adb server再將結果返回給Client,這時(shí)候我們就在命令行界面中看到展示結果了

image.png



*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: adb

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>