老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1...
老李推薦: 第8章4節《MonkeyRunner源碼剖析》MonkeyRunner啟動運行過程-啟動AndroidDebugBridge
上一節我們看到在啟動AndroidDebugBridge的過程中會調用其start方法,而該方法會做2個主要的事情:
其中第一點我們上一小節已經做了詳盡分析了,那么我們往下就去分析下第2點。
DeviceMonitor主要的功能就是監控是否有安卓設備拔除或者連接上來,然后對每個連接上來的設備的所有可調式進程進行監控。這個功能更多是給DDMS這個調試工具使用的,大家從AndroidDebugBridge所在的jar包ddmlib.jar應該就能猜到其實DDMS用到的也是這個jar包。
Android的每一個應用程序都是運行在獨立的進程中的,且每個進程都是在自己的虛擬機(VM)中運行的,其實這個就基本上是Android操作系統的沙箱(SandBox)的概念了。目的就是以防你的進程到處亂闖搞破壞。每個進程的VM都會提供唯一的一個端口作連接調試器用。DDMS啟動時會連接到AndroidDebugBridge(也就是ADB服務器了)。當一個設備被連接時,一個虛擬機在設備上啟動或停止時它會通知DDMS,在DDMS和adb之間創建一個虛擬機的監控服務。一旦虛擬機運行,DDMS會通過AndroidDebugBridge的DeviceMonitor線程檢索虛擬機的進程ID(pid),并通過設備上的adb守護進程打開一個連接到虛擬機的調試器。這樣DDMS就能和虛擬機對話了。
?
圖8-4-1 DDMS界面
DeviceMonitor這個類對于MonkeyRunner框架來說最重要的功能是它保存了一個代表所有連接上來的設備的Device列表,這個Device類非常的重要,基本可以說MonkeyRunner和ADB服務器的溝通最終都是通過它來做的,所以它相當于一個安卓設備在PC端的代理,我們下一章會對這個類做詳細的分析。下面我們先看下DeviceMonitor這個類:
?
圖8-4-2 DeviceMonitor類
這個類是ddmlib庫的一個類,上面類圖列出了DeviceMonitor關鍵的成員變量和方法,我們先對它們做初步的介紹,這樣有利于大家更好的跟隨我在下面對這個類的源代碼進行分析:
- mServer: DebugBridgeServer對象,因為需要向ADB服務器發送相應的設備監控命令,所以在DeviceMonitor初始化的時候會把一個DebugBridgeServer實例傳進來保存到mServer中
- mMainAdbConnection: 一個SocketChannel實例,DeviceMonitor在對每個設備進行監控之前需要先和ADB服務器建立鏈接
- mDevices: 代表一個安卓設備的Device實例組成的一個列表。注意這個Device在整個MonkeyRunner框架中非常的重要,如前面所述,它基本上可以被看成是真實安卓設備在PC端的一個代理,很多發送給ADB服務器的命令最終都是通過它發送出去的。DeviceMonitor監控線程一旦發現新設備就會建立一個Device實例并放到mDevices列表里面,反之,如果一個設備被移除,就會從mDevices列表中移除
- start: 一個默認權限的方法,所以可以被同一個ddmlib包里面的AndroidDebugBridge調用。它的作用是啟動設備列表監控線程,線程循環主體在下面描述的deviceMonitorLoop方法里面
- getDevices: 返回上面的mDevices設備。MonkeyRunner類的waitForConnection方法在建立與設備的連接時,最終會調用到這個方法來獲得所有設備并根據設備序列號找到目標設備去連接
- deviceMonitorLoop: 向ADB服務器發送”host:track-devices”設備監控命令來循環獲取最新的字串類型的設備列表,這個命令類似于在命令行發送”adb devices”來獲得當前連接的設備列表,但是不同的地方是該監控命令發送給ADB服務器后,ADB服務器會周期性的更新設備列表然后主動發送回來。每個循環完成后,如果發現ADB服務器有數據過來,都會調用下面的processIncomingDeviceData方法來作更新mDevices設備列表等事宜
- sendDeviceListMonitoringRequest:上面的deviceMonitorLoop方法調用來往ADB服務器發送”host:track-devices”設備列表監控命令的方法
- processIncomingDeviceData:上面的deviceMonitorLoop方法在發現ADB服務器有數據過來的時候會調用這個方法來從與ADB服務器連接的mMainAdbConnection這個SocketChannel中把最新的字串類型設備列表讀出來,然后為每個設備實例化一個Device實例并將這些實例放到一個列表中,傳送給下面的updateDevices方法來處理
- updateDevices: 在收到上面processIncomingDeviceData發送過來的最新的Device類型的設備列表后,updateDevices會根據當前持有的mDevices設備列表來檢查究竟哪些設備是新增加進來的,哪些是被移除掉的,哪些是狀態改變了的來作相應的處理:
- 新設備: 將該設備加入到DeviceMonitor維護的mDevices設備列表里面,并調用下面的startMonitoringDevice來為該設備的每個可調試應用進程建立一個監控線程來監控該VM進程
- 設備變成ONLINE狀態: 將mDevices設備列表里面對應的設備設置成ONLINE狀態,并調用下面的startMonitoringDevice來為該設備的每個可調試應用進程建立一個監控線程來監控該VM進程
- 設備從ONLINE變成其他狀態:將mDevices設備列表里面對應的設備設置成對應狀態?
- 移除設備: 將該設備從當前設備列表mDevices中移除掉
- startMonitoringDevice: 獲得對應設備中的所有可調試VM進程的PID列表(可調試進程指的是DalvikVM中每個啟動了JDWP線程讓DDMS等調試工具連接的進程),連接上每個VM的調試端口并建立對應的客戶端監控線程來監控該進程。因為客戶端機器下層的JDWP相關的代碼主要是給DDMS等監控調試工具使用的,所以本書不會往下作深入分析
- sendDeviceMonitoringRequest: startMonitoringDevice方法調用本方法來獲得指定設備可調試的所有進程的PID,其實發送的就是”track-jdwp“命令
有了以上的基本認識后,我們繼續往下分析其代碼實現。AndroidDebugBridge啟動起來后,下一步就是把這個ADB實例傳到DeviceMonitor來去監測所有連接到adb服務器也就是pc主機端的android設備的狀態:
70?? DeviceMonitor(AndroidDebugBridge server)
?71?? {
?72???? this.mServer = server;
?73
?74???? this.mDebuggerPorts.add(Integer.valueOf(DdmPreferences.getDebugPortBase()));
?75?? }
代碼8-4-1 DeviceMonitor構造函數
?
保存好AndroidDebugBridge實例后,下一步就是繼續AndroidDebugBridge啟動函數start()啟動DeviceMonitor設備監控線程:
79?? void start()
?80?? {
?81???? new Thread("Device List Monitor")
?82???? {
?83?????? public void run() {
?84???????? DeviceMonitor.this.deviceMonitorLoop();
?85?????? }
?86???? }.start();
?87?? }
代碼8-4-2 DeviceMonitor - start
?
轉載于:https://www.cnblogs.com/poptest/p/5089487.html
總結
以上是生活随笔為你收集整理的老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习node js 之微信公众帐号接口开
- 下一篇: [Android]动态加载/热部署框架汇