在第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原理分析-事件源-事件源概览-翻译命令字串的更多相关文章

  1. 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串

    老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...

  2. 第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览

    在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事 ...

  3. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用   上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ...

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

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

  5. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

    老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...

  6. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列

    老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列   事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...

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

    老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件   从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...

  8. 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类

    老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类   每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...

  9. 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串

    老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串   从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...

随机推荐

  1. Exception: Operation xx of contract xx specifies multiple request body parameters to be serialized without any wrapper elements.

    Operation 'CreateProductCodeStock' of contract 'IChileService' specifies multiple request body param ...

  2. js插件---图片懒加载lazyload

    js插件---图片懒加载lazyload 一.总结 一句话总结:使用异常简单,src里面放加载的图片,data-original里面放原图片,不懂的位置去官网或者github找API就好. 1.laz ...

  3. gym 100735I

    Description standard input/outputStatements You are given three numbers. Is there a way to replace v ...

  4. docker升级&加速器配置

    默认使用yum或者apt安装的docker版本较老,可以通过以下方式进行升级: 1.卸载旧版本 [root@CentOS702 ~]# centos 7.3卸载docker[root@CentOS70 ...

  5. ORA-4031错误 解决方法

    遇到ORA-4031错误时.你的心里会不会发怵?ORA-4031非常easy导致数据库出现异常崩溃,当Oracle的核心进程无法获得共享池内存时.它们会把数据库异常宕掉.当然,ORA-4031就像黄灯 ...

  6. poi excel自己主动转换成javabean 支持引用类型属性二级转换

    近期项目须要使用excel导入功能.导入学生的时候须要指定所在班级,使用excel一次性导入! 将曾经的代码改改支持属性内引用类的转换. 測试对象为User对象,javabean结构: private ...

  7. 深入分析JavaWeb Item23 -- jsp自己定义标签开发入门

    一.自己定义标签的作用 自己定义标签主要用于移除Jsp页面中的java代码. 二.自己定义标签开发和使用 2.1.自己定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 要编写一 ...

  8. Android引入library失败的可能原因

    eclipse环境,引入library一直失败 谷歌到的原因是 Windows下 目标工程必须和引用工程在同一磁盘盘符下 然后我将要引入的library项目移动和现在项目同一磁盘下,引入成功 至于为什 ...

  9. Looksery Cup 2015 Editorial

    下面是题解,做的不好.下一步的目标是rating涨到 1800,没打过几次cf A. Face Detection Author: Monyura One should iterate through ...

  10. 「HAOI2016」字符合并

    「HAOI2016」字符合并 题意: ​ 有一个长度为\(n\)的\(01\)串,你可以每次将相邻的\(k\)个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这\(k\)个字符确定.你 ...