我们这一节会先去分析下monkeyrunner是如何对参数进行处理的,我们跳转到MonkeyRunnerOptions这个类里面的processOptions这个方法:

93   public static MonkeyRunnerOptions processOptions(String[] args)

94   {

95     int index = 0;

96

97     String hostname = DEFAULT_MONKEY_SERVER_ADDRESS;

98     File scriptFile = null;

99     int port = DEFAULT_MONKEY_PORT;

100     String backend = "adb";

101     Level logLevel = Level.SEVERE;

102

103     ImmutableList.Builder<File> pluginListBuilder = ImmutableList.builder();

104     ImmutableList.Builder<String> argumentBuilder = ImmutableList.builder();

105     while (index < args.length) {

106       String argument = args[(index++)];

107

108       if ("-s".equals(argument)) {

109         if (index == args.length) {

110           printUsage("Missing Server after -s");

111           return null;

112         }

113         hostname = args[(index++)];

114       }

115       else if ("-p".equals(argument))

116       {

117         if (index == args.length) {

118           printUsage("Missing Server port after -p");

119           return null;

120         }

121         port = Integer.parseInt(args[(index++)]);

122       }

123       else if ("-v".equals(argument))

124       {

125         if (index == args.length) {

126           printUsage("Missing Log Level after -v");

127           return null;

128         }

129

130         logLevel = Level.parse(args[(index++)]);

131       } else if ("-be".equals(argument))

132       {

133         if (index == args.length) {

134           printUsage("Missing backend name after -be");

135           return null;

136         }

137         backend = args[(index++)];

138       } else if ("-plugin".equals(argument))

139       {

140         if (index == args.length) {

141           printUsage("Missing plugin path after -plugin");

142           return null;

143         }

144         File plugin = new File(args[(index++)]);

145         if (!plugin.exists()) {

146           printUsage("Plugin file doesn't exist");

147           return null;

148         }

149

150         if (!plugin.canRead()) {

151           printUsage("Can't read plugin file");

152           return null;

153         }

154

155         pluginListBuilder.add(plugin);

156       } else if (!"-u".equals(argument))

157       {

158         if ((argument.startsWith("-")) && (scriptFile == null))

159         {

160

161

162           printUsage("Unrecognized argument: " + argument + ".");

163           return null;

164         }

165         if (scriptFile == null)

166         {

167

168           scriptFile = new File(argument);

169           if (!scriptFile.exists()) {

170             printUsage("Can't open specified script file");

171             return null;

172           }

173           if (!scriptFile.canRead()) {

174             printUsage("Can't open specified script file");

175             return null;

176           }

177         } else {

178           argumentBuilder.add(argument);

179         }

180       }

181     }

182

183     return new MonkeyRunnerOptions(hostname,

port,

scriptFile,

backend,

logLevel,

pluginListBuilder.build(),

argumentBuilder.build());

184   }

185 }

代码8-2-2 MonkeyRunnerOptions  - processOptions

这里首先请看99-101行的几个变量初始化,如果用户在命令行中没有指定对应的参数,那么这些默认参数就会被使用,我们且看下这些默认值分别是什么:

  • hostname:对应‘-s'参数,默认值是'127.0.0.1',也就是本机,将会forward给目标设备运行的monkey,所以加上下面的转发port等同于目标机器在listen的monkey服务
  • port :对应‘-p'参数,默认值是'12345',也就是monkey默认监听端口
  • backend :对应'-be'参数,默认值是‘adb‘,其实往后看代码我们会发现它也只是支持’adb‘而已。这里需要注意的是这是一个隐藏参数,命令行的help没有显示该参数
  • logLevel :对应‘-v'参数,默认值'SEVERE',也就是说只打印严重的log

代码往下就是对用户输入的参数的解析并保存了,这里要注意几个隐藏的参数:

  • -u :乍一看以为这是一个什么特别的参数,从156-178行可以看到这个参数处理的意义是:当用户输入'-u'的时候不会作任何处理,但当用户输入的是由‘-’开始的但又不是monkeyrunner声称支持的那几个参数的时候,就会根据不同的情况给用户报错。所以这段代码的意思其实就是在用户输入了不支持的参数的时候根据不同的情况给用户提示而已
  • -be :backend,如前所述,只支持‘adb'
  • -plugin :这里需要一个背景知识,在google官网有说明,用户可以通过遵循一定的规范去编写插件来扩展monkeyrunner的功能,比如在monkeydevice里面按下这个动作是需要通过MonkeyDevice.DOWN这个参数来传给press这个方法的,如果你觉得这样子不好,你希望增加个pressDown这样的方法,里面默认就是用MonkeyDevice.DOWN来驱动MonkeyDevice的press方法,而用户只需要给出坐标点就可以了,那么你就可以遵循google描述的规范去编写一个这方面的插件,到时使用的时候就可以通过python方式直接import进来使用了。本书并不会把MonkeyRunner插件进行重点介绍。

在解析出所有的参数之后,processOptions方法最后根据这些参数来初始化MonkeyRunnerOptions类。我们进入到该构造函数看下它究竟做了什么事情:

38   private MonkeyRunnerOptions(String hostname, int port, File scriptFile, String backend, Level logLevel, Collection<File> plugins, Collection<String> arguments)

39   {

40     this.hostname = hostname;

41     this.port = port;

42     this.scriptFile = scriptFile;

43     this.backend = backend;

44     this.logLevel = logLevel;

45     this.plugins = plugins;

46     this.arguments = arguments;

47   }

代码8-2-3 MonkeyRunnerOptions - 构造函数

所做的事情非常简单,就是把解析出来的所有参数保存到MonkeyRunnerOptions类的实例里面,今后需要的时候就进去拿就好了。

老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数 2的更多相关文章

  1. 第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数

    MonkeyRunnerStarter是MonkeyRunner启动时的入口类,由于它里面包括了main方法.它的整个启动过程主要做了以下几件事情: 解析用户启动MonkeyRunner时从命令行传输 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. MySQL主从复制的原理和实践操作

    MySQL 主从(MySQL Replication),主要用于 MySQL 的实时备份.高可用HA.读写分离.在配置主从复制之前需要先准备 2 台 MySQL 服务器. 一.MySQL主从原理 1. ...

  2. ldd获得可执行程序的所有库并输出到指定目录

    #!/bin/bash ########################################################################## #ldd可以查看程序的库依 ...

  3. Tomcat 实现热部署

      热部署概念   热部署是指在你对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效,配置文件的修改除外     热部署好处   每次打增量包的时候就不用重新启动tomcat了   ...

  4. IDEA下创建Maven项目,并整合使用Spring、Spring MVC、Mybatis框架

    项目创建 本项目使用的是IDEA 2016创建. 首先电脑安装Maven,接着打开IDEA新建一个project,选择Maven,选择图中所选项,下一步. 填写好GroupId和ArtifactId, ...

  5. 每天一个linux命令(32)--/etc/group文件详解

    Linux /etc/group 文件与 /etc/passwd 和/etc/shadow 文件都是有关于系统管理员对用户和用户组管理时相关的文件.Linux /etc/group 文件是有关于系统管 ...

  6. 每天一个Linux命令(06)--rmdir命令

    终于忙完了公司的事,可以安静的充充电了. 今天学习一下Linux中命令:rmdir 命令,rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm -r dir 命 ...

  7. Asp.Net 常用工具类之Office-文档操作(6)

    文档一直是老大难问题,君不知,代码用时方恨少!有一套成熟的文件帮助类能很大程度上减少寻找各种资料的时间. 记得以前做一个业务,需要导出协议,一份可编辑,一份不可编辑.那么Word和PDF是最好的选择, ...

  8. HTTPS 为什么更安全,先了解一下密码学的这些原理

    HTTPS 是建立在密码学基础之上的一种安全通信协议,严格来说是基于 HTTP 协议和 SSL/TLS 的组合.理解 HTTPS 之前有必要弄清楚一些密码学的相关基础概念,比如:明文.密文.密码.密钥 ...

  9. 3101: N皇后

    3101: N皇后 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 88  Solved: 41[Submit][S ...

  10. 1653: [Usaco2006 Feb]Backward Digit Sums

    1653: [Usaco2006 Feb]Backward Digit Sums Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 285  Solved:  ...