什么是 ADB Monkey?
adb monkey 是 Android SDK 自带的一个命令行工具,它的核心思想是:模拟用户的随机操作,在设备或模拟器上生成大量的伪随机事件流(如点击、滑动、按键等),以测试应用程序的稳定性和健壮性。

它就像一只“猴子”,在屏幕上胡乱敲击,目的是找出应用在极端、随机操作下可能出现的崩溃、无响应或异常。
基本语法
adb monkey 命令的基本结构如下:
adb shell monkey [options] <event-count>
[options]: 可选参数,用于控制 Monkey 的行为,例如指定要测试的应用、设置事件类型和频率、调试级别等。<event-count>: 必需参数,表示要发送的事件总数。
常用选项
熟练使用 monkey 的关键在于掌握其丰富的选项,以下是常用且重要的选项,并附有解释和示例。
1. 指定测试目标
-
-p <package-name>或--package <package-name>
(图片来源网络,侵删)- 作用: 指定只对某一个或多个特定的 App 包进行测试,这是最常用的选项之一,避免了对系统应用的干扰。
- 示例: 只测试
com.example.myapp这个应用。adb shell monkey -p com.example.myapp 100
-
-c <main-category>或--category <main-category>- 作用: 指定只启动一个或多个特定类别的 Activity,通常与
-p结合使用,以确保只测试 App 内符合特定类别的页面。 - 示例: 只测试
android.intent.category.LAUNCHER类别的 Activity(通常是 App 的主界面)。adb shell monkey -p com.example.myapp -c android.intent.category.LAUNCHER 100
- 作用: 指定只启动一个或多个特定类别的 Activity,通常与
2. 事件类型与频率控制
-
-v或--verbose- 作用: 设置日志级别,可以多次使用来增加输出信息的详细程度。
- 级别:
-v: 级别 0,打印少量信息。-v -v: 级别 1,打印更多的事件信息。-v -v -v: 级别 2,打印最详细的日志,包括被选中的 Activity 信息。
- 示例: 运行 Monkey 并显示最详细的日志。
adb shell monkey -p com.example.myapp -v -v -v 100
-
--pct-<event-type> <percentage>- 作用: 设置不同类型事件的百分比,所有事件的百分比总和必须为 100%,如果不指定,Monkey 会使用默认值。
- 常见事件类型:
--pct-touch: 触摸事件(点击、滑动)。--pct-motion: 手势事件(长按、缩放轨迹)。--pct-trackball: 模拟轨迹球事件(较少用)。--pct-nav: 导航事件(方向键、导航栏按键)。--pct-majornav: 主要导航事件(Home, Back, Menu, 键盘搜索)。--pct-syskeys: 系统按键事件(Home, Back, 音量键, 电源键等)。--pct-appswitch: Activity 切换事件。--pct-anyevent: 其他任意事件。
- 示例: 设置 50% 的触摸事件, 30% 的 Activity 切换, 20% 的主要导航事件。
adb shell monkey -p com.example.myapp --pct-touch 50 --pct-appswitch 30 --pct-majornav 20 -v 1000
3. 运行控制与调试
-
-s <seed>或--seed <seed>
(图片来源网络,侵删)- 作用: 设置一个随机数种子,这对于复现问题至关重要,如果使用相同的种子和相同的选项运行两次 Monkey,它将生成完全相同的事件序列,从而可以精确地重现之前发现的 Bug。
- 示例: 使用种子
12345运行 Monkey。adb shell monkey -p com.example.myapp -s 12345 1000
-
--throttle <milliseconds>- 作用: 设置两个事件之间的延迟时间(毫秒),默认值为 0,即事件之间无延迟,以最快速度执行,增加这个值可以让测试过程更接近真实用户的操作速度。
- 示例: 设置每个事件之间延迟 300 毫秒。
adb shell monkey -p com.example.myapp --throttle 300 -v 1000
-
--ignore-crashes- 作用: 如果应用程序崩溃,Monkey 会继续发送事件,直到完成所有事件数,默认情况下,只要发生崩溃,Monkey 就会立即停止。
- 示例: 忽略崩溃,继续执行。
adb shell monkey -p com.example.myapp --ignore-crashes -v 1000
-
--ignore-timeouts- 作用: 如果应用程序出现 ANR (Application Not Responding),Monkey 会继续发送事件,默认情况下,ANR 会导致 Monkey 停止。
- 示例: 忽略 ANR,继续执行。
adb shell monkey -p com.example.myapp --ignore-timeouts -v 1000
-
--ignore-security-exceptions- 作用: 如果应用程序发生权限异常(如安全异常),Monkey 会继续执行,默认情况下,这会导致 Monkey 停止。
- 示例: 忽略权限异常,继续执行。
adb shell monkey -p com.example.myapp --ignore-security-exceptions -v 1000
-
--monitor-native-crashes- 作用: 监控并报告本层代码(C/C++)的崩溃。
- 示例: 监控 native 层崩溃。
adb shell monkey -p com.example.myapp --monitor-native-crashes -v 1000
4. 帮助信息
-h或--help- 作用: 显示所有可用选项的帮助信息。
- 示例:
adb shell monkey -h
实践示例
假设我们要对一个名为 com.mycompany.myapp 的 App 进行一次全面的压力测试,事件总数为 5000 次。
目标:
- 只测试这个 App。
- 日志级别为 2,方便查看详情。
- 事件类型设置为:50% 触摸, 25% Activity 切换, 15% 主要导航, 10% 其他任意事件。
- 事件之间间隔 200 毫秒,模拟真实操作。
- 一旦发生崩溃或 ANR,立即停止,以便我们快速定位问题。
- 使用一个固定的种子,以便后续复现问题。
命令:
adb shell monkey \ -p com.mycompany.myapp \ -v -v \ --pct-touch 50 \ --pct-appswitch 25 \ --pct-majornav 15 \ --pct-anyevent 10 \ --throttle 200 \ -s 20250815 \ 5000
命令解释:
adb shell monkey: 执行 monkey 命令。-p com.mycompany.myapp: 限制测试目标。-v -v: 设置日志级别为 2。--pct-touch 50: 50% 的触摸事件。--pct-appswitch 25: 25% 的 Activity 切换。--pct-majornav 15: 15% 的主要导航事件。--pct-anyevent 10: 10% 的其他事件,总和为 100%。--throttle 200: 事件间隔 200ms。-s 20250815: 使用种子 20250815。5000: 总事件数。
如何分析 Monkey 的测试结果?
Monkey 运行结束后,会在 Logcat 中输出一份总结报告,你需要重点关注以下几点:
- 被选中的 Activity: 确认 Monkey 是否真的启动了你期望测试的 App。
- 发送的事件数: 确认是否按计划发送了所有事件。
- 崩溃: 如果发生了崩溃,Logcat 中会打印出详细的错误堆栈信息,这是最关键的 Bug 来源。
- ANR (Application Not Responding): 如果发生了 ANR,Logcat 中会有
ANR in ...的信息,并通常会附上该进程的traces.txt文件路径,里面记录了 ANR 发生时的线程状态,是分析 ANR 的关键。
查看 Logcat:
adb logcat | grep -iE "(crash|anr|exception)"
这个命令会实时过滤出包含 "crash", "anr", "exception" 等关键词的日志,方便你快速定位问题。
最佳实践与注意事项
- 从简单开始: 初次使用时,先用少量事件(如 100-500 次)和简单的选项运行,确保 Monkey 能正常工作。
- 明确测试目标: 始终使用
-p选项来限制测试范围,避免对系统或其他应用造成不必要的影响。 - 记录参数: 每次运行 Monkey 时,务必记录下所有使用的命令行参数(特别是
-s种子),这对于复现 Bug 和回归测试至关重要。 - 结合日志分析: Monkey 的价值在于它能帮你发现问题,但定位问题还需要依靠 Logcat 等日志工具进行深入分析。
- 不要过度依赖: Monkey 是一个很好的稳定性测试工具,但无法替代功能测试、UI 测试和性能测试,它擅长发现由随机操作引发的内存泄漏、线程同步、空指针等深层次问题。
- 长时间运行: 对于稳定性测试,可以尝试让 Monkey 运行数小时甚至更久,观察 App 是否会发生内存泄漏等问题。
