Android Monkey Script

在 Monkey 命令选项中有一个这样的选项:

1
[--setup scriptfile] [-f scriptfile [-f scriptfile] ...]

对于这个选项的说明,Google 在 Monkey 的官方文档里面并未进行说明。
通过阅读 Monkey 源码 ,在 MonkeySourceScript 这个类中,发现有给出一段注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* monkey event queue. It takes a script to produce events sample script format:
*
* <pre>
* type= raw events
* count= 10
* speed= 1.0
* start data &gt;&gt;
* captureDispatchPointer(5109520,5109520,0,230.75429,458.1814,0.20784314,0.06666667,0,0.0,0.0,65539,0)
* captureDispatchKey(5113146,5113146,0,20,0,0,0,0)
* captureDispatchFlip(true)
* ...
* </pre>
*/

里面给出了 script 的格式。
这里先按照格式,编写一个 script,让其完成按下 Home 键的动作,之后再介绍这个类里面的一些方法。
新建一个 monkeyScript.txt 文件,在文件中输入下面的内容后保存:

1
2
3
4
5
6
7
8
type= raw events
count= 10
speed= 1.0
start data >>

DispatchKey(0,0,0,3,0,0,0,0)
DispatchKey(0,0,1,3,0,0,0,0)
UserWait(500)

接着将该文件 push 至设备上,可以选择放在 sdcard,也可以选择其它目录,我选择将其放在 tmp 目录下:

1
adb push monkeyScript.txt data/local/tmp

然后执行该脚本:

1
adb shell monkey -f /data/local/tmp/monkeyScript.txt 1

执行成功后会按下 Home 键 1 次.

脚本中的 count=、speed=、start data >>、DispatchKey、UserWait 都属于 MonkeySourceScript 定义的关键字
其中:

1
2
3
4
5
private static final String HEADER_COUNT = "count=";

private static final String HEADER_SPEED = "speed=";

private static final String STARTING_DATA_LINE = "start data >>";

这几个关键字用于 monkey 识别脚本文件是否可以执行。

1
2
3
4

private static final String EVENT_KEYWORD_KEY = "DispatchKey";

private static final String EVENT_KEYWORD_WAIT = "UserWait";

DispatchKey、UserWait 分别为分派一个按键事件、等待、休眠的意思。
脚本中 count= 10 意思是执行的次数,但在实际执行中并未起作用,实际执行次数受 monkey 命令控制,比如命令末尾的数字 1.
speed= 设置速率,start data >> 开始执行后面的内容。
DispatchKey,分派一个按键事件,接收的参数比较复杂,其中 3 表示的是 Home 键,3 前面的 0 表示按下,3 前面的 1 表示弹起。
UserWait(500),休眠 500 毫秒。

接下来介绍该类中的其它一些方法:
LaunchActivity,启动一个应用,例如启动系统相机:

1
LaunchActivity(com.android.camera,com.android.camera.Camera)

DispatchPress,按下物理按键,例如按下菜单键:

1
DispatchPress(KEYCODE_MENU)

Tap,点按屏幕

1
Tap(500,500)

Drag,滑动屏幕

1
Drag(500,1600,500,200,500)

DispatchString,输入字符串,不支持中文

1
DispatchString(test)

PressAndHold,长按

1
PressAndHold(400,1100,3000)

PinchZoom,缩放

1
PinchZoom(500,700,800,400,500,1200,200,1600,1000)

RunCmd,执行 shell 命令,例如截屏

1
RunCmd(screencap -p /data/local/tmp/tmp.png)

还有其它的一些方法,可以自行查看源码。

那这些有什么用?
我只能说很有用。。朋友们可以自己思考下会在什么地方用到!

KeyEvent