ADB執行框架原理解析

2021-07-10 14:59:01 字數 2417 閱讀 4650

一、adb守護程序的初始化

原始碼路徑:~/system/core/adb/adb.c

int main(int argc, char **argv)

---> start_device_log()

---> property_get("persist.adb.trace_mask", value, "")  // 如果定義了該屬性,則開啟對應adb log開關

---> adb_main(0, default_adb_port)

---> init_transport_registration()  //在註冊adb傳輸通道之前,初始化註冊通道的處理函式

---> property_get("service.adb.tcp.port", value, "") 

---> local_init(port)  //如果定義了該屬性,則使用指定介面通過tcp連線adbd

---> adb_thread_create(&thr, server_socket_thread, (void *)port)  //建立adbd socket傳輸線程

---> adb_socket_accept(serverfd, &addr, &alen)  //偵聽來自adb server的連線請求

---> register_socket_transport(fd, "host", port, 1)  //如果連線成功,

//則註冊乙個socket傳輸通道和server進行命令互動       

---> access("/dev/android_adb", f_ok) 

---> usb_init()  //如果沒有設定tcp埠,並且android_adb存在,則使用usb連線adbd

---> adb_thread_create(&tid, usb_open_thread, h)  //建立開啟android_adb檔案的執行緒

---> usb_open_thread()

---> unix_open("/dev/android_adb", o_rdwr) //開啟android_adb

---> register_usb_transport(usb, 0, 1)

---> init_usb_transport(...)  //初始化usb傳輸通道的資料結構

---> register_transport(t)  //往transport_registration_send描述符寫註冊命令

---> transport_registration_recv()  //處理函式通過transport_registration_recv描述符接收到的命令

---> adb_thread_create(&input_thread_ptr, input_thread, t)  //建立adb輸入通道

---> adb_thread_create(&output_thread_ptr, output_thread, t)  //建立adb輸出通道

以上為adb守護程序初始化的大致流程,建立傳輸通道的細節,大家可以跟蹤**看看。

二、adb的執行機制和框架結構

下面以一張圖來進行分析:

完整的資料處理流程: 1:

pc端adb server

傳送cmd

到小機端

2:adbd(adb daemon)

的output thread

從/dev/android_usb

讀取到cmd

並解析(

adbd

和核心usb driver

通過/dev/android_usb

進行資料互動)

3:output_thread

將解析的

cmd寫到

socketpair的a

端4:fdevent_loop

通過select socketpair的b

端,得知

a端有資料寫入,

b端可讀,然後讀取

cmd,

進行處理(

handle_packet

)5:處理完後將結果寫到

socketpair的b

端6:input_thread

阻塞式讀取

socketpair的a

端7:input_thread

讀取到資料後,寫入

/dev/android_usb

8:由usb driver

將response

發給pc

端output_thread

負責讀取

/dev/android_usb

,input_thread

負責寫入

springmvc框架原理解析

框架執行流程 step1 使用者發起請求到前端控制器 step3 處理器對映器向前端控制器返回handler step4 前端控制器呼叫處理器介面卡去執行handler step5 處理器介面卡去執行handler step6 handler執行完給介面卡返回modelandview step7 處...

SpringDataJPA執行原理解析

我們都知道 在springdatajpa中我們定義dao層是不需要實現類的,只需要定義乙個介面,並繼承2個介面即可 jparepository,jpaspecificationexecutor 即可直接操作持久層資料,這種情況,就是以動態 的方式,進行api的實現,進行相應的操作 執行乙個查詢操作 ...

各大框架執行原理

各框架執行原理 struts2 當servlet容器 tomcat 啟動的時候載入web.xml檔案,web.xml裡配置著struts2的核心控制器filterdispatcher strutspreparedandexecutefilter。核心控制器被載入。當使用者向伺服器傳送請求時,核心控制...