(一)Monkey简介

Monkey意指猴子,顽皮淘气。所以Monkey测试,顾名思义也就像猴子一样在软件上乱敲按键,猴子什么都不懂,就爱捣乱。

Monkey 是 Android SDK 自带的命令行工具,它通过向系统发送伪随机的用户事件流(如点击、滑动、按键等),对正在运行的应用程序进行压力测试。

Monkey 测试的核心原理基于 Android 系统的事件驱动机制。它生成的事件被发送到系统的事件队列中,然后由系统分发到相应的应用程序。这些随机事件的组合模拟了用户在使用应用时可能进行的各种操作,以此来检测应用在不同操作序列下的表现。

Monkey包括许多选项,它们大致分为四大类:

(1)基本配置选项,如设置尝试的事件数量;

(2)运行约束选项,如设置只对单独的一个包进行测试;

(3)事件类型和频率;

(4)调试选项;

(二)Money原理

在Monkey运行的时候,它生成事件,并把它们发给系统。同时,Monkey还对测试中的系统进行监测,对下列三种情况进行特殊处理(自动停止):

(1)如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止;

(2)如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错;

(3)如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错;

按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。

(1)Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;

(2)Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey;

(3)通过在cmd窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试;

(三)Monkey命令详解

首先我们需要有adb工具,如果没有可以参考 ADB环境配置 ,完成工具安装,熟悉操作环境。

首先,我们需要先知道待测APP的包名,我们可以直接使用adb命令获取包名,先打开进入需要获取包名的APP,再输入命令:

adb shell
dumpsys activity | grep mFocus

基本语法:

adb shell monkey [options] <event-count>

  •  adb shell:进入设备shell
  • monkey:启动Monkey工具
  • [options]:配置参数
  • <event-count>:事件数量(如10000)

常用参数说明:

参数说明示例
-p <包名>指定测试的应用包名-p com.android.settings
-s <种子>指定随机数种子,便于复现问题-s 123
--throttle <毫秒>设置事件时间间隔--throttle 500
-v / -vv / -vvv设置日志详细程度(最多三级)-vvv
--ignore-crashes忽略崩溃继续执行--ignore-crashes
--ignore-timeouts忽略ABR错误继续执行--ignore-timeouts
--monitor-natvie-crashes监控native层崩溃--monitor-native-crashes
--pct-touch <百分比>设置触摸事件比例--pct-touch 50
--pct-motion <百分比>设置滑动事件比例--pct-touch 30
--pct-appswitch <百分比>设置应用切换事件比例--pct-appswitch 10
--pct-rotation <百分比>设置屏幕旋转事件比例--pct-rotation 5
--bugreport自动生成bugreport日志--bugreport
> log.txt将日志输出到文件> /sdcard/monkey_log.txt

示例命令:

adb shell
monkey -p com.android.settings --throttle 500 -v -v -v --ignore-crashes --ignore-timeouts --pct-touch 50 -pct-motion 30 10000 > /sdcard/monkey_log.txt

含义:对 com.android.settings 执行10000次monkey测试,事件间隔500ms,日志详细,忽略奔溃与超时,触摸事件占50%,滑动事件占30%,并将日志保存为/sdcard/monkey_log.txt文本

注意:adb shell进入后,只能读取到设备的文件路径,例如/sdcard/

如果是adb shell monkey -p com.android.settings -v 10000 > F:\monkey_log.txt  就可以访问本电脑路径,将log直接保存到本电脑

(四)应用场景

1. App稳定性测试(压力测试)

目的: 模拟用户连续操作,验证App是否会崩溃、闪退或无响应

应用场景:

  • App发布前的稳定性验证
  • 回归测试阶段,确保旧功能未被新版本影响
  • 夜间持续运行Monkey,观察长时间运行后的表现

示例命令:

adb shell monkey -p com.exmaple.app --throttle 300 -v -v -v 10000

每300ms发送一次事件,共10000次,记录详细日志

2. Bug复现与定位

目的:通过设置相同的随机种子,复现Monkey触发的异常

应用场景:

  • 某次Monkey测试发现崩溃,需复现问题
  • 开发修复后,验证是否已解决

示例命令:

adb shell monkey -p com.example.app -s 1752714219455 -v -v -v 10000

使用种子 1752714219455 复现崩溃场景

3. 整机稳定性测试

目的:测试系统级稳定性,包括多App切换、系统按键响应等

应用场景:

  • Android系统ROM测试
  • 智能硬件整机测试(如电视盒子、车载设备)

示例命令:

adb shell monkey --pct-syskeys 20 --pct-appswitch 30 -v 1000

增加系统按键和App切换事件比例,模拟整机使用场景

4. 安全性与异常处理测试

目的:验证App在权限异常、奔溃、ANR等情况下的处理能力

应用场景:

  • 检查是否有未捕获异常
  • 验证ANR弹窗是否出现
  • 测试App是否能恢复运行

示例命令:

adb shell monkey -p com.example.app --ignore-crashes --ignore-timeouts --monitor-native-crashes -v 10000

即使发生崩溃或者ANR,Monkey继续执行,便于收集更多异常

5. CI自动化集成测试

目的:将Monkey测试集成到持续集成流程,定期执行稳定性验证

应用场景:

  • 每次构建后自动执行Monkey测试
  • 结合logcat分析异常日志
  • 自动生成测试报告

示例命令:

adb shell monkey -p com.example.app --throttle 500 -s 2025 -v 10000 >/sdcard/monkey_log.txt

将日志输出到设备,供后续分析

(五)实战演练

这是我输入monkey -p com.android.settings -v 10000 进行monkey的测试结果

这段日志表明 Monkey 测试异常终止,核心信息是 “系统在执行到第 9647 个事件时崩溃”,具体分析如下:

1. 关键日志解读

  • Monkey aborted due to error:Monkey 测试因错误强制终止,未完成预设的 10000 个事件。
  • Events injected: 9647:实际成功注入 9647 个事件,距离目标 10000 个仅差 353 个。
  • System appears to have crashed at event 9647:崩溃发生在第 9647 个事件,且可能是系统级崩溃(而非单一应用崩溃)。
  • seed 1752714219455:测试使用的随机数种子,可用于复现崩溃场景(用相同种子重新执行命令,大概率会在同一事件序列触发崩溃)。
  • elapsed time=267988ms:测试总耗时约 268 秒(4 分 28 秒),平均每个事件间隔约 27.8 毫秒(若未设置--throttle,Monkey 会以最快速度发送事件)。

2. 崩溃原因分析

(1)系统级崩溃

  • 表现:日志明确提到 “System appears to have crashed”,说明不是单一应用(如com.android.settings)崩溃,而是整个 Android 系统出现严重错误(如进程卡死、内存溢出、内核 panic 等)。
  • 可能诱因
    • 连续高频率事件导致系统资源耗尽(CPU 100%、内存溢出)。
    • 某一事件触发了系统底层漏洞(如框架层代码缺陷、驱动兼容性问题)。
    • 设备硬件限制(如低端设备无法承受密集事件压力)。

(2)Monkey 自身限制

  • 若测试中涉及跨应用操作(即使指定了-p包名,某些系统事件仍可能触发其他应用),可能导致 Monkey 无法处理的异常。
  • 部分定制 ROM(如厂商修改的系统)对 Monkey 支持不佳,密集事件可能触发系统保护机制(如 watchdog 超时)。

(3)事件序列冲突

  • 第 9647 个事件可能是一个特殊操作组合(如连续快速点击 + 旋转屏幕 + 按键),触发了系统未处理的边缘场景(如 UI 线程阻塞、资源竞争死锁)。

3. 复现与排查建议

(1)复现崩溃场景

使用相同种子重新执行测试,确认是否稳定复现:

adb shell monkey -p com.android.settings -s 1752714219455 -v -v 10000
  • 若复现,说明是确定性问题(与事件序列强相关)。
  • 若偶尔出现,可能是偶发的资源竞争问题。

(2)收集系统崩溃日志

  • 测试时同时记录logcat系统日志,捕获崩溃瞬间的堆栈信息:
adb shell logcat -v time > crash_log.txt  # 实时保存日志
  • 重点查找关键字:
    • AndroidRuntime: FATAL EXCEPTION(应用崩溃)
    • ANR in(应用无响应)
    • kernel: panic(内核崩溃)
    • Watchdog: *WATCHDOG*(系统 watchdog 超时,通常是严重阻塞)

4. 总结

        此问题的核心是密集事件触发了系统级崩溃,需通过相同种子复现问题,结合logcat抓取崩溃堆栈,定位具体是系统资源耗尽、代码漏洞还是硬件限制导致。通过降低事件频率、优化事件类型,可临时规避这个问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89177.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89177.shtml
英文地址,请注明出处:http://en.pswp.cn/web/89177.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时序大模型为时序数据库带来的变革与机遇

时序数据&#xff08;Time Series Data&#xff09;作为记录系统状态随时间变化的重要数据类型&#xff0c;在物联网、金融交易、工业监控等领域呈爆炸式增长。传统时序数据库专注于高效存储和查询时序数据&#xff0c;而时序大模型&#xff08;Time Series Foundation Models&…

深入核心:理解Spring Boot的三大基石:起步依赖、自动配置与内嵌容器

深入核心&#xff1a;理解Spring Boot的三大基石&#xff1a;起步依赖、自动配置与内嵌容器 摘要&#xff1a;在上一章&#xff0c;我们领略了Spring Boot带来的革命性开发体验。但魔法的背后&#xff0c;必有其科学的支撑。本章将带你深入Spring Boot的内核&#xff0c;系统性…

达梦数据库配置兼容MySQL

前言 作为一名数据库管理员或开发者&#xff0c;当项目需要从MySQL迁移到达梦数据库时&#xff0c;最关心的莫过于兼容性问题。达梦作为国产数据库的佼佼者&#xff0c;提供了良好的MySQL兼容模式&#xff0c;今天我就来分享一下如何配置达梦数据库以实现对MySQL的兼容。 一、为…

js与vue基础学习

vue创建项目 安装node安装node、npm、cnpm node -v npm -v #npm服务器位置处于国外&#xff0c;下载包的速度会比较缓慢。阿里为国内用户提供的cnpm&#xff0c;他是npm的镜像&#xff0c;下载第三方包时&#xff0c;们完全可以使用cnpm来替代npm。 cnpm -v在node中执行JavaScr…

【开源.NET】一个 .NET 开源美观、灵活易用、功能强大的图表库

文章目录一、项目介绍二、适用场景三、功能模块四、功能特点五、效果展示六、开源地址一、项目介绍 LiveCharts2 是一个开源、简单、灵活、交互式且功能强大的 .NET 图表库。LiveCharts2 现在几乎可以在任何地方运行&#xff1a;Maui、Uno Platform、Blazor-wasm、WPF、WinFor…

使用Whistle自定义接口返回内容:Mock流式JSON数据全解析

一.mock接口返回数据流程 定位目标接口 在Whistle的Network面板中找到需要Mock的接口&#xff0c;右键点击请求信息&#xff0c;选择COPY -> URL复制完整URL&#xff0c;确保URL路径精确到具体接口。准备Mock数据 点击对应接口&#xff0c;在右侧面板切换到response标签页&a…

【前端】富文本编辑器插件 wangEditor 5 基本使用(Vue2)

https://www.wangeditor.com/v5 一、安装 首先安装editor yarn add wangeditor/editor # 或者 npm install wangeditor/editor --save安装Vue2组件 yarn add wangeditor/editor-for-vue # 或者 npm install wangeditor/editor-for-vue --save或者Vue3 yarn add wangeditor/…

自适应哈希索引 和 日志缓冲区

目录 1. 自适应哈希索引在内存中的位置 2. 自适应哈希索引的作用 3. 为什么要创建自适应哈希索引 4. 适应哈希索引的Key -Value如何设置&#xff1f; 5. 日志缓冲区在内存中的位置 6. 日志缓冲区的作用 7. 日志不通过LogBuffer直接写入磁盘不行吗&#xff1f; 1. 自适应哈…

中国旅行社协会在京召开“文旅人工智能应用研讨会”,助力文旅创新发展

7月15日&#xff0c;由中国旅行社协会数字经济专业委员会和在线旅行服务商分会联合主办的“人工智能技术在文旅产业中的应用”研讨会在北京举行。中国旅行社协会副会长、秘书长孙桂珍出席并致辞&#xff0c;中国工程院外籍院士、具身智能机器人专家张建伟、北京第二外国语学院旅…

Linux之Zabbix分布式监控篇(一)

一、概念和特点概念Zabbix是一款开源、免费的监控软件 主要用于7*24*365实时监控网络设置&#xff0c;操作系统&#xff0c;应用程序&#xff0c;网络带宽等资源的运行状态&#xff0c;并且一旦发生异常能够第一时间个SA管理员发送报警信息特点Zabbix是c/s结构&#xff0c;有c…

ZYNQ千兆光通信实战:Tri Mode Ethernet MAC深度解析

—— 从硬件设计到Linux驱动的光通信创新实践** 当ZYNQ遇上光通信 在工业控制、医疗成像和航空航天等领域,抗干扰、长距离传输的光通信技术至关重要。Xilinx ZYNQ-7000系列凭借ARM+FPGA的架构,结合Tri Mode Ethernet MAC (TEMAC) 核心,为千兆光通信提供了完美解决方案。本文…

求不重叠区间总和最大值

例题链接&#xff1a;1051-习题-数学考试_2021秋季算法入门班第一章习题&#xff1a;模拟、枚举、贪心 来源&#xff1a;牛客网 时间限制&#xff1a;C/C/Rust/Pascal 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C/Rust/Pascal 32 M&#xff0c;其他语言64 M 64bit …

【Golang】GORM - GEN工具 快速开始

文章目录建项目建库建表main.gouser.gocompany.go生成效果&#xff08;更进一步&#xff09;自定义dynamic SQL实践官方地址&#xff1a;https://gorm.io/zh_CN/gen/index.html 以mysql为例 建项目 go mod init 项目名称 go mod tidy建库建表 建数据库demo&#xff0c;正常…

飞书 “打破” AI 与协同办公的「黑箱」

文 | 智能相对论作者 | 陈泊丞在协同办公领域&#xff0c;自从有了AI&#xff0c;微软、钉钉、Google Workspace、Salesforce、企业微信、飞书等厂商都试图通过深度整合AI技术&#xff0c;从智能会议、内容创作、数据管理等场景重构办公范式。微软通过Microsoft 365 Copilot将A…

leetcode:674. 最长连续递增序列[动归]

学习要点 练习动归注意不要马虎 题目链接 674. 最长连续递增序列 - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法&#xff1a;动归 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {int n nums.size();if(nums.size() < 1) …

【html常见页面布局】

考拉商城界面效果htmlcss效果 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…

摩尔线程MUSA架构深度调优指南:从CUDA到MUSA的显存访问模式重构原则

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 当国产GPU面临生态壁垒&#xff0c;显存访问效率成为性能突破的关键战场。本文将深入揭示摩尔…

2025江苏省信息安全管理与评估赛项二三阶段任务书

任务 3 网络安全事件响应、数字取证调查、网络安全渗透任务3.1&#xff1a;网络安全事件响应&#xff08;100分&#xff09;X集团的一台存储关键信息的服务器遭受到了黑客的攻击&#xff0c;现在需要你对该服务器进行应急排查&#xff0c;该服务器的系统目录被上传恶意文件&…

核电概念盘中异动,中核科技涨停引领板块热度

今日股市交易时段&#xff0c;核电概念板块表现活跃&#xff0c;中核科技强势涨停&#xff0c;成为市场关注焦点&#xff0c;为核电产业链相关投资与发展增添新的动态信号。中核科技作为核电阀门等关键设备领域的重要企业&#xff0c;其涨停背后&#xff0c;是多重因素共同作用…

《Java语言程序设计》1.2.3复习题

缩写"CPU"代表什么含义?测量CPU速度的单位是什么?中央处理器(Central Processing Unit,CPU)是计算机的大脑。它从内存中获取指令并执行这些指令。CPU通常由两部分组成&#xff1a;控制单元(control unit)和算术/逻辑单元(arithmetic/logic unit)。控制单元用于控制…