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

我们这一节会先去分析下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类的实例里面,今后需要的时候就进去拿就好了。

转载于:https://www.cnblogs.com/poptest/p/5086377.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MFC CPropertySheet 多页面切换 实例

为了能实现在同一个页面实现多个页面的切换效果。CPropertySheet要与CPropertyPage一起使用。 首先 新建一个MFC工程--MFC AppWizard(exe), 取名Pagesheet, 选择Dialog based, 然后Finish. 2. 在对话框资源中插入两个对话框IDD_DIALOG1、IDD_DIALOG2&#xff0c;作为…

ReactiveCocoa简单介绍

ReactiveCocoa 的简单介绍 http://www.jianshu.com/p/87ef6720a096

游戏提高性能 游戏降帧处理

什么是降帧&为什么降帧 一般情况下我们为了提高整个游戏的体验&#xff0c;所以我们一般会将游戏的帧数&#xff08;每秒钟刷新多少次&#xff09;设置的比较高。一般情况下&#xff0c;我们的游戏所有的代码都是一帧执行一次。为了让每一帧都变成真的关键数据帧。不过&…

delphi 更改DBGrid 颜色技巧

1、根据条件更改某一单元格的颜色 [delphi] view plaincopy procedure TMainFrm.First_DGDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if DM.FirstListStatus.AsString生产 then begin …

mfc中UpdateData的用法

http://blog.csdn.net/ddjj_1980/article/details/51452289 UpdateData(TRUE)——刷新控件的值到对应的变量。(外部输入值交给内部变量)即&#xff1a;控件的值—>变量。UpdateData(FALSE)—— 拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)即&#xff1a;…

动画类的层次结构

CASpringAnimation类是CAABasicAnimation的子类 CAPropertyAnimation &#xff1a;是CAAnimation的子类&#xff0c;它支持动画地显示图层的keyPath&#xff0c;一般不直接使用。 iOS9.0之后新增CASpringAnimation类&#xff0c;它实现弹簧效果的动画&#xff0c;是CABasicAnim…

[原]小命令大作用:modprobe

调整网络为绑定模式&#xff0c;但启动时候会报错&#xff0c;此时执行命令 modprobe bonding 可以解决问题。 之前在磁盘方面遇到问题也是通过modprobe命令解决的&#xff0c;又遇到这个命令&#xff0c;似曾相识。于是看下该命令&#xff1a; Linux命令&#xff1a;modprobe …

sql语句优化之not in

多表关联想查a表中除去b表的可用not exists 效率比not in 更高 优化后的语句用时0.421秒 select john.*, (case when round((case john.sumcount when 0 then 0 else mycount * 100 / sumcount end), 2) > 100 then 100 else round((case john.sumcount when 0 then 0 else …

setup2go制作安装程序

QT程序设计完毕时&#xff0c;我们就要发布自己的程序&#xff0c;发布程序有两种方法&#xff1a;一是静态编译&#xff0c;二是制作程序安装包。 静态编译好麻烦&#xff0c;我从来没有成功过&#xff0c;所以我用了动态编译方法&#xff0c;设计完成时&#xff0c;用release…

gson-2.2.api简单

使用gson的tojson和fromjson实现对象和json的转换 Gson gson new Gson(); // Or use new GsonBuilder().create(); MyType target new MyType(); String json gson.toJson(target); // serializes target to Json MyType target2 gson.fromJson(json, MyType.c…

用户需求、己、竞争对手的关系

图一 图二 图三 如第一图所示&#xff1a;现在在市面上的产品基本上都可以归纳为这一方面&#xff0c; 如“用户需求”是网上购物的需求&#xff0c;以“己”是京东为例子&#xff0c;“己”的…

SharePoint 入门介绍

from&#xff1a;http://www.cnblogs.com/jianyus/archive/2013/01/11/2856963.html 前言&#xff1a;接触SharePoint两年有余&#xff0c;从一开始的小白&#xff0c;变成现在的菜鸟&#xff0c;一路走来&#xff0c;学到很多&#xff0c;现在&#xff0c;想把自己知道的东西&…

AJAX-服务器响应

服务器响应 如需获得来自服务器的响应&#xff0c;请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。 属性 描述 responseText 获得字符串形式的响应数据。 responseXML 获得 XML 形式的响应数据。 responseText 属性 如果来自服务器的响应并非 XML&#xff0c…

c#下不同命名空间的引用(一个project使用另外一个project的名称空间)

http://bbs.csdn.net/topics/300089064 两个命名空间在同一个项目中时&#xff0c;没有任何问题。 若两个命名空间不在同一个项目中&#xff0c;则变成两个程序集之间的互相引用。 程序集之间的引用无所谓循环不循环的问题。 但如果两个程序集要互相引用&#xff0c;并且两个…

数据结构比较型排序算法分析及选择

比较型算法分为五类&#xff1a; 1、插入排序&#xff1a;直接插入排序、折半插入排序、希尔排序&#xff1b; 2、选择排序&#xff1a;直接选择排序、堆排序&#xff1b; 3、交换排序&#xff1a;快速排序、冒泡排序&#xff1b; 4、归并排序&#xff1b; 5、基数排序&#xf…

onreadystatechange 事件

onreadystatechange 事件 当请求被发送到服务器时&#xff0c;我们需要执行一些基于响应的任务。 每当 readyState 改变时&#xff0c;就会触发 onreadystatechange 事件。 readyState 属性存有 XMLHttpRequest 的状态信息。 下面是 XMLHttpRequest 对象的三个重要的属性&#…

Frequent Pattern 挖掘之二(FP Growth算法)(转)

FP树构造 FP Growth算法利用了巧妙的数据结构&#xff0c;大大降低了Aproir挖掘算法的代价&#xff0c;他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对。为了达到这样的效果&#xff0c;它采用了一种简洁的数据结构&#xff0c;叫做frequent-pattern tree(频繁…

C# 两个类之间传递数据

1、通过全局变量 2、通过构造函数传递参数 3、通过委托实现通过委托例子&#xff1a;WebForm1 向Class1传递参数值&#xff1a; // namespace WebApplication2{public partial class WebForm1 : System.Web.UI.Page{//step1.声明一个委托public delegate void DoSomethingEvent…

可行性研究课后题

题目: 为方便储户&#xff0c;某银行拟开发计算机储蓄管理系统。储户填写的存款单或取款单由银行柜台业务员键入系统&#xff0c;如果是存款&#xff0c;系统记录存款人姓名、住址、存款类型、存款日期、利息等信息&#xff0c;并印出存款单给储户;如果是取款&#xff0c;系统进…

jQuery语法

jQuery不是W3C标准&#xff01; jQuery使用CSS选择器来选取元素。 jQuery语法 一、jury语法是为HTML元素的选取编制的&#xff0c;可以对元素执行某些操作。 基础语法是&#xff1a;$(selector).action() .美元符号定义jQuery .选择符&#xff08;selector&#xff09;“查…