adb进阶二 —— Monkey (1)
Monkey简介
Monkey是一个可运行在Android环境中的命令行工具,使用monkey尅发送一些伪随机事件(pseudo-random)的用户事件流,例如点击,触摸,手势等。通过monkey,我们可以注入随机事件流或者自定义特定事件来对应用进行健壮性、稳定性测试。
Monkey用途
通过使用monkey来对应用进行压力测试。
Monkey包含一系列选项,主要包括以下方面:
- 基础配置项,比如设置注入事件的数量
adb shell monkey 500
- 备选限制,比如限制测试单个包
adb shell monkey -p com.android.camera 5000
- 事件类型和频率
- 调试选项
Monkey程序简介
monkey在Android文件系统存放路径为:/system/framework/monkey.jar
启动monkey.jar的shell脚本文件在Android文件系统存放路径为system/bin/monkey
导到本地:adb pull /system/bin/monkey E:\app_workstation\Android_files\MONKEY
可以看到monkey的shell内容:
1 | # Script to start "monkey" on the device, which has a very rudimentary |
可以看到调用的是com.android.commands.monkey.Monkey
包
Monkey命令
基本命令
基础语法:adb shell monkey [option] <event-count>
当不指定任何选项时,monkey将默认静态模式,并且会向目标设备的所有包发送随机事件
基本使用:adb shell monkey
1 | {lamb} adb shell monkey |
可以看见列出了所有monkey的usage,但是并没有启动,因为缺少事件数量,只要加上数量,即可adb shell monkey 10000
Monkey Option
monkey的option可以根据实际需要进行选择,主要分为常规类、事件类、约束类和调试类
常规类
选项 | 描述 |
---|---|
- - help | 显示帮助信息,usage |
-v | 打印日志信息,每增加一个-v,日志显示的信息越详细,目前最多支持三个-v,即:-v -v -v; L0:一个-v,除启动提示、测试完成和最终结果之外,提供较少信息; L1:两个-v,-v -v,提供较详细的运行测试信息,如发送到Activity的事件; L2:三个-v,-v -v -v,提供更加详细的信息,如测试中被选中的或未选中的Activity |
事件类
选项 | 描述 |
---|---|
-s | 伪随机数生成器的seed值,如果用相同的seed值再次运行mnkey,会生成相同的事件序列(重复执行刚才的随机操作,复现问题好用) |
- -throttle | 后面接时间,单位毫秒,表示事件之间的固定延时(执行 每一个指令的间隔时间) |
- -pct-touch | 后接触摸事件百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置),点击 |
- -pct-motion | 后接动作事件百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成),滑动 |
- -pct-trackball | 后面接轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击) |
- -pct-syskeys | 后面接“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、StartCall、End Call及音量控制键)。 |
- -pct-nav | 后面接“基本”导航事件百分比(导航事件主要来自方向输入设备的上,下,左,右事件) |
- -pct-majornav | 后面接“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:键盘的中间按键、回退按键、菜单按键) |
- -pct-appswitch | 后面接启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法。 |
- -pct-flip | 键盘翻转事件 |
- -pct-anyevent | 调整其他时间比例,比如很少使用的keypress等事件 |
- -pct-pinchzoom | 缩放事件 |
- -pct-permission | 未知 |
约束类
选项 | 描述 |
---|---|
-p | 指定包,可一个可多个,多个包需要多个-p |
-c | 指定类,可一个可多个,多个需多个-c |
调试类
选项 | 描述 |
---|---|
- -hprof | 设置此选项,将在Monkey事件序列之前和之后立即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),所以要小心使用它 |
- -ignore-crashes | 当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成 |
- -ignore-timeouts | 当应用程序发生任何超时错误(如“ApplicationNot Responding”对话框)时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成 |
- -ignore-security-exceptions | 当应用程序发生任何权限错误(如启动一个需要某些权限的Activity)时,monkey将继续运行直到计数完成 |
- -ignore-native-crashes | 当应用程序发生native code的崩溃事件时,monkey将继续运行直至计数完成 |
- -kill-process-after-error | 设置此项后,当monkey因为应用程序发生错误而停止时,将会通知系统停止发生错误的进程 |
- -monitor-native-crashes | 设置此项后,monkey运行时native code的崩溃事件将被监视并报告 |
常用monkey示例
1 | adb shell monkey -p com.android.camera --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --pct-touch 70 --pct-motion 25 --pct-majornav 5 -v -v -v --throttle 300 100000 > E:\app_workstation\Android_files\MONKEY\1.log 2>&1 |
以上命令执行效果:忽略app崩溃,忽略超时,忽略权限异常,忽略应用程序发生崩溃的本地代码,触摸事件百分比70%,手势事件25%,主要导航事件5%;日志等级三级,事件间隔3s,执行100000次事件,输出和错误都打印进D盘1.log文件中
补充标准输出知识
linux中,标准输入stdin
,标准输出stdout
,标准错误stderr
,分别使用0,1,2代替,所以就有了以下几种常用的重定向方式:
sh test.sh > 1.log
,标准错误输出到屏幕,标准输出打印到1.log文件中,1.log中没有错误内容sh test.sh > 2.log 2>&1
,标准输出和标准错误都打印到2.log文件中sh test.sh > 3.log 2 >err.log
,标准输出打印到3.log文件,标准错误打印到err.log文件
使用monkey生成日志之后,需要对日志进行筛查,看是否有APP崩溃记录或者无响应记录。
- 崩溃记录查找”CRASH”
- 无响应记录查找”ANR”(Application No Responding)
- 内存泄露问题搜索”GC”(需进一步分析)
- 异常问题搜索“Exception”(如果出现空指针,NullPointerException,需格外重视)
停止Monkey
既然是linux进程,想停,很简单,找出来,kill掉..adb shell ps | grep monkey
adb shell kill -9 PID
完~