monkey概述
monkey是android系统自带的,启动脚本位于系统system/bin,它向系统发送伪随机事件,模拟用户按键输入、触摸、手势等,测试设备多长时间出现异常,从而观察系统的稳定性和容错性。伪随机事件是根据monkey命令行的参数决定的。
monkey参数
之前的源码部分二也有提到monkey参数,在这里从使用层面上罗列一下:
monkey启动命令:adb shell monkey [options] <count>
- options:配置参数,可选
- count:执行次数,必选
- monkey是由adb启动的,所以只要有adb环境就可以用monkey,adb环境搭建
- monkey停止:杀掉monkey进程
adb shell kill monkey-pid
options 分类
-
基本配置类参数
-
事件类型频率参数
-
约束限制类参数
-
调试类参数
-
官方隐藏参数
1、基本配置类参数
- –help:帮助参数,罗列参数命令
- -v:日至参数,每增加一个-v参数,日志级别增加一个等级,从而提供更加详细的日志信息;日志共3各级别
2、事件类型频率参数
- -s< seed>:随机事件种子值;复现问题时,若使用相同的种子值再次运行monkey,将生成与上一次一样的事件序列
- –throttle:事件间隔时间(毫秒),为了更好地模拟用户操作&避免过度平凡的操作导致系统崩溃,这个参数建议指定
- –pct-touch:触摸事件的百分比(down+up,类似点击)
- –pct-motion:动作事件的百分比(down+多次move+up,滑动操作)
- –pct-pinchzoom:两指缩放事件的百分比
- –pct-trackball:轨迹事件的百分比(move)
- –pct-rotation:旋转事件的百分比(横竖屏)
- –pct-nav:基本导航事件的百分比(基本导航事件为方向输入设备的up,down,left,right,现在手机上很少有上下左右键所以这个参数不太会用到)
- –pct-majornav:主要导航事件的百分比(图形界面中的操作,如返回按钮、菜单按钮)
- –pct-syskeys:系统按钮事件的百分比(系统按键为HOME、BACK、音量加减)
- –pct-appswitch:启动事件的百分比
- –pct-flip:键盘事件的百分比
- –pct-anyevent:其他类型事件的百分比
3、约束类参数
- -p:指定包名,将事件运行范围限制在一个或多个包中(多个包需要多个-p参数),当限定包时,一旦检测到系统试图启动其他包将阻止。
- -c:指定类别名,将事件运行范围限制在一个或多个类中(多个类需要多个-c参数)。
4、调试类参数
- –dbg-no-events:设置此项后,进入一个测试activity,就不会再进一步会生成事件,童话村那个用于监事应用程序所调用的包之间的转换
- –hprof:用于监控内存泄漏问题,设置后将monkey事件执行之前和之后生成的内存快照文件存放在data/misc目录下,通过对比执行前后的内存快照文件,需注意内存快照文件比较大
- –ignore-crashes:设置后,当应用程序崩溃时,monkey会继续执行知道count执行完成;否则一旦发生crash将会立即停止
- –ignore-timeouts:设置后,当应用程序发生任何程序无响应、超时错误时,monkey会继续执行直到count 执行完成;否则monkey将停止运行
- –ignore-security-exceptions:设置后,当应用程序发生许可错误时,monkey会继续执行直到count 执行完成;否则monkey将停止运行
- –kill-process-after-error:设置后,当monkey由于一个错误停止时,会通知系统停止发生错误的进程,否则发生错误的进程还会处于运行状态
- –monitor-native-crashes:监听并报告系统中本地代码的崩溃事件
- –wait-dbg:停止执行中的monkey,知道有调试器与之相连接
5、官方隐藏类参数
- –pkg-blacklist-file:黑名单文件,限制monkey不测试该黑名单中的包,一行一个包名
- –pkg-whitelist-file:白名单文件,限制monkey只测试该白名单中的包,如果测试包与其他包有关联,需要在白名单中一并写出,一行一个包名
- -f:脚本文件,指定monkey执行monkey自定义的脚本文件,后面跟脚本名称
这3个参数在Android官网上没有,但是在实际使用过程中很有用
自定义脚本
通常monkey测试执行的是随机事件流,也可以通过自定义脚本测试某个特定的事件。
1、脚本规范
脚本文件格式最好用成xx.mks
# Start of Script
type= raw events
count=10 脚本执行次数,但是monkey命令包含次数,这里的count不生效
speed=1.0 脚本执行速率,但是monkey命令可以设置速率,这里的speed也不生效
#下面的就是具体命令了
start data>>
LauncherActivity(pkg_name,cl_name)
Tap(x,y,duration)
UserWait(5000)
...
2.脚本常见命令
API | 命令 |
---|---|
LaunchActivity(pkg_name,cl_name) | 启动被测应用的某个activity |
Tap(x,y,duration) | 单击事件,duration是按下时长(ms) |
DispatchPress(keyName) | 按键点击,keyName是按键名称 |
DispatchFlip(true/false) | 打开/关闭软键盘 |
DispatchString(input) | 输入字符串,input是输入内容 |
LongPress() | 长安两秒 |
PressAndHold(x,y,duration) | 长按事件,duration是按下时长(ms) |
Drag(xStart,yStart,xEnd,yEnd,stepCount) | 从(xStart,yStart)以stepCount速度移动到(xEnd,yEnd) |
PinchZoom(pt1xStart,pt1yStart,pt1xEnd,pt1yEnd,pt2xStart,pt2yStart,pt2xEnd,pt2yEnd,stepCount) | 缩放 |
RotateScreen(rotateDegree,peresist) | 屏幕旋转,rotateDegree值为0-3(顺时针旋转的4个角度),peresist为是否保留 |
UserWait(sleepTime) | 等待时间,sleepTime单位为ms |
DeviceWakeUp() | 唤醒屏幕 |
这里可以看出来monkey脚本基本是通过坐标来定位的,所以需要获取设备坐标信息。获取坐标信息我都是在系统设置-开发者选项-打开指针位置,开启之后操作屏幕即可显示坐标。
针对DispatchPress(keyName)中的按键名称可以参考安卓keycode列表
2.脚本运行
将脚本放到设备中
adb push monkey.mks /sdcard/
运行脚本
adb shell monkey -f /sdcard/monkey.mks -v 10