第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类

Advertisement

每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行了事,而有些是需要在解析后创建相应的事件类实例并添加到命令队列里面排队执行。负责这部分工作的就是命令翻译类。那么我们往下还是继续在MonkeySourceNetwork这个范畴中MonkeyCommand类是怎么一回事:

图6-3-1 MonkeyCommand族谱

图中间的MonkeyCommand是一个接口,主要定义了translateCommand这个方法,它接收的参数是一个字串命令以及参数的列表以及命令队列,所有实现类都必须实现这个方法来对命令字串进行解析翻译:

  • 如果命令字串需要建立对应MonkeyEvent实例的,则将该命令字串翻译成对应的MonkeyEvent实例并加入到传进来的命令队列
  • 如果命令字串不需要建立对应的MonkeyEvent实例的的,那么直接解析执行该命令字串,然后返回

命令字串格式


命令翻译类


MR是否支持


注释


touch down x y


TouchCommand



x代表x坐标,y代表y坐标


touch up x y


TouchCommand



同上


touch move x y


TouchCommand



同上


tap x y


TapCommand



同上


press name


PressCommand



Name代表按键名,如"MENU", "HOME", "SEARCH"等


key down name


KeyCommand



同上


key up name


KeyCommand



同上


getvar name


GetVarCommand



name 代表属性名


listvar


ListViewsCommand



type line


TypeCommand



line 代表输入字串


wake


WakeCommand



listViews


ListViewsCommand



queryview


QueryViewCommand



getRootView


GetRootViewCommand



getViewWithText


GetViewsWithTextCommand



done


N/A



测试完成,Monkey收到命令后会停止Socket监听


quit


N/A



测试请求退出,Monkey收到后不会停止Socket监听,


flip open


MonkeyFlipEvent



MonkeyRunner不支持发送这两个命令


flip close


MonkeyFlipEvent



trackball dx dy



deferredReturn


DeferReturnCommand



这个命令比较特别,做的事情是等待一个命令完成然后执行另外一个命令。但是在MonkeyRunner框架中并没有支持。


注: MR代表MonkeyRunner

表6-3-1 命令字串和对应的命令翻译类参照表

MonkeyCommand中所有的类其实都是内部类,比如网络命令相关的命令翻译类或者是MonkeySourceNetwork的子类,或者是MonkeySourceNetworkVars的子类,不然就是MonkeySourceNetworkViews的子类:

图6-3-2 命令翻译类作为事件源的内部类

一旦事件源获取到字串命令就能很方便的通过COMMAND_MAP调用内部的命令翻译类来把命令翻译出来处理,所以我们也可以认为事件源依赖相应的命令翻译类来做事情:

图6-3-3 事件源依赖命令翻译类

下一小节我们通过一个实例去看事件翻译类是如何把MonkeyRunner发送过来的字串命令翻译出来并转换成事件实例的。

注:更多文章请关注公众号:techgogogo或个人博客http://techgogogo.com。当然,也非常欢迎您直接微信(zhubaitian1)勾搭。本文由天地会珠海分舵原创。转载请自觉,是否投诉维权看心情。

Similar Posts:

  • 第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理 1

    老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程 到此为止我们描述的MonkeyRunner对应用的点击拖放等操作都是直接通过指定坐标点来实现的,比如下面触摸一个坐标点为(60,90)的按钮的脚本例子: 1 device.touch(60,900,MonkeyDevice.DOWN_AND_UP) 代码14-1-1 直接使用坐标点操作应用 这样子做的话代码会存在以下几大缺点: 缺乏易用性:要操作某个控件之前需要先想

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

    老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本 MonkeyRunner在准备好AndroidDebugBridge和DeviceMonitor等服务之后,就基本上是解决了和目标设备通信的问题了,那往下需要做的就是把测试脚本运行起来了. 178 public static void main(String[] args) { 179 MonkeyRunnerOptions options = MonkeyRunnerOptions.p

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

    老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串 在第2节中我们看到了MonkeySourceNetwork是如何从Socket中获取MonkeyRunner发送过来的命令字串的,但是最后如何将它翻译成事件的代码我们还没有进行分析,因为在那之前我们还没有了解命令翻译类的相关知识.那么经过第3小节对命令翻译类的学习后,我们就可以继续往下分析MonkeySourceNetwork的getNextEvent中是如何翻译命令字串的了. 我们

  • 老李推荐:第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览

    老李推荐:第5章2节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 启动流程概览 每个应用都会有一个入口方法来供操作系统调用执行,Monkey这个应用的入口方法就是在Monkey.java这个类里面的,也就是说Monkey.java就是整个Monkey应用的入口类. Monkey作为一个命令行应用,启动的过程中必然会去把命令行参数给解析出来:同时作为一个MonkeyRunner的服务,在启动完成后,很自然就能想到它必然会循环去等待获取主机发过来的命令.这些都不难理解,其实

  • 第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 事件源代表要注入系统的命令事件数据是从哪里过来的.这一小节我们不会对事件源的实现进行深入的分析,因为下一章会做这个事情.这里大家对事件源有个基本概念就足够了. 对Monkey来说,事件的来源可以有多个地方,比如我们用它

  • nginx源码剖析(二) —— ngx_list_t分析

    前言        nginx_list_t是nginx的一个链表容器,频繁的在nginx的源码中使用,例如,HTTP的头部就是使用ngx_list_t这个数据结构来存储的.所以,今天我们一起来聊聊这个比较重要的数据结构.(这里使用的源码为nginx比较新的一个版本,nginx-1.6.2版本.) 正文 1.nginx_list_t数据结构的描述: //链表节点结构 typedef struct ngx_list_part_s ngx_list_part_t; struct ngx_list_p

  • J.U.C--原子变量类AtomicInteger的源码解析与原理分析

    原子变量类比锁的粒度更加细,量级更轻,并且对于在多处理器系统上实现高性能的并发代码来说非常关键. 原子标量类可以分为4组:标量类.更新器类.数组类以及复合变量类.最常用的就是原子变量累计就是标量类:AtomicInteger.AtomicLong.AtomicBoolean.AtomicReference. 其实原子变量类就是一种"更好的volatile". 下面我通过分析AtomicInteger来解析一下原子变量类的原理: AtomicInteger AtomicInteger是一

  • 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge

    上一节我们看到在启动AndroidDebugBridge的过程中会调用其start方法,而该方法会做2个主要的事情: 715行startAdb:开启AndroidDebugBridge 722-723行:初始化android设备监控并启动DeviceMonitor设备监控线程. 其中第一点我们上一小节已经做了详尽分析了,那么我们往下就去分析下第2点. DeviceMonitor主要的功能就是监控是否有安卓设备拔除或者连接上来,然后对每个连接上来的设备的所有可调式进程进行监控.这个功能更多是给DD

  • 第8章3节《MonkeyRunner源码剖析》4

    创建AndroidDebugBridge之前我们先要确定我们的adb程序的位置,这就是通过62行来实现的,我们进去findAdb去看下它是怎么找到我们的sdk中的adb的: 72 private String findAdb() 73 { 74 String mrParentLocation = System.getProperty("com.android.monkeyrunner.bindir"); 75 76 77 78 79 80 if ((mrParentLocation !

  • 第14章7节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-获取版本号 4

    到此为止我们就分析完如何发送"SERVER"命令到ViewServer以获得其版本号的,完了吗?还没有了,别忘了我们除了要获得ViewServer的版本号外,还需要获得ViewServer当前使用的协议版本了,"代码14-7-4 DeviceBridge - loadViewServerInfo获取ViewServer版本"只是loadViewServerInfo的一部分而已.现在我们往下分析第2部分,但它是怎么去获得协议版本的: 260 public static

Tags: