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

时间:2022-02-11 08:12:44

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

 

从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有一大部分命令在翻译后需要转换成对应的事件,然后放入到命令队列里面等待执行。Monkey在取出一个事件执行的时候主要是执行其injectEvent方法来注入事件,而注入事件根据是否需要往系统注入事件分为两种:

  • 需要通过系统服务往系统注入事件:如MonkeyKeyEvent事件会通过系统的InputManager往系统窗口注入按键事件来完成输入请求
  • 不需要通过系统服务往系统注入事件: 如MonkeyWaitEvent只是进行简单的睡眠等待

MonkeyEvent是所有Monkey事件的总称,其实它包含了多种事件,我们先看下类图:

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

图6-5-1 MonkeyEvent类族谱

大家可以看到MonkeyEvent是一个抽象类,它最重要的地方是定义了injectEvent这个抽象方法。然后有一系列的子类继承该抽象类来实现其injectEvent接口,也就是去实现如何往系统注入事件来完成MonkeyRunner的请求了。所以如果这里要给Monkey事件做一个定义,我认为可以这样定义:Monkey事件是一个实现了injectEvent方法来处理不同的命令请求的类。但这里我们要注意并不是所有从MonkeyRunner过来的命令字串都会生成对应的事件的,请看下表:

命令字串

命令翻译类

目标事件类

MR是否支持

注释

touch down x y

TouchCommand

MonkeyTouchEvent

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

touch up x y

TouchCommand

MonkeyTouchEvent

同上

touch move x y

TouchCommand

MonkeyTouchEvent

同上

tap x y

TapCommand

MonkeyTouchEvent

同上

press name

PressCommand

MonkeyKeyEvent

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

key down name

KeyCommand

MonkeyKeyEvent

同上

key up name

KeyCommand

MonkeyKeyEvent

同上

getvar name

GetVarCommand

N/A(不会有对应事件,所以也不会加入事件队列,而是直接取得属性返回)

name 代表属性名

listvar

ListViewsCommand

同上

type line

TypeCommand

MonkeyKeyEvent

line 代表输入字串

wake

WakeCommand

N/A(不会有对应事件,所以也不会加入事件队列,而是直接PowerManager唤醒屏幕)

listViews

ListViewsCommand

N/A(不会生成事件也不会入事件队列)

queryview

QueryViewCommand

N/A(不会生成事件也不会入事件队列)

getRootView

GetRootViewCommand

N/A(不会生成事件也不会入事件队列)

getViewWithText

GetViewsWithTextCommand

N/A(不会生成事件也不会入事件队列)

done

N/A

N/A(不会生成事件也不会入事件队列)

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

quit

N/A

N/A(不会生成事件也不会入事件队列)

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

flip open

MonkeyFlipEvent

MonkeyFlipEvent

MonkeyRunner不支持发送这两个命令

flip close

MonkeyFlipEvent

MonkeyFlipEvent

trackball dx dy

deferredReturn

DeferReturnCommand

N/A(不会生成事件也不会入事件队列)

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

注: MR代表MonkeyRunner

表6-5-1 命令字串 – 命令翻译类 – 事件关系参照表

从列表中我们可以看到MonkeySourceNetwork支持大部分从MonkeyRunner过来的命令字串,但是只有2种是会生成对应的事件并存放到事件队列里面的,这两种事件都是需要对界面进行操作的,而其他如获得系统属性以及获得界面控件等命令都是不会生成对应事件,也不会进入到事件队列,而是直接处理然后返回的。这里我们对这2种事件做相应的描述:

  • MonkeyTouchEvent:对界面进行触屏操作,最终会通过InputManager往系统注入对应事件
  • MonkeyKeyEvent: 往界面输入键值,最终会通过InputManager往系统注入对应事件

这里要注意的是,其实并不是所有的事件注入都需要真的往系统窗口注入事件的,这个接口方法的名字我觉得Google 工程师起得不好,比如叫做handleEvent就不会造成混乱了(个人见解)。