ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Android原生Monkey工具的使用

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命令行说明adb shell monkey -help-v命令增加日志详细程度-v Level 0默认仅提供启动、完成和最终结果-v -vLevel 1 提供逐个发送到 Activity 的事件信息-v -v -vLevel 2 可获得最详细日志adb shell monkey 100 -v -v -v2、必填命令事件数量为必填选项不填无法执行其他命令可选填用法如下adb shell monkey 1003、事件命令总计11种点击事件点击屏幕某个位置并在该事件后面添加触发比例adb shell monkey 100 --pct-touch 10% -v -v -v直线滑动事件adb shell monkey 100 --pct-motion 10% -v -v -v二指缩放事件adb shell monkey 100 --pct-pinchzoom 10% -v -v -v曲线滑动事件adb shell monkey 100 --pct-trackball 10% -v -v -v屏幕旋转事件adb shell monkey 100 --pct-rotation 10% -v -v -v上下左右按键事件老旧安卓版本才有的事件无需测试adb shell monkey 100 --pct-nav 10% -v -v -v界面跳转事件包括返回键、菜单键、APP上的界面跳转按钮adb shell monkey 100 --pct-majornav 10% -v -v -v系统按键事件音量键、back键、home键、APP键adb shell monkey 100 --pct-syskeys 10% -v -v -v应用启动事件adb shell monkey 100 --pct-appswitch 10% -v -v -v键盘翻转事件键盘弹起/收起adb shell monkey 100 --pct-flip 10% -v -v -v其他类型事件adb shell monkey 100 --pct-anyevent 10% -v -v -v应用权限授予/撤销事件adb shell monkey 100 --pct-permission 10% -v -v -v注意事项1、如被测试的安卓设备本身不支持某种事件则测试时需要在命令中将不支持的事件执行比例设置为0否则运行会直接报错//被测设备无系统按键功能 adb shell monkey 100 --pct-syskeys 0 -v -v -v2、设置事件和事件执行比例为选填项遵从以下执行规则4、约束命令1、-p命令限制 Monkey 仅对指定包名的应用进行操作可多次使用以测试多个包不设置时默认操作所有APP不能与白名单或者黑名单命令同时使用用法如下//仅测试一个应用 adb shell monkey -p com.android.music 100 //测试多个应用 adb shell monkey -p com.android.music -p com.android.mtp 1002、-c命令限制Monkey仅对指定Activity操作也就是指定的页面同样可以多次使用以测试多个页面不设置时默认为所有页面//仅测试一个界面 adb shell monkey -c com.android.music.LAUNCHER 100 //测试多个界面 adb shell monkey -c com.android.music.LAUNCHER -c com.android.music.MainActivity 1003、--pkg-whitelist-file file命令白名单命令指定一个白名单文件Monkey将只测试白名单文件中列出来的应用包白名单文件为txt文件文件中每个应用包名为一行不能与-p或者黑名单命令同时使用adb shell monkey --pkg-whitelist-file /sdcard/whitelist.txt -v -v -v 10004、--pkg-blacklist-file file命令黑名单命令指定一个黑名单文件Monkey将跳过黑名单文件中列出来的应用包黑名单文件为txt文件文件中每个应用包名为一行不能与-p或者白名单命令同时使用adb shell monkey --pkg-blacklist-file /sdcard/blacklist.txt -v -v -v 10005、调试命令1、-s seed伪随机数生成器的种子值。相同的种子会产生完全相同的事件序列用于复现问题。用法如下a、当Monkey测试出现问题后在打印日志开头中找到seed值如下所示b、再次运行相同的测试命令同时在测试命令中加入-s send就可以复现出现的问题adb shell monkey --pct-syskeys 0 -s 1790439104494 -v -v -v 1002、--throttle milliseconds设置事件执行的延迟时间单位为毫秒如下为300毫秒意思是每隔300毫秒执行一个事件adb shell monkey --pct-syskeys 0 --throttle 300 103、--randomize-throttle需与--throttle参数同时使用作用是将固定的延迟时间变为一个随机变化的区间如下所示adb shell monkey --pct-syskeys 0 --throttle 300 --randomize-throttle 104、--ignore-crashes忽略应用崩溃添加此命令后当测试过程中出现应用崩溃的异常时Monkey测试不会终止仍会继续往下测不加此命令时出现应用崩溃后Monkey会直接停止运行adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes5、--ignore-timeouts忽略 ANR应用无响应错误同样与应用崩溃一样出现后Monkey会直接停止运行adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts6、--ignore-security-exceptions忽略许可证书错误同样与应用崩溃一样出现后Monkey会直接停止运行adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions7、--ignore-native-crashes忽略本地代码导致的崩溃同样与应用崩溃一样出现后Monkey会直接停止运行adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes8、--monitor-native-crashes监控并记录底层库的崩溃用法如下1、监控到崩溃信息后会保存在tombstone 文件2、通过adb pull /data/tombstones/命令将文件拉取出来3、使用ndk-stack或addr2line等工具解析tombstone 文件4、此命令再监控到底层崩溃后会停止Monkey测试所以需搭配--ignore-native-crashes命令一起使用adb shell monkey --pct-syskeys 0 -v -v -v 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes9、--bug-report-on-failure测试失败时生成 bug 报告报告文件会自动存储在sdcard根目录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-failure10、--kill-process-after-error发生错误后终止被测试应用进程如果不设置此命令应用在出现错误后会一直在后台保持错误发生后的状态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-error6、日志保存命令保存到电脑本地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分开执行否则会报错”系统找不到指定路径“如下所示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表示错误日志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四、常用命令与实例测试安卓系统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测试某APKadb 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 测试过程中出现应用崩溃时日志中会出现类似以下的关键信息// 日志中出现的崩溃提示 // 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 日志中会出现如下提示// 日志中出现的 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 1790439104494ANR 分析要点ANR 类型输入分发超时、广播超时、服务超时等判断是哪种 ANR。CPU 占用日志中的 CPU 使用率可判断是主线程阻塞还是系统负载过高。事件序号结合事件序号和事件比例推断是哪个操作触发了 ANR。复现验证使用相同的 Seed 值重新运行确认 ANR 是否稳定复现。4、结合 logcat 日志定位问题Monkey 日志只能定位到事件级别要深入分析崩溃或 ANR 的根因还需要结合 logcat 系统日志。建议在运行 Monkey 测试时同步抓取 logcat 日志// 抓取 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、问题定位实战流程综合以上方法推荐按以下流程进行问题定位查看 Monkey 日志确认测试是否正常完成记录 Seed 值和异常事件序号。定位异常类型根据日志中的 Crash、ANR 等关键字判断异常类别。结合 logcat 分析在 logcat 日志中定位对应时间点和包名的详细堆栈信息。复现问题使用-s seed重新运行确认问题是否稳定复现。修复验证修复后再次运行相同 Seed 的测试确认问题已解决。通过以上方法可以系统性地从 Monkey 日志中定位崩溃、ANR 等稳定性问题并结合 logcat 深入分析根因最终推动问题修复和回归验证。
返回列表