文章目录
- 一、简介
- 二、原理
- 2.1 特殊处理
- 三、命令
- 3.1 启动
- 3.2 关闭
- 四、事件
- 4.1 触摸事件
- 4.2 手势事件
- 4.3 二指缩放事件
- 4.4 轨迹事件
- 4.5 屏幕旋转事件
- 4.6 基本导航事件
- 4.7 主要导航事件
- 4.8 系统按键事件
- 4.9 启动activity事件
- 4.10 键盘事件
- 4.11 其他类型事件
- 五、参数
- 5.1 常规类参数
- 5.1.1 帮助参数
- 5.1.2 日志信息参数
- 5.2 事件类参数
- 5.2.1 事件及其百分比
- 5.2.2 随机数种子
- 5.2.3 事件间隔
- 5.2.4 执行脚本
- 5.3约束类参数
- 5.3.1 包约束
- 查看包名的方法
- 5.3.2 activity类约束
- 5.4 调试类参数
- 5.4.1 应用崩溃继续发送事件
- 5.4.2 超时错误继续发送事件
- 5.4.3 应用权限错误继续发送事件
- 六、日志管理
- 6.1 日志保存
- 电脑
- 设备
- 标准流和错误流分开
- 路径分隔符
- 6.2 日志解析
- 6.2.1 测试命令
- 6.2.2 伪随机事件流
- 6.2.3 异常
- 6.2.4 monkey执行结果
- 6.3 异常统计
一、简介
monkey是Android系统自带的自动化测试工具,顾名思义,像猴子一样活泼好动
- jar包在Android文件系统中的存放路径是
/system/framework/monkey.jar
- shell脚本在Android文件系统中的存放路径是
/system/bin/monkey
二、原理
用户通过adb命令启动monkey,根据命令行参数的配置,向系统发送伪随机的用户事件流,如按键输入、触摸屏幕、轨迹球滑动、手势输入等,对设备进行稳定性测试
2.1 特殊处理
限定monkey运行在特定的包上,那monkey会检测试图转到其他包的操作,并对其进行阻止
应用程序崩溃或接收到任何失控异常,monkey将停止并报错
应用程序产生了无响应ANR的错误,monkey将停止并报错
三、命令
3.1 启动
adb shell monkey [options] <count>
- options,可选项,如果不指定,monkey将以无反馈模式启动,将事件任意发送到安装在目标环境中的全部包
- count,随机事件发送次数,必选项
- 参数没有顺序要求,但是随机事件数一定要在最后!
3.2 关闭
adb shell ps
,查看所有在运行的进程
adb shell "ps | grep monkey"
,过滤出monkey进程
adb shell kill pid
,杀掉进程
或者,直接关机/重启
四、事件
monkey的随机事件流包含11种,分别是触摸事件、手势事件、二指缩放事件、轨迹事件、屏幕旋转事件、基本导航事件、主要导航事件、系统按键事件、启动activity事件、键盘事件、其他类型事件,通过这11种事件来模拟用户的常规操作
4.1 触摸事件
在屏幕某处按下并抬起的操作,由一组Touch (ACTION_DOWN)和Touch (ACTION_UP)组成,实际操作即点击
--pct-touch PERCENT
,percent配置事件百分比,指定多个事件百分比总和不能超过100%,不指定就随机分配
:Sending Touch (ACTION_DOWN): 0:(151.0,41.0)
:Sending Touch (ACTION_UP): 0:(151.58891,39.79087)
4.2 手势事件
在屏幕某处按下、随机移动、抬起的操作,由一个Touch (ACTION_DOWN)、一系列Touch (ACTION_MOVE)、一个Touch (ACTION_UP)组成,实际操作即直线滑动
--pct-motion PERCENT
:Sending Touch (ACTION_DOWN): 0:(40.0,54.0)
:Sending Touch (ACTION_MOVE): 0:(38.04351,47.728962)
:Sending Touch (ACTION_MOVE): 0:(34.583817,46.69073)
:Sending Touch (ACTION_MOVE): 0:(30.476467,44.44947)
:Sending Touch (ACTION_MOVE): 0:(26.356031,38.87899)
:Sending Touch (ACTION_UP): 0:(25.772858,38.108803)
4.3 二指缩放事件
在屏幕上的两处同时按下、并同时移动、再同时抬起的操作,由一个Touch (ACTION_DOWN)、一个Touch (ACTION_POINTER_DOWN 1)、一系列Touch (ACTION_MOVE)、一个Touch (ACTION_POINTER_UP 1)、一个Touch (ACTION_UP)组成,前二模拟二指同时点下,后二模拟二指同时松开,实际操作即放大缩小
--pct-pinchzoom PERCENT
:Sending Touch (ACTION_DOWN): 0:(217.0,1014.0)
:Sending Touch (ACTION_POINTER_DOWN 1): 0:(206.71742,1009.79) 1:(41.0,106.0)
:Sending Touch (ACTION_MOVE): 0:(204.29488,1002.99115) 1:(39.891537,111.084694)
:Sending Touch (ACTION_POINTER_UP 1): 0:(196.70801,1002.6718) 1:(38.83169,116.00593)
:Sending Touch (ACTION_UP): 0:(187.4215,1001.8042)
4.4 轨迹事件
一个或多个随机移动,有时伴随点击的操作(模拟轨迹球),目前的手机几乎没有轨迹球,但轨迹球中包含曲线滑动操作,如果需测试曲线滑动则选用此参数,由一系列Trackball (ACTION_MOVE)组成,实际操作即曲线滑动
--pct-trackball PERCENT
:Sending Trackball (ACTION_MOVE): 0:(2.0,0.0)
:Sending Trackball (ACTION_MOVE): 0:(4.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(2.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(3.0,-4.0)
:Sending Trackball (ACTION_MOVE): 0:(-3.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(-3.0,0.0)
:Sending Trackball (ACTION_MOVE): 0:(-2.0,2.0)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,-5.0)
:Sending Trackball (ACTION_MOVE): 0:(1.0,-5.0)
4.5 屏幕旋转事件
隐藏事件,官方文档没有记录,横屏和竖屏进行切换的操作,由rotation事件组成,degree表示旋转方向(顺时针旋转,0表示90度,1表示180度,2表示270度,3表示360度),实际操作即横竖屏切换
--pct-rotation PERCENT
4.6 基本导航事件
点击方向输入设备的上下左右按键的操作,较少使用到,由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成,实际操作即点击上下左右按键
--pct-nav PERCENT
:Sending Key (ACTION_DOWN): 22 // KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_UP): 22 // KEYCODE_DPAD_RIGHT
4.7 主要导航事件
点击”主要导航“按键的操作,如back、menu等,由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成,实际操作即点击上述按键
--pct-majornav PERCENT
4.8 系统按键事件
点击系统保留使用的按键的操作,如home键、返回键、音量键等,由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成,实际操作即点击上述按键
--pct-syskeys PERCENT
:Sending Key (ACTION_DOWN): 25 // KEYCODE_VOLUME_DOWN
:Sending Key (ACTION_UP): 25 // KEYCODE_VOLUME_DOWN
4.9 启动activity事件
启动系统activity的操作,执行startActivity()方法,由switch操作组成,实际操作即打开某应用的某个界面
--pct-appswitch PERCENT
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.android.settings/.Settings%24RunningServicesActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.settings/.Settings$RunningServicesActivity } in package com.android.settings
4.10 键盘事件
与键盘相关的操作,如点击输入框、键盘弹起、键盘收回等,实际操作即上述
--pct-flip PERCENT
:Sending Flip keyboardOpen=false
Got IOException performing flipjava.io.FileNotFoundException: /dev/input/event0: open failed: EACCES (Permission denied)
// Injection Failed
4.11 其他类型事件
除前十种事件外的其他所有事件,由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成
--pct-anyevent PERCENT
:Sending Key (ACTION_DOWN): 241 // KEYCODE_TV_NETWORK
:Sending Key (ACTION_UP): 241 // KEYCODE_TV_NETWORK
五、参数
5.1 常规类参数
包括帮助参数和日志信息参数
5.1.1 帮助参数
用于输出monkey命令使用指导
monkey -h
5.1.2 日志信息参数
将日志分为3个级别,级别越高,日志信息越详细
monkey -v [-v] ...
-v越多日志越详细,目前最多支持3个
- -v,level0,仅提供启动提示、测试完成、最终结果等少量信息
- -v -v,leve1,提供较为详细的日志,包括每个发送到activity的信息
- -v -v -v,level2,提供更详细的日志,包括测试中选中/未选中的activity信息
5.2 事件类参数
对随机事件进行调控,使其遵照设定运行,如设置事件及其百分比、设置事件生成的随机数种子、设置事件执行的事件间隔
5.2.1 事件及其百分比
事件类型参考事件
monkey --pct- percent
5.2.2 随机数种子
本身执行伪随机事件会默认生成seed值,指定seed就可以重复执行之前的伪随机操作。同样的随机数,会执行同样的随机事件
monkey -s SEED
5.2.3 事件间隔
每个指令间固定的时间间隔,单位是毫秒,不指定的话,monkey将不会延迟
monkey --throttle MILLISEC
5.2.4 执行脚本
monkey -f scriptfile [-f scriptfile] ...
5.3约束类参数
5.3.1 包约束
后接一个或多个包,表示允许访问的包,如果需要访问其他包的activity,相关的包也要指定。如果不指定,默认允许启动系统全部包的activity
monkey -p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...
后面可以接数字,表示操作次数
查看包名的方法
查看所有包名,需要root
adb shell
cd data/data
ls
pm命令,不需要root
adb shell pm list package
,获取所有apk对应包名
adb shell pm list package -f
,获取所有apk对应包名及路径
需打开某一应用,不需要root
adb shell "dumpsys window | grep mCurrentFocus"
,获取到当前运行的包名和activity
需打开某一应用,不需要root
adb shell
logcat | grep START
5.3.2 activity类约束
后接一个或多个类,表示允许运行的activity
-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...
后面可以接数字,表示操作次数
5.4 调试类参数
三种情况描述对应特殊处理,设置后就可以忽略掉继续发送事件
5.4.1 应用崩溃继续发送事件
--ignore-crashes
5.4.2 超时错误继续发送事件
–
ignore-timeouts
5.4.3 应用权限错误继续发送事件
--ignore-security-exceptions
六、日志管理
6.1 日志保存
电脑
adb shell monkey ...... > D:\...\monkey.txt
设备
adb shell
monkey ... > /storage/.../monkey.txt
标准流和错误流分开
adb shell monkey ...1>D:\...\monkey.txt 2>D:\...error.txt
路径分隔符
Unix使用
/
作为路径分隔符,web应用在Unix系统上,所以网络地址都采用/
作为分隔符
Windows已经使用/
作为dos命令提示符的参数标志,所有使用\
作为分隔符,但是,dos系统已被淘汰,很少使用命令提示符,所以二者可互换,无影响
tips:程序编写时,若以字符串形式保存url,分隔符用\\
表示的是转义字符
6.2 日志解析
monkey运行输出的日志一般包含四类信息,测试命令信息、伪随机事件流信息、异常信息、monkey执行结果信息
6.2.1 测试命令
命令指定的参数信息
事件对应,不大确定。。。
# 指令参数
bash arg: -s
bash arg: 400
bash arg: --throttle
bash arg: 1000
bash arg: --pct-touch
bash arg: 80
bash arg: --ignore-crashes
bash arg: --ignore-timeouts
bash arg: -v
bash arg: -v
bash arg: -v
bash arg: 100000000
# 随机数种子
:Monkey: seed=400 count=100000000
# 包含类别
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
// + Using main activity com.android.calendar.AllInOneActivity (from package com.android.calendar)
// + Using main activity com.android.camera.CameraLauncher (from package com.android.camera2)
......
// Selecting main activities from category android.intent.category.MONKEY
// + Using main activity com.android.launcher3.Launcher (from package com.android.launcher3)
// + Using main activity com.android.settings.Settings$RunningServicesActivity (from package com.android.settings)
......
// Seeded: 400
// Event percentages:
# 事件0:--pct-touch
// 0: 80.0%
# 事件1:--pct-motion
// 1: 2.3529413%
# 事件2:--pct-pinchzoom
// 2: 0.47058824%
# 事件3:--pct-trackball
// 3: 3.5294118%
# 事件4:--pct-rotation
// 4: -0.0%
# 事件5:--pct-nav
// 5: -0.0%
# 事件6:--pct-majornav
// 6: 5.882353%
# 事件7:--pct-syskeys
// 7: 3.5294118%
# 事件8:--pct-appswitch
// 8: 0.47058824%
# 事件9:--pct-flip
// 9: 0.47058824%
# 事件10:--pct-anyevent
// 10: 0.23529412%
# 事件11:--pct-
// 11: 3.0588236%
// Monkey Version Informations:
// Build Label: SPRD/sl8541e_1h10wifi5g_32b_Natv/sl8541e_1h10wifi5g_32b:10/QP1A.190711.020/211:userdebug/test-keys
// Build Time: 1675427364000
// Build Type: userdebug
// Build Tags: test-keys
// Build Debugable: true
// Build Changelist: 211
// Monkey Start Time : 85534909; Monkey Start Calendar Time : 2023-02-09 09:38:54.463
6.2.2 伪随机事件流
顺序输出指定的伪随机事件流
6.2.3 异常
执行过程中遇到错误时,输出对应异常信息
# 异常应用包名和pid
// CRASH: com.android.mms (pid 4650)
# 简要信息
// Short Msg: android.content.ActivityNotFoundException
# 详细信息
// Long Msg: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.android.contacts.action.SHOW_OR_CREATE_CONTACT dat=tel:xxxxxxxxxxxx (has extras) }
# 机型和系统信息
// Build Label: SUNMI/CT621/CT621:11/RKQ1.211210.001/131:userdebug/test-keys
// Build Changelist: 131
// Build Time: 1675008998000
# 详细日志
// android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.android.contacts.action.SHOW_OR_CREATE_CONTACT dat=tel:xxxxxxxxxxxx (has extras) }
// at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2073)
// at android.app.Instrumentation.execStartActivity(Instrumentation.java:1729)
// at android.app.Activity.startActivityForResult(Activity.java:5314)
// at android.app.Activity.startActivityForResult(Activity.java:5272)
// at android.app.Activity.startActivity(Activity.java:5658)
// at android.app.Activity.startActivity(Activity.java:5611)
// at android.widget.QuickContactBadge$QueryHandler.onQueryComplete(QuickContactBadge.java:402)
// at android.content.AsyncQueryHandler.handleMessage(AsyncQueryHandler.java:344)
// at android.os.Handler.dispatchMessage(Handler.java:106)
// at android.os.Looper.loop(Looper.java:223)
// at android.app.ActivityThread.main(ActivityThread.java:7705)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:952)
//
6.2.4 monkey执行结果
执行完成后,会输出执行结果信息,包括执行事件数量、旋转角度、丢失事件数量、网络状态、最终执行结果等
# 执行事件数量
Events injected: 20
# 旋转角度
:Sending rotation degree=0, persist=false
# 丢失事件数量
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
# 网络状态
## Network stats: elapsed time=10468ms (0ms mobile, 0ms wifi, 10468ms not connected)
# 最终结果
// Monkey finished
// Monkey End Time : 3369113; Monkey End Calendar Time : 2023-02-09 13:41:43.334
6.3 异常统计
https://www.cnblogs.com/Chilam007/p/10941092.html
还没看明白bat。。。
http://www.manongjc.com/detail/13-rionjdfiqhbjzrf.html
monkeyrunner