记录跟踪

要开始记录跟踪,请从 CPU 分析器上方或下方的任意一个下拉菜单中选择记录配置,然后点击“**记录**”。

图 1. CPU 分析器显示正在进行的记录的状态、持续时间和类型。

与您的应用交互,然后在完成后点击“**停止**”。分析器会自动在跟踪窗格中显示其跟踪信息,如图 2 所示。

图 2. 记录方法跟踪后,CPU 分析器的显示情况。

  1. 选定范围:确定要在跟踪窗格中检查的已记录时间的片段。首次记录跟踪时,CPU 分析器会自动在 CPU 时间线上选择整个记录长度。要仅检查已记录时间范围一部分的跟踪数据,请拖动突出显示区域的边缘。
  2. 交互部分:沿着时间线显示用户交互和应用生命周期事件。
  3. 线程部分:沿着时间线显示线程状态活动(例如运行、睡眠等)和每个线程的调用图表(或系统跟踪中的跟踪事件图表)。
    • 使用鼠标和键盘快捷键导航时间线。
    • 双击线程名称或在选中线程时按 Enter 键可展开或折叠线程。
    • 选择一个线程可在分析窗格中查看其他信息。按住 Shift 或 Ctrl 键(Mac 上为 Command 键)可选择多个线程。
    • 选择一个方法调用(或系统跟踪中的跟踪事件)可在分析窗格中查看其他信息。
  4. 分析窗格:显示您已选择的时间范围和线程或方法调用的跟踪数据。在此窗格中,您可以选择如何查看每个堆栈跟踪(使用分析选项卡)以及如何测量执行时间(使用时间参考下拉菜单)。
  5. 分析窗格选项卡:选择如何显示跟踪详细信息。有关每个选项的详细信息,请参阅检查跟踪
  6. 时间参考菜单:选择以下选项之一以确定如何测量每个调用的计时信息(仅在采样/跟踪 Java 方法中受支持)
    • 挂钟时间:计时信息表示实际经过的时间。
    • 线程时间:计时信息表示实际经过的时间减去线程未占用 CPU 资源的任何部分。对于任何给定的调用,其线程时间始终小于或等于其挂钟时间。使用线程时间可以更好地了解给定方法或函数消耗了线程多少实际 CPU 使用率。
  7. 过滤器:按函数、方法、类或包名称过滤跟踪数据。例如,如果您想快速识别与特定调用相关的跟踪数据,请在搜索字段中键入名称。在火焰图选项卡中,包含与搜索查询匹配的调用、包或类的调用堆栈将被强调显示。在自上而下自下而上选项卡中,这些调用堆栈的优先级高于其他跟踪结果。您还可以通过选中搜索字段旁边的相应复选框来启用以下选项
    • 正则表达式:要将正则表达式包含在搜索中,请使用此选项。
    • 区分大小写:如果您的搜索区分大小写,请使用此选项。
提示:检查线程时间线时,可以使用以下快捷键
  • 放大:按 W 键或在按住 Ctrl 键(Mac 上为 Command 键)的同时滚动鼠标滚轮。
  • 缩小:按 S 键或在按住 Ctrl 键(Mac 上为 Command 键)的同时向后滚动鼠标滚轮。
  • 向左平移:按 A 键或在按住空格键的同时向右拖动鼠标。
  • 向右平移:按 D 键或在按住空格键的同时向左拖动鼠标。
  • 展开或折叠线程:双击线程名称或在选中线程时按 Enter 键。

选择记录配置

在开始记录跟踪信息之前,请为要捕获的性能分析信息选择合适的记录配置

  • 采样 Java 方法:在应用的基于 Java 的代码执行期间,以频繁的间隔捕获应用的调用堆栈。分析器会比较捕获的数据集,以推导出应用的基于 Java 的代码执行的计时和资源使用信息。

    基于采样的跟踪的固有问题是,如果您的应用在捕获调用堆栈后进入某个方法,并在下一次捕获之前退出该方法,则分析器不会记录该方法调用。如果您有兴趣跟踪具有此类短生命周期的方法,则应使用检测跟踪。

  • 跟踪 Java 方法:在运行时检测您的应用,以便在每个方法调用的开始和结束处记录时间戳。收集并比较时间戳以生成方法跟踪数据,包括计时信息和 CPU 使用率。

    请注意,与检测每个方法相关的开销会影响运行时性能,并可能影响性能分析数据;对于生命周期相对较短的方法,这一点尤其明显。此外,如果您的应用在短时间内执行大量方法,则分析器可能会很快超出其文件大小限制,并且可能无法记录任何其他跟踪数据。

  • 采样 C/C++ 函数:捕获应用的本机线程的采样跟踪。要使用此配置,您必须将应用部署到运行 Android 8.0(API 级别 26)或更高版本的设备上。

    在内部,此配置使用simpleperf来跟踪应用的原生代码。如果您想为simpleperf指定其他选项,例如采样特定设备的 CPU 或以高精度指定采样持续时间,您可以从命令行使用simpleperf

  • 跟踪系统调用:捕获细粒度的详细信息,使您能够检查应用如何与系统资源交互。您可以检查线程状态的确切时间和持续时间,可视化所有内核上的 CPU 瓶颈所在位置,并添加自定义跟踪事件以进行分析。此类信息在您排查性能问题时至关重要。要使用此配置,您必须将应用部署到运行 Android 7.0(API 级别 24)或更高版本的设备上。

    在使用此跟踪配置时,您可以通过检测代码在性能分析器时间轴上直观地标记重要的代码例程。要检测 C/C++ 代码,请使用trace.h提供的原生跟踪 API。要检测 Java 代码,请使用Trace 类。有关更多信息,请参阅检测应用代码

    此跟踪配置构建在systrace之上。您可以使用systrace命令行实用程序来指定 CPU 性能分析器中提供的选项之外的选项。systrace提供的其他系统级数据可以帮助您检查原生系统进程并排查丢帧或延迟帧的问题。

    在运行 Android 9(API 级别 28)或更高版本的设备上,您可以使用名为系统跟踪的系统应用来在设备上记录系统跟踪

创建、编辑或查看录制配置

您可以在CPU 录制配置对话框中创建、编辑和查看录制配置,您可以通过从 CPU 性能分析器顶部的录制配置下拉菜单中选择编辑配置来打开此对话框。

要查看现有录制配置的设置,请在CPU 录制配置对话框的左窗格中选择它。

要创建新的录制配置,请执行以下操作

  1. 点击对话框左上方的添加。这将创建一个具有某些默认设置的新配置。
  2. 命名您的配置。
  3. 选择跟踪技术
  4. 对于采样录制配置,请以微秒 (μs) 为单位指定采样间隔。此值表示应用调用栈的每个样本之间的时间。您指定的间隔越短,达到录制数据的文件大小限制的速度就越快。
  5. 指定写入连接设备的录制数据的文件大小限制(以 MB 为单位)。停止录制后,Android Studio 会解析此数据并在性能分析器窗口中显示它。因此,如果您增加了限制并录制了大量数据,Android Studio 将花费更长的时间来解析文件,并且可能会变得无响应。

    注意:如果您使用的是运行 Android 8.0(API 级别 26)或更高版本的连接设备,则跟踪数据的文件大小没有限制,并且会忽略此值。但是,您仍然需要注意设备在每次录制后收集的数据量——Android Studio 可能会难以解析大型跟踪文件。例如,如果您正在录制具有较短采样间隔的采样跟踪或在应用在短时间内调用许多方法时录制检测跟踪,则会很快生成大型跟踪文件。

  6. 要接受更改并继续对其他配置进行更改,请点击应用。要接受所有应用的更改并关闭对话框,请点击确定

使用调试 API 记录 CPU 活动

您可以使用Debug API为应用提供启动和停止 CPU 性能分析器中 CPU 活动录制的功能。

当应用调用startMethodTracing(String tracePath)时,CPU 性能分析器开始录制;当应用调用stopMethodTracing()时,CPU 性能分析器停止录制。在使用此 API 触发的 CPU 活动录制过程中,CPU 性能分析器会将调试 API显示为活动的 CPU 录制配置。

要使用Debug API 控制 CPU 活动的录制,请将检测应用部署到运行 Android 8.0(API 级别 26)或更高版本的设备上。API 启动的录制在可分析应用中受支持,但是 Android Studio 性能分析器需要可调试应用才能在 UI 中显示录制状态。

重要提示:Debug API 旨在与其他用于启动和停止 CPU 活动录制的工具(例如 CPU 性能分析器图形用户界面中的按钮以及应用启动时自动录制的录制配置中的设置)分开使用。

由于 8 MB 的缓冲区大小限制,Debug API 中的startMethodTracing(String tracePath)方法专为短时间间隔或难以手动启动/停止录制的场景而设计。对于较长时间段的录制,请使用 Android Studio 中的性能分析器 UI。

有关更多信息,请参阅通过检测应用生成跟踪日志

在应用启动期间记录 CPU 活动

要自动在应用启动期间开始录制 CPU 活动,请执行以下操作

  1. 选择运行 > 编辑配置
  2. 性能分析选项卡中,选中启动时开始录制方法跟踪旁边的复选框。
  3. 从菜单中选择 CPU 录制配置。
  4. 点击应用
  5. 通过选择运行 > 性能分析将应用部署到运行 Android 8.0(API 级别 26)或更高版本的设备上。