菜鸟科技网

adb monkey命令如何高效测试应用稳定性?

什么是 ADB Monkey?

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

adb monkey命令如何高效测试应用稳定性?-图1
(图片来源网络,侵删)

它就像一只“猴子”,在屏幕上胡乱敲击,目的是找出应用在极端、随机操作下可能出现的崩溃、无响应或异常。


基本语法

adb monkey 命令的基本结构如下:

adb shell monkey [options] <event-count>
  • [options]: 可选参数,用于控制 Monkey 的行为,例如指定要测试的应用、设置事件类型和频率、调试级别等。
  • <event-count>: 必需参数,表示要发送的事件总数。

常用选项

熟练使用 monkey 的关键在于掌握其丰富的选项,以下是常用且重要的选项,并附有解释和示例。

1. 指定测试目标

  • -p <package-name>--package <package-name>

    adb monkey命令如何高效测试应用稳定性?-图2
    (图片来源网络,侵删)
    • 作用: 指定只对某一个或多个特定的 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

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>

    adb monkey命令如何高效测试应用稳定性?-图3
    (图片来源网络,侵删)
    • 作用: 设置一个随机数种子,这对于复现问题至关重要,如果使用相同的种子和相同的选项运行两次 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 次。

目标:

  1. 只测试这个 App。
  2. 日志级别为 2,方便查看详情。
  3. 事件类型设置为:50% 触摸, 25% Activity 切换, 15% 主要导航, 10% 其他任意事件。
  4. 事件之间间隔 200 毫秒,模拟真实操作。
  5. 一旦发生崩溃或 ANR,立即停止,以便我们快速定位问题。
  6. 使用一个固定的种子,以便后续复现问题。

命令:

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 中输出一份总结报告,你需要重点关注以下几点:

  1. 被选中的 Activity: 确认 Monkey 是否真的启动了你期望测试的 App。
  2. 发送的事件数: 确认是否按计划发送了所有事件。
  3. 崩溃: 如果发生了崩溃,Logcat 中会打印出详细的错误堆栈信息,这是最关键的 Bug 来源。
  4. 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 是否会发生内存泄漏等问题。
分享:
扫描分享到社交APP
上一篇
下一篇