一、基础知识

1.1 工具定义与作用

Android Monkey是Android SDK自带的命令行压力测试工具,通过向设备发送伪随机用户事件流(如触摸、滑动、按键、屏幕旋转等),模拟用户操作以检测应用的稳定性和健壮性。其核心价值在于快速暴露应用在随机操作下的崩溃(Crash)无响应(ANR) 等问题,适用于应用发布前的稳定性验证、回归测试及长时间压力测试场景。

1.2 工作原理

Monkey工具运行在Android设备或模拟器中,通过以下流程实现测试:

  1. 事件生成:基于伪随机算法生成用户事件(触摸、滑动等),支持通过参数控制事件类型及比例。
  2. 事件发送:将生成的事件流发送到Android系统事件队列,由系统分发给目标应用。
  3. 异常监控:实时监控应用状态,若发生Crash、ANR或权限异常,默认停止测试并记录日志(可通过参数设置忽略异常继续测试)。
  4. 结果输出:生成测试日志,包含事件序列、异常信息及测试统计数据。

1.3 环境搭建

1.3.1 前置条件
  • 硬件:Android设备(真机/模拟器)、USB数据线(真机测试)。
  • 软件
    • 电脑安装Android SDK(需包含platform-tools,提供adb工具);
    • 设备开启开发者模式USB调试(路径:设置→关于手机→连续点击“版本号”激活开发者模式,进入开发者选项开启USB调试)。
1.3.2 环境验证
  1. 连接设备:通过USB连接真机,或启动模拟器,执行以下命令验证连接:
    
      
    adb devices # 列出已连接设备,显示设备ID表示连接成功
  2. ADB环境测试:执行以下命令查看Monkey帮助信息,确认环境正常:
    
      
    adb shell monkey -h # 输出Monkey参数说明

1.4 基本命令格式

Monkey命令的核心结构为:


adb shell monkey [参数] <事件总数>
  • 必填项<事件总数>(指定发送的随机事件数量,如1000表示发送1000次事件)。
  • 可选项:控制测试范围、事件类型、日志级别等(详见“常用技巧”章节)。

示例:对“计算器”应用发送1000次随机事件:


adb shell monkey -p com.android.calculator2 1000

二、常用技巧

2.1 核心参数详解

2.1.1 测试范围控制
参数 作用 示例
-p <包名> 指定测试的应用包名(仅允许启动该包内Activity) -p com.tencent.mobileqq(测试QQ)
-c <类别> 限制启动的Activity类别(默认Launcher/Monkey) -c android.intent.category.LAUNCHER
2.1.2 事件类型与比例

通过--pct-<事件类型> <百分比>调整各类事件占比(总和≤100%),常用事件如下:

参数 事件描述 典型场景
--pct-touch 触摸事件(屏幕单点按下-抬起) 按钮点击、输入框触发
--pct-motion 滑动事件(按下-随机移动-抬起,直线滑动) 列表滚动、页面切换
--pct-appswitch Activity切换事件(启动新Activity) 应用内页面跳转
--pct-rotation 屏幕旋转事件(横竖屏切换) 检测应用对屏幕方向变化的适配性
--pct-syskeys 系统按键事件(Home、Back、音量键等) 模拟用户返回、退出应用

示例:设置触摸事件40%、滑动25%、应用切换10%、旋转5%:


adb shell monkey -p com.tencent.mobileqq --pct-touch 40 --pct-motion 25 --pct-appswitch 10 --pct-rotation 5 20000
2.1.3 调试与日志参数
参数 作用 示例
-v 日志级别(-v:基础日志,-v -v:详细日志,-v -v -v:最详细日志) -v -v -v(输出事件详情及Activity切换日志)
--throttle <毫秒> 事件间隔(控制测试速度,模拟真实用户操作) --throttle 400(事件间隔400ms)
--ignore-crashes 忽略应用崩溃,继续测试 测试中遇到Crash不停止,仅记录日志
--ignore-timeouts 忽略ANR(应用无响应),继续测试 遇到ANR时不停止,仅记录日志
-s <seed值> 固定随机数种子(相同seed生成相同事件序列,用于复现问题) -s 1234(种子值1234,可复现事件流)

2.2 日志管理与分析

2.2.1 日志保存

通过重定向将日志保存到本地文件,便于后续分析:

adb shell monkey [参数] <事件数> > D:\monkey_log.txt  # Windows
adb shell monkey [参数] <事件数> > ~/monkey_log.txt   # Mac/Linux
2.2.2 关键日志筛选

测试完成后,通过以下关键词定位问题:

  • Crash:搜索 CRASHException(如 NullPointerException);
  • ANR:搜索 ANR inApplication Not Responding
  • 事件序列:通过 -v -v -v 日志查看具体事件(如触摸坐标、按键类型)。

示例:从日志中提取Crash信息:

// CRASH: com.tencent.mobileqq (pid 12345)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

2.3 高效测试策略

  1. 事件比例优化:根据应用特性调整事件占比,例如社交类应用可提高--pct-touch(触摸)和--pct-appswitch(页面切换)比例;
  2. 种子值复用:发现问题后,使用相同-s <seed>参数重新运行,复现事件序列;
  3. 长时测试:结合--throttle控制速度,设置大量事件(如10万次)进行夜间稳定性测试。

三、高级使用

3.1 自定义事件脚本(MonkeyScript)

Monkey支持通过脚本文件(.script)定义非随机事件序列,实现固定路径测试(如登录流程)。

3.1.1 脚本语法

脚本包含基础命令(如launchActivity启动应用、tap点击、drag滑动等),示例如下:

# 脚本示例:启动计算器并执行1+2=3
type=user
count=10
speed=1.0
start data >>
launchActivity(com.android.calculator2, .Calculator)  # 启动计算器
tap(100, 500)  # 点击数字“1”(坐标需根据设备分辨率调整)
tap(200, 500)  # 点击“+”
tap(100, 600)  # 点击数字“2”
tap(300, 700)  # 点击“=”
3.1.2 执行脚本
  1. 将脚本推送到设备:
    
      
    adb push test.script /data/local/tmp/
  2. 执行脚本:
    
      
    adb shell monkey -f /data/local/tmp/test.script 10 # 10为事件数(需≥脚本事件数)

3.2 结合ADB命令扩展功能

3.2.1 获取应用包名
  • 方法1:通过pm list packages列出所有包名(-3筛选第三方应用):
    
      
    adb shell pm list packages -3 # 列出第三方应用包名,如com.tencent.mobileqq
  • 方法2:通过logcat监控应用启动:
    
      
    adb logcat | grep START # 启动目标应用,日志中“cmp=包名/Activity名”即为包名
3.2.2 生成内存快照

使用--hprof参数在测试前后生成内存快照(.hprof文件),用于分析内存泄漏:

adb shell monkey -p com.example.app --hprof 1000  # 测试后在/data/misc生成hprof文件
adb pull /data/misc/monkey.hprof D:\  # 拉取到本地,用Android Studio Profiler分析

3.3 多设备并行测试

通过-s <设备ID>指定设备,实现多设备同时测试:

adb -s emulator-5554 shell monkey -p com.example.app 10000  # 设备1
adb -s emulator-5556 shell monkey -p com.example.app 10000  # 设备2

四、项目实操

4.1 测试场景:微信稳定性测试

4.1.1 测试目标

验证微信(包名com.tencent.mm)在2小时随机操作下的稳定性,重点检测Crash、ANR及功能异常。

4.1.2 环境准备
  • 设备:Android真机(型号:小米12,系统Android 13);
  • 前置操作:登录微信账号,关闭锁屏,保持电量≥90%,连接WiFi。
4.1.3 测试命令
adb shell monkey -p com.tencent.mm \
--pct-touch 40 \          # 触摸事件40%
--pct-motion 25 \         # 滑动事件25%
--pct-appswitch 10 \      # 页面切换10%
--pct-rotation 5 \        # 屏幕旋转5%
-s 12345 \                # 种子值12345(用于复现问题)
--throttle 400 \          # 事件间隔400ms
--ignore-crashes \        # 忽略崩溃
--ignore-timeouts \       # 忽略ANR
-v -v -v \                # 详细日志
20000 > D:\wechat_monkey_log.txt  # 事件数20000(约2小时),日志保存到本地
4.1.4 日志分析
  1. 打开wechat_monkey_log.txt,搜索CRASH发现如下异常:
    // CRASH: com.tencent.mm (pid 18762)
    // Short Msg: java.lang.IndexOutOfBoundsException
    // Long Msg: java.lang.IndexOutOfBoundsException: Invalid index 5, size is 3
  2. 定位问题:根据堆栈信息,开发团队确认是“朋友圈列表滑动时数据越界”导致,后续版本修复。

4.2 测试报告输出

测试报告需包含以下内容:

  • 测试概要:应用名称、包名、测试时长、事件数、设备信息;
  • 问题统计:Crash次数、ANR次数、异常类型及触发场景;
  • 日志片段:关键错误日志及截图(若结合截图工具);
  • 优化建议:针对高频问题提出改进方向(如内存优化、异常捕获)。

五、常见问题

5.1 设备连接问题

问题描述:执行adb devices无设备显示(device not found)。

解决方案

  1. 检查USB调试是否开启,重新插拔数据线或更换原装线;
  2. 重启ADB服务:
    adb kill-server && adb start-server
  3. 安装设备驱动(如小米/华为需安装官方驱动)。

5.2 权限不足问题

问题描述:无法访问/data/anr/traces.txt(ANR日志文件)。

解决方案

  1. 设备root后直接拉取:
    adb root  # 获取root权限(仅部分设备支持)
    adb pull /data/anr/traces.txt D:\
  2. 非root设备:通过adb bugreport生成完整报告,从中提取ANR信息:
    adb bugreport D:\bugreport.zip # 生成报告后解压,在ANR文件夹中查找traces.txt

5.3 测试中断问题

问题描述:Monkey测试中途停止,日志显示Aborted

可能原因及解决

  • 应用崩溃未忽略:添加--ignore-crashes参数;
  • 系统按键退出应用:降低--pct-syskeys比例(如设为0%);
  • 设备资源不足:关闭后台应用,确保测试期间设备空闲。

六、工具总结

6.1 优缺点分析

优势 局限性
1. 无需编写复杂脚本,上手成本低; 1. 事件随机,无法覆盖特定业务路径;
2. 支持长时间压力测试,暴露隐藏问题; 2. 对自定义控件或WebView页面覆盖率低;
3. 轻量集成于Android SDK,无需额外安装。 3. 日志分析需人工筛选,效率较低。

6.2 同类工具对比

工具 定位 适用场景
Monkey 随机事件压力测试 快速稳定性验证、冒烟测试
UI Automator 控件级自动化测试 功能测试、路径固定的场景测试
Espresso Android官方UI测试框架 单元测试、集成测试(需编写代码)
AppCrawler 基于控件遍历的测试工具 深度遍历测试、多页面覆盖测试

6.3 最佳实践建议

  1. 测试时机:功能测试完成后、版本发布前执行,结合CI/CD流程自动化触发;
  2. 参数组合:根据应用类型调整事件比例(如游戏类提高--pct-motion);
  3. 结果分析:结合Android Studio LogcatSentry等工具定位问题,优先解决高频Crash/ANR;
  4. 进阶方向:通过二次开发Monkey源码(如添加截图、控件识别功能)或集成Maxim等增强工具提升测试效率。

通过本手册,可系统掌握Android Monkey测试工具的使用方法,从基础参数到高级脚本编写,结合实际项目场景实现高效的稳定性测试。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐