adb进阶二 —— Monkey (1)

adb进阶二 —— Monkey (1)

Monkey简介

Monkey是一个可运行在Android环境中的命令行工具,使用monkey尅发送一些伪随机事件(pseudo-random)的用户事件流,例如点击,触摸,手势等。通过monkey,我们可以注入随机事件流或者自定义特定事件来对应用进行健壮性、稳定性测试。

Monkey用途

通过使用monkey来对应用进行压力测试。

Monkey包含一系列选项,主要包括以下方面:

  1. 基础配置项,比如设置注入事件的数量adb shell monkey 500
  2. 备选限制,比如限制测试单个包adb shell monkey -p com.android.camera 5000
  3. 事件类型和频率
  4. 调试选项

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
2
3
4
5
6
7
8
9
10
# Script to start "monkey" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/monkey.jar
trap "" HUP
for a in "$@"; do
echo " bash arg:" $a
done
exec app_process $base/bin com.android.commands.monkey.Monkey "$@"

可以看到调用的是com.android.commands.monkey.Monkey

Monkey命令

基本命令

基础语法:adb shell monkey [option] <event-count>
当不指定任何选项时,monkey将默认静态模式,并且会向目标设备的所有包发送随机事件

基本使用:adb shell monkey

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{lamb} adb shell monkey                                                 
args: []
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
[-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
[--ignore-crashes] [--ignore-timeouts]
[--ignore-security-exceptions]
[--monitor-native-crashes] [--ignore-native-crashes]
[--kill-process-after-error] [--hprof]
[--match-description TEXT]
[--pct-touch PERCENT] [--pct-motion PERCENT]
[--pct-trackball PERCENT] [--pct-syskeys PERCENT]
[--pct-nav PERCENT] [--pct-majornav PERCENT]
[--pct-appswitch PERCENT] [--pct-flip PERCENT]
[--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
[--pct-permission PERCENT]
[--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
[--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
[--wait-dbg] [--dbg-no-events]
[--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
[--port port]
[-s SEED] [-v [-v] ...]
[--throttle MILLISEC] [--randomize-throttle]
[--profile-wait MILLISEC]
[--device-sleep-time MILLISEC]
[--randomize-script]
[--script-log]
[--bugreport]
[--periodic-bugreport]
[--permission-target-system]
COUNT

可以看见列出了所有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代替,所以就有了以下几种常用的重定向方式:

  1. sh test.sh > 1.log,标准错误输出到屏幕,标准输出打印到1.log文件中,1.log中没有错误内容
  2. sh test.sh > 2.log 2>&1,标准输出和标准错误都打印到2.log文件中
  3. 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

完~

文章目录
  1. Monkey简介
    1. Monkey用途
    2. Monkey程序简介
  2. Monkey命令
    1. 基本命令
    2. Monkey Option
      1. 常规类
      2. 事件类
      3. 约束类
      4. 调试类
    3. 常用monkey示例
      1. 补充标准输出知识
    4. 停止Monkey
|