时间:2015-03-12 来源:

第5章4节《MonkeyRunner源码剖析》Monkey原理分析-启动运行:命令行参数解析(原创) 【互联网】

天地会珠海分舵注:本来这一系列是准备出一本书的承接网页制作,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“.但因为诸多原因,承接网页制作没有如愿.所以这里把草稿分享出来,html静态页面制作所以错误在所难免.有需要的就参考下吧,网站div+css转发的话还请保留每篇文章结尾的出处等信息.

1157 /** 1158 * Returns a long converted from the next data argument, with error handling 1159 * if not available. 1160 * 1161 * @param opt The name of the option. 1162 * @return Returns a long converted from the argument. 1163 */ 1164 private long nextOptionLong(final String opt) { 1165 long result; 1166 try { 1167 result = Long.parseLong(nextOptionData()); 1168 } catch (NumberFormatException e) { 1169 System.err.println("** Error: " + opt + " is not a number"); 1170 throw e; 1171 } 1172 return result; 1173 } 重点在1167行,手机html制作通过nextOptionData的调用获得字串类型的命令行参数值网页外包接活,然后通过Long的parseLong方法来将该字串转成长整型的目标值.

1118-1120行: 已经没有额外的参数需要处理,网页外包接活返回null代表无效

代码5-4-2 Monkey - run 初始化命令

图5-4-1 monkey支持命令选项

mNextArg: 相当于数组的一个游标web前端制作,代表当前分析到第几个参数了

1121行: 根据当前游标获得需要分析的当前参数选项

不知道大家在前面nextOption分析中有没有注意到一点,div+css制作凡是参数选项和参数值合并在一起的情况(比如-zARGS),该方法都会在获得需要的参数选项(比如-z)的同时,承接网页制作把参数值(ARGS)也一并分析出来并保存在本Monkey类的成员变量mCurArgData成员变量里面;而凡是参数选项和参数值分开的情况(比如-z ARGS),该nextOption方法都只是把参数选项给分析出来,web切图报价而把mCurArgData设置成null.其实下面我们要分析的nextOptionData就是要根据这两种情况来获得对应的参数选项的参数值的.

例如713-714行就是去处理MonkeyRunner启动monkey的命令”monkey -port 12345”传过来的参数”-port 12345”的关键符合w3c标准,它判断如果参数是”–port”的话,html切图制作就会去取得紧跟着这个参数选项的参数值网页外包接活,然后把它保存到Monkey的成员变量mServerPort里面以供今后使用.注意这里的nextOptionLong方法的参数“Server port to listen on for commands”其实只是调试用途而已.

这里只是以”monkey -port 12345”作为一个情景分析了monkey是如何进行命令行参数解析的web前端制作,至于其他的参数解析原理是相同的,web前端制作这里就不一一解析了承接网页制作,以下贴出monkey帮助命令打印出来的帮助文档,div前端切图大家可以看下monkey都支持哪些命令行参数选项:

还是以命令”monkey –port 12345”这个命令为例子.在通过nextOption方法获得对应的参数选项如”–port”之后web切图报价,跟着需要做的就是去获得对应的“12345”这个参数选项值了.这里12345被认为是一个长整型的数值,web切图报价所以调用的是nextOptionLong这个方法.

-z ARGS : 代表命令行选项”-z”且选项值是”ARGS”,值是种子数100

1141 /** 1142 * Return the next data associated with the current option. 1143 * 1144 * @return Returns the data string, or null of there are no more arguments. 1145 */ 1146 private String nextOptionData() { 1147 if (mCurArgData != null) { 1148 return mCurArgData; 1149 } 1150 if (mNextArg >= mArgs.length) { 1151 return null; 1152 } 1153 String data = mArgs[mNextArg]; 1154 mNextArg++; 1155 return data; 1156 } 该方法所做的事情主要就是如前所说的根据mCurArgData这个用来保存参数值的成员变量是否为null(也就是说在之前的nextOption获取参数选项的方法中是否已经顺便把参数值一并获取了)而分不同的方法来获得参数选项对应的参数值:

414 /** 415 * Command-line entry point. 416 * 417 * @param args The command-line arguments 418 */ 419 public static void main(String[] args) { 420 // Set the process name showing in "ps" or "top" 421 Process.setArgV0("com.android.commands.monkey"); 422 int resultCode = (new Monkey()).run(args); 423 System.exit(resultCode); 424 } 重点代码422行首先会去创建一个Monkey类的实例,jpg或psd转html然后调用run成员方法.这个成员方法比较长web前端制作,做了很多事情,web前端制作往下会慢慢为你一一道来.其中做的事情之一就是在开始时调用processOptions方法来解析命令行参数.

425 /** 426 * Run the command! 427 * 428 * @param args The command-line arguments 429 * @return Returns a posix-style result code. 0 for no error. 430 */ 431 private int run(String[] args) 432 { ...//省略其他一些成员变量的初始化 444 this.mArgs = args; 445 this.mNextArg = 0; ...//省略其他一些成员变量的初始化 450 if (!processOptions()) { 451 return -1; 452 } ...//其他关键方法将在今后小节进行分析承接网页制作,这里先略过 } 代码第450行之前做的都是一些成员变量初始化的动作,承接网页制作初始化后就会调用450行的processOptions进行真正的命令行参数解析并设置真正的来自命令行的成员变量.注意第444行会把来自命令行的参数数组赋给Monkey实例的mArgs成员变量保存起来web切图报价,这个变量是用来遍历mArgs这个命令行参数数组的.

最后我们看下nextOption是如何从mArgs数组中根据当前mNextArg的数组游标来来获得下一个参数选项符合w3c标准,以及与其对应的nextOptionLong是如何取得对应的下一个参数选贤的参数值的.我们先看nextOption:

代码5-4-4 Monkey - nextOption

知道了monkey支持的命令行格式之后,手机html制作还是有必要对nextOption方法用到的几个Monkey类的成员变量做一些解析:

以下是这个方法的分析网页外包接活,大意就是从mArgs命令行参数数组中取得一个参数,网页外包接活然后经过一系列的判断是否合法web前端制作,最后如果合法的话就直接返回.分析过程中大家需要注意的是,div+css制作整个方法做的事情是取得参数选项承接网页制作,而不是取得参数值,承接网页制作所以不要被参数值ARGS给影响你的理解web切图报价,该ARGS是由其他nextOptionXXX方法来获得的,web切图报价比如下一个将要分析的去获得Long类型的参数值的方法nextOptionLong,而不是在这里.

mCurArgData: 于某个参数选项对应的参数值

1129-1132行: 处理的是”-zARGS”这种情况,html切图制作把命令行参数选项和参数值都同时解析出来了网页外包接活,参数值是保存在Monkey成员变量mCurArgData里面,网页外包接活 以便在processOption的while循环体中调用如nextOptionLong等方法时直接从Monkey的mCurArgData中获得命令行参数值

代码5-4-6 Monkey - nextOptionData

632 /** 633 * Process the command-line options 634 * 635 * @return Returns true if options were parsed with no apparent errors. 636 */ 637 private boolean processOptions() { ... 644 String opt; 645 while ((opt = nextOption()) != null) 646 if (opt.equals("-s")) { 647 this.mSeed = nextOptionLong("Seed"); 648 } ...//省略类似处理代码 713 else if (opt.equals("--port")) { 714 this.mServerPort = ((int)nextOptionLong("Server\ port to listen on for commands")); 715 } ...//省略类似处理代码 742 } ... 765 return true; 766 } 代码从645行开始到742行会执行一个while循环web前端制作,每循环一次都会调用nextOption方法取一个命令行参数选项进来进行解析,web前端制作与之对应的是取该命令行的参数值的方法nextOptionXXX等承接网页制作, 2); 1133 } else { 1134 mCurArgData = null; 1135 return arg; 1136 } 1137 } 1138 mCurArgData = null; 1139 return arg; 1140 } mArgs成员变量是一个String类型的数组web切图报价,从本节上面的分析可以知道命令行传进来的参数列表是被保存在里面的.这段代码比较短也比较简单.分析之前我们先对monkey支持的命令行格式进行一些描述,web切图报价这样大家就很容易看明白这些代码的意思了:

-z : 代表命令行选项”-z”

-zARGS : 同上符合w3c标准,根据前面参数格式的描述网页外包接活,代表需要停止往下处理选项,jpg或psd转html返回null代表参数无效

其中 “–port”选项就是去指定monkey服务需要监听的端口web前端制作,这样客户端就可以连接上来跟monkey服务进行通信了.

代码5-4-5 Monkey - nextOptionLong

1147-1149行:先去看看mCurArgData这个变量在nextOption中有没有被设置成真实的参数值,web前端制作也就是说在1147行检查下mCurArgData是否为null,如果不是的话代表在nextOption分析参数选项的时候已经把参数值也一并分析出来了,承接网页制作所以这里只需要直接返回这个值就行了.

1122-1124行: 参数不是以”-”开始web切图报价,返回null代表无效

设置好Monkey的CLASSPATH环境变量以指定”/system/framework /framework/monkey.jar“后,网站div+css/system/bin/monkey这个shell脚本就会通过app_process命令指定monkey的入口类” “com.android.commands.monkey.Monkey”找到main函数开始运行.在运行之前会有一些初始化的工作需要做符合w3c标准,其中很重要的一项就是去把用户提供的命令行选项以及参数值给解析出来.

1153行:如果mCurArgData为null的话代表对应参数选项的参数值还没有解析出来,手机html制作那么就直接使用上面nextOption已经调整好的游标mNextArg来从命令行参数数组mArgs中取得对应的参数值网页外包接活,然后返回给调用者.

代码5-4-3 Monkey - processOptions

1134-1135行: 处理的是”-z”和”-z ARGS”的情况,网页外包接活把参数值设置为null,以便在processOption的while循环体中调用如nextOptionLong等方法来决定是否需要解析获得参数值还是直接从mCurArgData中获得命令行参数值.最后在1135行把参数选项”-z”返回

–zz : 代表命令行选项“-zz”

– : 代表停止往下处理选项

下面我们开始对Monkey应用的源代码进行分析,div+css制作首先这里我们先进入到Monkey类的main函数:

——— 未完待续———

代码5-4-1 Monkey - Main

1138-1139行: 最后处理的是”-zz”和”-zz ARGS”选项承接网页制作,指向参数选项/参数值web切图报价,具体是参数选项还是参数值要看该参数的编写方法是”-zARGS”的形式还是“-z ARGS”的形式.比如以”–port 12345 –wait-dbg”为例,web切图报价如果当前需要分析的是”–port”,那么执行这一行后就会将游标指向”12345”这一个参数值了.在我们往下需要分析的nextOptionLong方法中就会根据这个mNextArg游标把该数值取出来,html切图制作并把游标再指向下一行网页外包接活,也就是这里的”–wait-dbg”选项,网页外包接活这样在下一个netOption的调用中web前端制作,1121行就能继续取出”–wait-dbg”这个当前选项进行新一轮的分析了

mArgs: 保存的是用户传进来的命令行参数选项和值的一个数组

1154行:调整游标到指向下一个参数选项,web前端制作以便在下一个nextOption中获取参数选项列表mArgs中的下一个选项进行分析.还是以前面的”monkey –port 12345 –wait-dbg”为例承接网页制作,前面的nextOption获取到了”–port”这个参数选项,div前端切图而这里的nextOptionData是把对应的参数值”12345“解析出来web切图报价,然后就会通过1154这一行代码把游标指向”–wait-dbg”这个选项.

1155行:把参数值返回给调用者.在上面的例子中就是把“12345”这个监听端口返回给本小节开始前分析的processOption这个方法,web切图报价然后在把该端口保存到mServerPort这个成员变量里面符合w3c标准,具体代码请查看前面该方法的714行代码的分析.

nextOptionLong方法: 代表要获得参数值是一个数字类型的值,手机html制作比如”monkey –port 12345”中的12345.

作者:天地会珠海分舵 微信公众号:TechGoGoGo 微博:http://weibo.com/techgogogo CSDN:http://blog.csdn.net/zhubaitian

$(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

点击次数:8730
作者:
web前端行业资讯
Web new NewsList
谷歌发布Tacotron2:能更简单地训练AI学习演讲 ,,2017年12月21日TensorFlow漏洞爆发背后:关于AI安全我们的傻与天真 ,,2017年12月21日Android端Edge浏览器新版发布:常规性能优化和BUG修复 ,,2017年12月21日三星开发出全球最小的DRAM芯片技术领先优势扩大 ,,2017年12月21日腾讯绝艺AI下一步将学习AlphaGozero自对弈训练 ,,2017年12月21日Facebook社交VR应用Spaces扩大覆盖面:入驻HTCVive ,,2017年12月21日设计图曝光:三星双屏折叠手机原来是这样的 ,,2017年12月21日微信支付和支付宝已成为世界移动支付的"老师" ,,2017年12月21日新专利表明FaceID未来有望装备在iPad、MacBook和iMac等设备 ,,2017年12月21日首批九个建议加入EE4J的项目 ,,2017年12月21日这就是SurfacePhone?微软可折叠手机概念图曝光 ,,2017年12月21日继“Angel”开源后,腾讯又开放TDinsight机器学习平台 ,,2017年12月21日谷歌母公司研发“闪光”网络技术无需铺设线缆 ,,2017年12月21日微软投资5千万美元利用人工智能对抗气候变化 ,,2017年12月21日谷歌中国2017:面向开发者的1年AI先行的1年 ,,2017年12月21日GreenKey加入Symphony软件基金会,将开源语音软件 ,,2017年12月21日腾讯发现者揭秘:怎么应对TensorFlow的安全风险,修复有多难 ,,2017年12月21日清华新成立两大交叉研究机构探索智能与未来 ,,2017年12月21日微软将AI融入生产力工具和搜索引擎与其它巨头竞争 ,,2017年12月21日Gfycat将利用机器学习技术创建高分辨率GIF动图 ,,2017年12月21日安全软件公司Avast开源化机器码反编译器RetDec ,,2017年12月21日谷歌开源TFGAN,让训练和评估GAN变得更加简单 ,,2017年12月21日社区对模块化不感兴趣时隔三周经典版FedoraServer27发布 ,,2017年12月21日Windows10加入OpenSSH客户端 ,,2017年12月21日FirefoxQuantum发布一个月安装量1.7亿 ,,2017年12月21日吴恩达宣布创业新项目已与富士康达成战略合作 ,,2017年12月21日Scala入门系列(十二):隐式转换2017年12月20日speedment入门教程2017年12月20日SLAM入门笔记(1):特征点的匹配2017年12月20日深入浅出了解frame和bounds2017年12月20日POJ2965-ThePilotsBrothers'refrigerator(贪心+枚举)【综合】2015年01月12日hibernate关联映射 【系统运维】2015年06月12日【AndroidStudio安装配置及第一次新建项目gradle配置介绍】(附最新as安装包及Gradle离线包) 【Web前端】2015年04月07日Photoshop制作扩音器教程2014年01月28日DesignPattern_Java:BuilderPattern 【架构设计】2015年08月24日清华某面霸收集的世界500强公司面试题目和点评【架构设计】2014年12月10日Android=》Nitification 【架构设计】2015年01月27日【WebAPI】WebAPI2深入系列(3)激活HttpController2016年10月12日JavaScript语言实现类似这样的效果:3.grams.flour【系统运维】2015年02月04日我是如何开始去了解Python函数式编程--Python函数式编程初涉 【编程语言】2015年08月03日Nginx在Linux下的安装部署 【移动开发】2015年07月24日智能社区--HI3516C可视门禁研发出来咯 【编程语言】2015年07月20日微信客户端自带的JsApi:WeixinJSBridge 【编程语言】2015年01月07日龙曲线 【综合】2015年07月13日基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有测试代码(何志雄)【编程语言】2015年06月05日Lex与Yacc学习(七)之环境配置另一种方式 【综合】2015年01月24日ibatis的queryForMap方法的使用与实现 【架构设计】2015年03月11日iOS异常处理 【Web前端】2015年03月27日桌面中心(一)创建数据库2014年01月29日ASIHttpRequest封装【编程语言】2014年11月24日pku3468----成段更新区间求和【编程语言】2015年03月30日POJ3169Layout(差分约束系统+Bellman-ford算法)【综合】2015年01月30日推荐8款免费的Web安全测试工具 1,收藏 ,,2016年06月23日基于SIP和RTP协议的开源VOIP之QuteCom简介【移动开发】2014年11月04日文字型LOGO设计的三十种小技巧总结2014年01月28日完全平方数的个数【综合】2014年12月16日css3jQuery实现3d搜索框+为空判断 【系统运维】2015年06月11日使用js设置url参数2014年01月29日用好LLDB调试,其乐无穷 【移动开发】2015年04月29日YT14-先来练练手之三角形分区 【编程语言】2015年01月27日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)