在获得比对设备序列号后,findAttachedDevice就会跟提供的序列号进行比对,如果吻合就返回给调用者” 代码8-6-3 AdbBackend - waitForConnection”了。而AdbBackend的waitForConnection在获得这个Device实例后就会把它传到AdbChimpDevice的构造函数中来构造AdbChimpDevice的实例对象。我们看看它的构造函数是怎么做的:

68   public AdbChimpDevice(IDevice device)

69   {

70     this.device = device;

71     this.manager = createManager("127.0.0.1", 12345);

72

73     Preconditions.checkNotNull(this.manager);

74   }

代码8-6-8 AdbChimpDevice构造函数

如前面一直强调的,AdbChimpDevice是一个很重要的类,它是一个高层抽象的设备对象,它组合了代表通过monkey控制的设备ChimpManager和通过ADB控制的设备Device。这个组合关系就是通过上面这个AdnbChimpDevice构造函数体现出来的了。第70行组合的就是Device设备,71行组合的就是ChimpManager实例。只是Device实例是在启动设备监控线程DeviceMonitor中就已经实例化创建好的,而ChimpManager是在这个时候才进行创建的。创建的时候指定的是本机回环IP地址”127.0.0.1”,端口指定是monkey本地转发端口12345

创建ChimpManager的调用createManager的代码有点长,我们会分两部分来进行分析,其中第一部分是启动Monkey,第二部分是创建ChimpManager。我们先看第一部分:

123   private ChimpManager createManager(String address, int port) {

124     try {

125       this.device.createForward(port, port);

126     } catch (TimeoutException e) {

127       LOG.log(Level.SEVERE, "Timeout creating adb port forwarding", e);

128       return null;

129     } catch (AdbCommandRejectedException e) {

130       LOG.log(Level.SEVERE, "Adb rejected adb port forwarding command: " + e.getMessage(), e);

131       return null;

132     } catch (IOException e) {

133       LOG.log(Level.SEVERE, "Unable to create adb port forwarding: " + e.getMessage(), e);

134       return null;

135     }

136

137     String command = "monkey --port " + port;

138     executeAsyncCommand(command, new LoggingOutputReceiver(LOG, Level.FINE));

139

140     try

141     {

142       Thread.sleep(1000L);

143     } catch (InterruptedException e) {

144       LOG.log(Level.SEVERE, "Unable to sleep", e);

145     }

146     InetAddress addr;

147     try

148     {

149       addr = InetAddress.getByName(address);

150     } catch (UnknownHostException e) {

151       LOG.log(Level.SEVERE, "Unable to convert address into InetAddress: " + address, e);

152       return null;

153     }

...

}

代码8-6-9 AdbChimpDevice - createManager之启动monkey

createManager首先做的事情就是去把目标设备端的monkey服务进程给启动起来接收MonkeyRunner测试脚本发送过去的请求。代码流程如下所示:

  • 125行: 设置本机到目标机器monkey进程监听端口的端口转发,调用的是Device的createForward的方法,这个方法我们在下一章描述Device类详解的时候会进行分析。这里只需要它基本可以看作是在命令行发送”adb forward 12345 12345“来完成从本机12345端口到远程monkey监控的12345端口的转发就好了。设置好端口转发后往下的代码就能直接连接本机的12345端口,这就等同于连上的是远端目标设备中monkey监听的12345端口了
  • 139-138行: 设置好monkey端口转发后,createManager方法就会往ADB服务器发送shell命令”monkey --port 12345”来启动monkey去监听端口12345。发送adb shell命令使用的方法是createAsyncCommand方法,其实该方法没有什么好分析的,因为它把发送命令请求直接转发给Device类的executeShellCommand而已,而executeShellCommand这个方法我们也是在下一章会进行分析
  • 149行: 将本机监听地址“127.0.0.1”转换成InetAddress对象格式,这样往下创建Socket连接的时候才能直接使用

createManager之启动monkey到了这里就完成了,往下我们继续看第二部分createManager之创建ChimpManager:

123   private ChimpManager createManager(String address, int port) {

... //启动monkey代码略

159     boolean success = false;

160     ChimpManager mm = null;

161     long start = System.currentTimeMillis();

162

163     while (!success) {

164       long now = System.currentTimeMillis();

165       long diff = now - start;

166       if (diff > 30000L) {

167         LOG.severe("Timeout while trying to create chimp mananger");

168         return null;

169       }

170       try

171       {

172         Thread.sleep(1000L);

173       } catch (InterruptedException e) {

174         LOG.log(Level.SEVERE, "Unable to sleep", e);

175       }

176       Socket monkeySocket;

177       try

178       {

179         monkeySocket = new Socket(addr, port);

180       } catch (IOException e) {

181         LOG.log(Level.FINE, "Unable to connect socket", e);

182         success = false; }

183       continue;

184

185       try

186       {

187         mm = new ChimpManager(monkeySocket);

188       } catch (IOException e) {

189         LOG.log(Level.SEVERE, "Unable to open writer and reader to socket"); }

190       continue;

191

192       try

193       {

194         mm.wake();

195       } catch (IOException e) {

196         LOG.log(Level.FINE, "Unable to wake up device", e);

197         success = false; }

198       continue;

199

200       success = true;

201     }

202

203     return mm;

}

代码8-6-10 AdbChimpDevice - createManager之创建ChimpManager

其实上面一堆代码无非是在一个循环中做了3个事情:

  • 179行:  创建连接到本机monkey转发端口的Socket对象
  • 187行:  根据该Socket对象构造ChimpManager实例,ChimpManager的详细分析会放到下一章的描述ChimpManager类详解的时候进行分析
  • 194行:  往monkey发送命令去唤醒休眠屏幕,如果屏幕是在休眠状态的话。wake的原理也会在下一章进行分析

分析到这里这一小节的目标就已经达到了,我们已经学习到了monkey服务进程是如何在脚本中通过调用MonkeyRunner的waitForConnection方法启动起来的了,同时我们也学习到了AdbChimpDevice和ChimpManager这两个关键类创建的相关知识点。

下一小节我们来尝试把本章学到的内容进行一个总结。

老李推荐:第8章6节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动Monkey 4的更多相关文章

  1. 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件

    老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...

  2. 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态

    老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态   poptest是国内唯一 ...

  3. 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer

    老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer   poptest是国内唯一一家培养 ...

  4. 老李推荐:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化

    老李推荐:第14章3节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer实例化 poptest是国内唯一一家培养测试开发工程师的培 ...

  5. 老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述

    老李推荐: 第14章2节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer架构概述   HierarchyViewer库的引入让M ...

  6. 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程

    老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程   poptest是国内唯一一家培养测试开发工程师的培训机 ...

  7. 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结

    老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

  8. 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本

    老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...

  9. 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  10. 老李推荐:第8章1节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行环境初始化

    老李推荐:第8章1节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行环境初始化   首先大家应该清楚的一点是,MonkeyRunner的运行是牵涉到主机端和目 ...

随机推荐

  1. [Spark] - Spark部署安装

    环境:centos6.0 虚拟机 搭建单机版本的spark 前提条件:搭建好hadoop环境 1. 下载scala进行安装 只需要设置环境变量SCALA_HOME和PATH即可 export SCAL ...

  2. typedef struct 是什么意思

    typedef用于定义一种新类型例如定义了如下的结构typedef struct student{int age;int score;}STUDENT;那么则有STUDENT stu1;就相当于str ...

  3. 利用AForge.NET 调用电脑摄像头进行拍照

    当然了,你需要去官网下载类库,http://www.aforgenet.com/ 调用本机摄像头常用的组件: AForge AForge.Controls AForge.Imaging AForge. ...

  4. Raid0、Raid1、Raid0+1、Raid3和Raid5 几种磁盘阵列区别

    前两天发现服务器挂了,到机房重启时发现硬盘挂载不上,虽然是开发,但是在交接工作的时候被告知了一点硬件的知识,判断出是硬盘故障.这个呵呵了,修不来只能找服务器售后来换硬盘或是维修了. 关于怎么诊断出硬盘 ...

  5. SDOI Day1

    好了做了SDOI day1的3道题,来讲下做法及感想吧 T1:排序(暴力,搜索) 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3990 我们可 ...

  6. Linux学习笔记(1)

    一.介绍 Linux系统作为服务器操作器的两大优点是其稳定性以及安全性:常见的Linux系统有以下几种: Debian(1993年下半年出的Linux分支) Ubuntu(目前互联网公司使用的比较多的 ...

  7. 用友财务软件U8V10.1虚拟机 及培训视频

    需要学习用友财务软件U8V10.1虚拟机 及培训视频 ,请联系QQ:858-048-581 虚拟机系统为WIN2003+SQLSERVER2008+U8V10.1,虚拟机内存最少需要2G

  8. 微信群之Java技术红包问答

    缘起 年前公司拿到B+轮融资,相应的在战略上也做了很大的调整,毕竟B轮要做的事情不仅仅是增加用户数,于是乎公司在2017年的开头补充了一部分技术团队,这次人员选择上主要针对一些工作经验在1-2年的技术 ...

  9. 每天一个linux命令(46)--rcp命令

    rcp代表“remote file copy”(远程文件拷贝).该命令用于在计算机之间拷贝文件.rcp命令有两种格式.第一种格式用于文件到文件的拷贝,第二种格式用于文件或目录拷贝到另一个目录中. 1. ...

  10. 关于input只能输入数字的两种小方法

    第一种: 直接给input标签 name赋值如下 <input name="start_price" id="start_price" type=&quo ...