一、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。核心控制器被載入。當使用者向伺服器傳送請求時,核心控制...