第6章4节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
在第2节中我们看到了MonkeySourceNetwork是怎样从Socket中获取MonkeyRunner发送过来的命令字串的,可是最后怎样将它翻译成事件的代码我们还没有进行分析,由于在那之前我们还没有了解命令翻译类的相关知识。那么经过第3小节对命令翻译类的学习后,我们就能够继续往下分析MonkeySourceNetwork的getNextEvent中是怎样翻译命令字串的了。
我们回看下第2小节,最后在获得命令字串之后调用的是MonkeySourceNetwork类的translateCommand方法:
653 private void translateCommand(String commandLine)
654 {
655 Log.d("MonkeyStub", "translateCommand: " + commandLine);
656 List<String> parts = commandLineSplit(commandLine);
657 if (parts.size() > 0) {
658 MonkeyCommand command = (MonkeyCommand)COMMAND_MAP.get(parts.get(0));
659 if (command != null) {
660 MonkeyCommandReturn ret = command.translateCommand(parts, this.commandQueue);
661 handleReturn(ret);
662 }
663 }
664 }
代码6-4-1 MonkeySourceNetwork - translateCommand
- 653行: 传进来的參数就是一个命令字串。
通过” 表3-3-1 命令字串和相应的命令翻译类參照表”我们能够看到一个命令字串假设带有參数的话它的形式可能是这种“type line”
- 656行: 为了方便使用该命令。通过调用commandLineSplit方法把命令字串转换成一个列表分别把命令。每一个參数都独立保存在列表里面。
这种方法无非就是依据空格等把命令和參数分解出来。所以就不跟踪进去分析了
- 658行: 将命令和參数分离分别存放到列表后,依据命令去” 代码3-1-2 MonkeySourceNetwork - COMMAND_MAP”所描写叙述的COMMAND_MAP去查找相应的命令翻译类实例。以上面的”touch x y”命令字串为例,就是依据”type”去COMMAND_MAP中查找,相应的将是这一行:
461 COMMAND_MAP.put("type", new TypeCommand());
也就是说找到的相应的命令翻译类是TypeCommand
- 660行:调用命令翻译类的translateCommand方法来翻译命令列表,注意这里传进去的參数除了命令字串列表之外另一个MonkeySourceNetwork的成员变量commandQueue,也就是我们一直说的命令队列,传进去的目的就是在解析命令的过程中假设须要创建一个相应事件实例的话,那么创建完后就直接往这个同一个的命令队列里面丢即可了
那么往下我们就看下上面的TypeCommand的translateCommand方法是怎样实现的:
294 public MonkeyCommandReturn translateCommand(List<String> command,
295 CommandQueue queue) {
296 if (command.size() == 2) {
297 String str = command.get(1);
298
299 char[] chars = str.toString().toCharArray();
300
301 // Convert the string to an array of KeyEvent's for
302 // the built in keymap.
303 KeyCharacterMap keyCharacterMap = KeyCharacterMap.
304 load(KeyCharacterMap.VIRTUAL_KEYBOARD);
305 KeyEvent[] events = keyCharacterMap.getEvents(chars);
306
307 // enqueue all the events we just got.
308 for (KeyEvent event : events) {
309 queue.enqueueEvent(new MonkeyKeyEvent(event));
310 }
311 return OK;
312 }
313 return EARG;
314 }
代码6-4-2 TypeCommand - translateCommand
- 299-299行: 在命令字串列表中取得type命令的參数line,也就是一大串须要输入的字符串了。然后把该字符串每一个字符拆散开来建立一个字符数组chars,由于以下获得每一个字符相应的系统按键事件KeyEvent的的方法接受的參数就是字符数组
- 304-305行: KeyCharacterMap的getEvents方法官方的解析是用来依据提供的字符数据流生成一个相应按键事件数组,所以这里的意义就是为输入字串的每一个字符都产生一个按键事件,然后组织成一个按键事件队列返回给events变量。
这里须要提下的是KeyEvent在Android系统中代表一个按键事件,它内部拥有的每一个按键相应的值以及按键相应的Action如ACTION_DOWN/ACTION_UP等等的定义
- 308-309行: 依据按键事件创建一个MonkeyKeyEvent实例,并把该事件放到传进来的命令队列里面等待运行
这一小节结合TypeCommand这个命令翻译类我们看到了MonkeySourceNetwork从网络获得一个字串命令后是怎样通过调用自身的translateCommand方法来解析出里面的命令和參数,然后依据命令来查找COMMAND_MAP来获得相应的命令翻译类实例。最后通过命令翻译类的translateCommand来依据命令字串创建相应的MonkeyEvent的并把它增加到命令队列中。
在下一小节我们就去学习下这个MonkeyEvent和命令队列的相关知识。
注:很多其它文章请关注公众号:techgogogo或个人博客http://techgogogo.com。当然,也很欢迎您直接微信(zhubaitian1)勾搭。
本文由天地会珠海分舵原创。转载请自觉,是否投诉维权看心情。
第6章4节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串的更多相关文章
- 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...
- 第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览
在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事 ...
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ...
- 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结 本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...
- 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...
- 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列
老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列 事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...
- 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件
老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件 从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...
- 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类
老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类 每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...
- 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串
老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串 从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...
随机推荐
- 数字信号处理C语言集(1.1 随机数的产生)
main.cpp 所建工程文件如下图所示 uniform.h #ifndef _UNIFORM_H_ #define _UNIFORM_H_ double uniform(double a,doub ...
- HMACSHA256 Class
https://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha256(v=vs.110).aspx Comp ...
- 分享关于浏览器对象 history对象
window.history.forward() == window.history.go(-1) //返回下一页 window.history.back() == window.history.go ...
- sublime text 2 licence
----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC ...
- 学习参考《TensorFlow深度学习》高清中文版PDF+英文版PDF+源代码
我们知道,TensorFlow是比较流行的深度学习框架,除了看手册文档外,推荐大家看看<Tensorflow深度学习>,共分5方面内容:基础知识.关键模块.算法模型.内核揭秘.生态发展.前 ...
- JAVA基础数据类型
JAVA的数据类型粗略分两种 1.基本数据类型 整数类型: byte,short,int,long 浮点类型: float,double 字符类型: char 布尔类型: boolean 基本语法格式 ...
- Linux学习总结(2)——linux常用命令大全
玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...
- HDU 1668 Islands and Bridges
Islands and Bridges Time Limit: 4000ms Memory Limit: 65536KB This problem will be judged on HDU. Ori ...
- CentOS下安装.net core环境并部署WebAPI
1.安装CentOS 7 2.安装.net Core 2环境,参考官方文档:(建议采用SDK (tar.gz)安装) https://www.microsoft.com/net/download/li ...
- ZOJ 1654 Place the Robots(放置机器人)------最大独立集
Place the Robots http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1654 Time Limit: 5 Sec ...