第8章6节MonkeyRunner启动运行过程-启动Monkey 2
有了以下的基本認知之后,我們就可以通過分析代碼來闡述Monkey是怎么在用戶調用MonkeyRunner.waitForConnection的方法引發的一系列調用過程中啟動起來的了,我們先看下MonkeyRunner的這個waitForConnection方法:
?
62???public?static?MonkeyDevice?waitForConnection(PyObject[]?args,?String[]?kws)??
63???{??
64?????ArgParser?ap?=?JythonUtils.createArgParser(args,?kws);??
65?????Preconditions.checkNotNull(ap);??
66?????long?timeoutMs;??
67?????try??
68?????{??
69???????double?timeoutInSecs?=?JythonUtils.getFloat(ap,?0);??
70???????timeoutMs?=?(timeoutInSecs?*?1000.0D);??
71?????}?catch?(PyException?e)?{??
72???????timeoutMs?=?Long.MAX_VALUE;??
73?????}??
74???
75?????IChimpDevice?device?=?chimpchat.waitForConnection(timeoutMs,?ap.getString(1,?".*"));??
76???
77?????MonkeyDevice?chimpDevice?=?new?MonkeyDevice(device);??
78?????return?chimpDevice;??
79???}??
代碼8-6-1 MonkeyRunner - waitForConnection
?
腳本調用到的MonkeyRunner,MonkeyDevice等這些類都是通過JAVA來編寫的,而腳本自身卻是通過jython(可以被調用JAVA的python)編寫的,所以它們之前的參數需要有一個轉換的機制,至于它們是怎么轉換的不是重點,所以我自己都沒有去研究過jython的實現原理,因為這不影響我對MonkeyRunner框架的理解。好,我們繼續對上面代碼的分析:
75行: 調用chimpchat對象的waitForConnection方法來獲得一個AdbChimpDevice的高層抽象設備實例
79-78行: 將上面的AdbChimpDevice實例作為參數傳入到MonkeyDevice來構造一個MonkeDevice對象并返回給測試代碼,這樣測試代碼就可以通過操作該MonkeyDevice實例來控制目標設備了
我們重點往下分析ChimpChat的waitForConnection方法,至于MonkeyDevice構造函數,我們在下一章會對整個MonkeyDevice的運行原理進行一個詳盡的分析,所以這里就不重復了。
?
?89???public?IChimpDevice?waitForConnection(long?timeoutMs,?String?deviceId)??
90???{??
91?????return?this.mBackend.waitForConnection(timeoutMs,?deviceId);??
92???}??
98???public?IChimpDevice?waitForConnection()??
99???{??
100?????return?this.mBackend.waitForConnection(2147483647L,?".*");??
101???}??
代碼8-6-2 ChimpChat - waitForConnection
?
?
ChimpChat提供了兩個waitForConnection方法,其中一個是不帶參數的,相當于用戶在腳本直接調用MonkeyDevice.waitForConnection();另外一個是帶參數long類型超時和設備序列號的。無論是哪個方法ChimpChat都是很簡單只有一行,調用的是mBackend的waitForConnection,只是如果用戶沒有提供參數的話,ChimpChat會默認初始化超時和設備序列號這兩個參數,其中設備序列號會被初始化為一個正則表達式”.*”,代表任意一個首先找到的設備。這里的mBackend就是前面分析“啟動AndroidDebugBridge”的過程中實例化的AdbBackend對象,所以我們要定位到該類的waitForConnection方法。
?
116???public?IChimpDevice?waitForConnection(long?timeoutMs,?String?deviceIdRegex)??
117???{??
118?????do?{??
119???????IDevice?device?=?findAttachedDevice(deviceIdRegex);??
120???
121???????if?((device?!=?null)?&&?(device.getState()?==?IDevice.DeviceState.ONLINE))?{??
122?????????IChimpDevice?chimpDevice?=???
new?AdbChimpDevice(device);??
123?????????this.devices.add(chimpDevice);??
124?????????return?chimpDevice;??
125???????}??
126???????try??
127???????{??
128?????????Thread.sleep(200L);??
129???????}?catch?(InterruptedException?e)?{??
130?????????LOG.log(Level.SEVERE,?"Error?sleeping",?e);??
131???????}??
132???????timeoutMs?-=?200L;??
133?????}?while?(timeoutMs?>?0L);??
134??????
135???
136?????return?null;??
137???}??
代碼8-6-3 AdbBackend - waitForConnection
轉載于:https://blog.51cto.com/10988776/1732916
總結
以上是生活随笔為你收集整理的第8章6节MonkeyRunner启动运行过程-启动Monkey 2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OSChina 周日乱弹 ——已经打码请
- 下一篇: 输入验证标准