Android原生Monkey工具的使用

前言

在安卓应用开发与测试过程中,稳定性始终是衡量产品质量的核心指标之一。无论是系统预装应用,还是第三方 APK,都可能在长时间运行、频繁交互或极端场景下暴露出崩溃、无响应(ANR)、界面错乱等问题。如何在不编写复杂测试脚本的前提下,快速、高效地发现这些潜在缺陷,成为测试工程师面临的重要课题。

Monkey 是安卓 SDK 自带的一款命令行压力测试工具,它通过向系统发送大量伪随机的用户事件(如点击、滑动、按键、应用切换等),模拟真实用户的高强度操作,从而检验应用在极端场景下的稳定性与健壮性。凭借其简单易用、无需编写代码、可复现问题等特点,Monkey 已成为安卓稳定性测试中不可或缺的利器。

本文将从 Monkey 测试的作用、命令汇总、命令解析、常用实例以及日志分析与问题定位五个方面,系统性地介绍 Monkey 工具的使用方法与实战技巧,帮助读者快速上手并灵活运用于日常测试工作中。

目录

  • 一、Monkey测试的作用:介绍 Monkey 在安卓系统层面和 APP 应用层的测试价值。
  • 二、Monkey命令汇总:列出安卓16版本下 Monkey 的全部可用命令。
  • 三、命令解析:逐一解析常规命令、必填命令、事件命令、约束命令、调试命令和日志保存命令。
  • 四、常用命令与实例:给出测试安卓系统和测试某 APK 的完整命令示例。
  • 五、日志分析与问题定位:讲解如何分析 Monkey 日志并定位崩溃、ANR 等问题。

一、Monkey测试的作用

1、安卓系统层面的测试

测试系统预装应用的稳定性

如设置、计算机、日历、时钟、录音机、相机、相册、文件管理等系统预装应用

测试Android 框架层 (Framework)

测试系统在多任务频繁切换时的调度和稳定性和高压下的事件处理能力

硬件抽象层 (HAL) 与设备特性

针对某些特殊安卓设备,如没有物理按键的,不支持触摸等特殊安卓设备,可测试系统对缺失硬件特性的容错处理能力

2、安卓APP应用层的测试

1、测试APK应用的稳定性

通过大量随机事件可测出APK崩溃和ANR等异常问题

2、测试APK应用的健壮性

通过大量的随机点击、滑动、按键等操作检验应用是否会出现:界面错乱、控件状态异常;数据丢失、重复提交;异常弹窗、无法返回等异常现象

3、APK应用界面(Activity)的生命周期和跳转

通过 --pct-appswitch 随机启动 Activity,测试:多 Activity 频繁切换是否稳定。应用被系统回收后重新进入是否正常。任务栈管理是否合理。

4、APK的权限变化测试

使用 --pct-permission 随机授予或撤销运行时权限,测试:权限被拒绝时应用是否崩溃。权限被撤销后功能是否异常。

5、APK与系统交互测试

模拟系统按键、导航键、屏幕旋转等:Home、返回、菜单、音量键。横竖屏切换。键盘弹起/收起等交互动作,测试APK是否稳定

6、APK长时间运行稳定性测试

二、Monkey命令汇总

以下为安卓16版本执行help命令后获取到的命令如下:

三、命令解析

1、常规命令:

-help命令

用于列出Monkey命令行说明

shell 复制代码
adb shell monkey -help
-v命令

增加日志详细程度

-v :Level 0,(默认)仅提供启动、完成和最终结果;

-v -v:Level 1 ,提供逐个发送到 Activity 的事件信息;

-v -v -v:Level 2 ,可获得最详细日志

shell 复制代码
adb shell monkey 100 -v -v -v

2、必填命令

事件数量为必填选项,不填无法执行,其他命令可选填

用法如下:

shell 复制代码
adb shell monkey 100

3、事件命令(总计11种)

点击事件:点击屏幕某个位置,并在该事件后面添加触发比例

shell 复制代码
adb shell monkey 100 --pct-touch 10% -v -v -v

直线滑动事件:

shell 复制代码
adb shell monkey 100 --pct-motion 10% -v -v -v

二指缩放事件:

shell 复制代码
adb shell monkey 100 --pct-pinchzoom 10% -v -v -v

曲线滑动事件

shell 复制代码
adb shell monkey 100 --pct-trackball 10% -v -v -v

屏幕旋转事件

shell 复制代码
adb shell monkey 100 --pct-rotation 10% -v -v -v

上下左右按键事件(老旧安卓版本才有的事件,无需测试)

shell 复制代码
adb shell monkey 100 --pct-nav 10% -v -v -v

界面跳转事件(包括返回键、菜单键、APP上的界面跳转按钮)

shell 复制代码
adb shell monkey 100 --pct-majornav 10% -v -v -v

系统按键事件(音量键、back键、home键、APP键)

shell 复制代码
adb shell monkey 100 --pct-syskeys 10% -v -v -v

应用启动事件

shell 复制代码
adb shell monkey 100 --pct-appswitch 10% -v -v -v

键盘翻转事件(键盘弹起/收起)

shell 复制代码
adb shell monkey 100 --pct-flip 10% -v -v -v

其他类型事件

shell 复制代码
adb shell monkey 100 --pct-anyevent 10% -v -v -v

应用权限授予/撤销事件

shell 复制代码
adb shell monkey 100 --pct-permission 10% -v -v -v
注意事项:

1、如被测试的安卓设备本身不支持某种事件,则测试时需要在命令中将不支持的事件执行比例设置为0,否则运行会直接报错

shell 复制代码
//被测设备无系统按键功能
adb shell monkey 100 --pct-syskeys 0 -v -v -v

2、设置事件和事件执行比例为选填项,遵从以下执行规则

4、约束命令

1、-p命令:

限制 Monkey 仅对指定包名的应用进行操作,可多次使用以测试多个包,不设置时默认操作所有APP,不能与白名单或者黑名单命令同时使用

用法如下:

shell 复制代码
//仅测试一个应用
adb shell monkey -p com.android.music 100
//测试多个应用
adb shell monkey -p com.android.music -p com.android.mtp 100
2、-c命令:

限制Monkey仅对指定Activity操作,也就是指定的页面,同样可以多次使用以测试多个页面,不设置时默认为所有页面

shell 复制代码
//仅测试一个界面
adb shell monkey -c com.android.music.LAUNCHER 100
//测试多个界面
adb shell monkey -c com.android.music.LAUNCHER -c com.android.music.MainActivity 100
3、--pkg-whitelist-file <file>命令:

白名单命令,指定一个白名单文件,Monkey将只测试白名单文件中列出来的应用包,白名单文件为txt文件,文件中每个应用包名为一行,不能与-p或者黑名单命令同时使用

shell 复制代码
adb shell monkey --pkg-whitelist-file /sdcard/whitelist.txt -v -v -v 1000

4、--pkg-blacklist-file <file>命令:

黑名单命令,指定一个黑名单文件,Monkey将跳过黑名单文件中列出来的应用包,黑名单文件为txt文件,文件中每个应用包名为一行,不能与-p或者白名单命令同时使用

shell 复制代码
adb shell monkey --pkg-blacklist-file /sdcard/blacklist.txt -v -v -v 1000

5、调试命令

1、-s <seed>

伪随机数生成器的种子值。相同的种子会产生完全相同的事件序列,用于复现问题。用法如下

a、当Monkey测试出现问题后,在打印日志开头中找到seed值,如下所示

b、再次运行相同的测试命令,同时在测试命令中加入-s <send>,就可以复现出现的问题

shell 复制代码
adb shell monkey --pct-syskeys 0  -s 1790439104494 -v -v -v 100
2、--throttle <milliseconds>

设置事件执行的延迟时间,单位为毫秒,如下为300毫秒,意思是每隔300毫秒执行一个事件

shell 复制代码
adb shell monkey --pct-syskeys 0 --throttle 300 10
3、--randomize-throttle

需与--throttle参数同时使用,作用是将固定的延迟时间变为一个随机变化的区间,如下所示:

shell 复制代码
adb shell monkey --pct-syskeys 0 --throttle 300 --randomize-throttle 10
4、--ignore-crashes

忽略应用崩溃,添加此命令后,当测试过程中出现应用崩溃的异常时,Monkey测试不会终止,仍会继续往下测,不加此命令时,出现应用崩溃后Monkey会直接停止运行

shell 复制代码
adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes
5、--ignore-timeouts

忽略 ANR(应用无响应)错误,同样与应用崩溃一样,出现后Monkey会直接停止运行

shell 复制代码
adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts
6、--ignore-security-exceptions

忽略许可证书错误,同样与应用崩溃一样,出现后Monkey会直接停止运行

shell 复制代码
adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions
7、--ignore-native-crashes

忽略本地代码导致的崩溃,同样与应用崩溃一样,出现后Monkey会直接停止运行

shell 复制代码
adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes
8、--monitor-native-crashes

监控并记录底层库的崩溃,用法如下:

1、监控到崩溃信息后会保存在tombstone 文件

2、通过adb pull /data/tombstones/命令将文件拉取出来

3、使用 ndk-stack 或 addr2line 等工具解析tombstone 文件

4、此命令再监控到底层崩溃后会停止Monkey测试,所以需搭配--ignore-native-crashes命令一起使用

shell 复制代码
adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes
9、--bug-report-on-failure

测试失败时生成 bug 报告,报告文件会自动存储在sdcard根目录

shell 复制代码
adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes --bug-report-on-failure
10、--kill-process-after-error

发生错误后终止被测试应用进程,如果不设置此命令,应用在出现错误后会一直在后台保持错误发生后的状态

shell 复制代码
adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes --bug-report-on-failure --kill-process-after-error

6、日志保存命令

保存到电脑本地

shell 复制代码
adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes --bug-report-on-failure --kill-process-after-error > log.txt

保存到设备存储,需注意:保存到设备存储时,monkey命令需要和adb shell分开执行,否则会报错"系统找不到指定路径",如下所示

shell 复制代码
adb shell
monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes --bug-report-on-failure --kill-process-after-error > /sdcard/log.txt

正常日志和错误日志分开保存到电脑,1表示正常日志,2表示错误日志

shell 复制代码
adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes --bug-report-on-failure --kill-process-after-error 1> monkeyinfo.txt 2> monkeyerror.txt

四、常用命令与实例

测试安卓系统

shell 复制代码
adb shell 
monkey -v -v -v 100000 --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes --bug-report-on-failure 1> /sdcard/Monkey1.txt 2> /sdcard/Monkey2.txt

测试某APK

shell 复制代码
adb shell 
monkey -p com.xx.demo -v -v -v 100000 --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes --bug-report-on-failure 1> /sdcard/Monkey1.txt 2> /sdcard/Monkey2.txt

五、日志分析与问题定位

Monkey 测试结束后,日志分析是定位问题、复现缺陷的关键环节。本节将介绍如何从 Monkey 日志中提取关键信息,并结合系统日志定位崩溃、ANR 等异常问题。

1、Monkey 日志的关键信息

一份完整的 Monkey 日志通常包含以下关键信息:

  • Seed 值 :日志开头的 Seed: 1790439104494 用于复现相同的事件序列。
  • 事件比例:日志中会列出各类事件的执行比例,便于确认测试覆盖范围。
  • 执行进度 :Events injected: 100 表示已注入的事件数量,可观察测试是否中途停止。
  • 异常信息:崩溃(Crash)、ANR、安全异常等错误信息,是问题定位的核心依据。
  • 最终结果 :Monkey finished 表示测试正常完成,Monkey aborted 表示测试异常终止。

2、崩溃(Crash)日志分析

当 Monkey 测试过程中出现应用崩溃时,日志中会出现类似以下的关键信息:

shell 复制代码
// 日志中出现的崩溃提示
// CRASH: com.example.demo (pid 12345)
// Short Msg: android.content.ActivityNotFoundException
// Long Msg: android.content.ActivityNotFoundException: No Activity found to handle Intent
// Build Label: demo/1.0
// Build Fingerprint: demo
// Caused by: android.content.ActivityNotFoundException
//   at android.app.ActivityThread.main(ActivityThread.java:1234)
//   at java.lang.reflect.Method.invoke(Native Method)
// ** System appears to have crashed at event 87 of 100 using seed 1790439104494

分析崩溃日志时,重点关注以下内容:

  • 崩溃类型 :如 ActivityNotFoundException、NullPointerException 等,判断异常类别。
  • 崩溃位置:堆栈信息中的类名和方法名,定位到具体代码位置。
  • 事件序号 :event 87 of 100 表示崩溃发生在第 87 个事件,结合 --pct-appswitch 等事件比例可推断触发场景。
  • Seed 值 :使用 -s 1790439104494 重新运行,可复现崩溃现场。

3、ANR(应用无响应)日志分析

ANR 通常表现为应用长时间无响应,Monkey 日志中会出现如下提示:

shell 复制代码
// 日志中出现的 ANR 提示
// ANR in com.example.demo (pid 12345)
// Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events)
// Load: 5.32 / 4.12 / 3.98
// CPU usage from 1234ms to 2345ms later:
//   100% 12345/com.example.demo: 100% user + 0% kernel / faults: 1234 minor
// ** System appears to have crashed at event 45 of 100 using seed 1790439104494

ANR 分析要点:

  • ANR 类型:输入分发超时、广播超时、服务超时等,判断是哪种 ANR。
  • CPU 占用:日志中的 CPU 使用率可判断是主线程阻塞还是系统负载过高。
  • 事件序号:结合事件序号和事件比例,推断是哪个操作触发了 ANR。
  • 复现验证:使用相同的 Seed 值重新运行,确认 ANR 是否稳定复现。

4、结合 logcat 日志定位问题

Monkey 日志只能定位到事件级别,要深入分析崩溃或 ANR 的根因,还需要结合 logcat 系统日志。建议在运行 Monkey 测试时同步抓取 logcat 日志:

shell 复制代码
// 抓取 logcat 日志到电脑本地
adb logcat -v time > logcat.txt

抓取到 logcat 日志后,可按以下步骤定位问题:

  • 按崩溃时间过滤:根据 Monkey 日志中的崩溃时间点,在 logcat 中定位对应时间段的日志。
  • 按包名过滤 :使用 adb logcat | grep com.example.demo 过滤目标应用的日志。
  • 按异常类型过滤 :搜索 FATAL EXCEPTION、ANR in 等关键字,快速定位异常。
  • 查看堆栈信息 :结合 AndroidRuntime 标签下的堆栈信息,定位到具体代码行。

5、常见问题与解决思路

问题类型 日志特征 解决思路
Activity 未找到 ActivityNotFoundException 检查 AndroidManifest.xml 中 Activity 是否注册,或跳转的 Intent 是否正确
空指针异常 NullPointerException 根据堆栈定位空对象来源,检查初始化逻辑和异步回调
ANR 无响应 Input dispatching timed out 检查主线程是否执行耗时操作,优化耗时逻辑或移至子线程
权限被拒绝 SecurityException 检查运行时权限申请逻辑,确认权限声明和授权流程
内存不足 OutOfMemoryError 检查内存泄漏和图片加载,优化资源释放策略

6、问题定位实战流程

综合以上方法,推荐按以下流程进行问题定位:

  1. 查看 Monkey 日志:确认测试是否正常完成,记录 Seed 值和异常事件序号。
  2. 定位异常类型:根据日志中的 Crash、ANR 等关键字,判断异常类别。
  3. 结合 logcat 分析:在 logcat 日志中定位对应时间点和包名的详细堆栈信息。
  4. 复现问题 :使用 -s <seed> 重新运行,确认问题是否稳定复现。
  5. 修复验证:修复后再次运行相同 Seed 的测试,确认问题已解决。

通过以上方法,可以系统性地从 Monkey 日志中定位崩溃、ANR 等稳定性问题,并结合 logcat 深入分析根因,最终推动问题修复和回归验证。

相关推荐
Code Man2 小时前
实现 Android 字符设备驱动
android·驱动开发·lineageos
传奇开心果编程2 小时前
【Flutter入门练中学】第3课:滚动与列表
android·学习·flutter·ui·ios
JosieBook2 小时前
【数据库】MySQL 实战精通系列 · 第4篇:索引原理与执行计划实战
android·数据库·mysql
mmsx2 小时前
Android UI 复用体系:泛型基类、骨架与插槽
android·kotlin
Cici_ovo2 小时前
手机数据删除原理、运行内存、闪存、机械硬盘完整原理详解
android·智能手机
hi_LeTian3 小时前
【Linphone】Ubuntu20.04 编译 Linphone5.2 Android SDK 适配RK3326硬解码完整教程(避坑版)
android
SoStraw3 小时前
跨平台P2P通信SDK,Windows/Android/iOS/Linux/macOS一套API全兼容
android·linux·windows·跨平台·p2p·webrpc
李游Leo3 小时前
《HarmonyOS 7 ArkGraphics 3D 空间设计开发实战》07:复杂3D场景的帧率、内存与资源性能优化【鸿蒙心迹】
android·3d·性能优化·harmonyos
天神哥哥啊3 小时前
unity联调注意事项-安卓
android·unity·游戏引擎