记录跟踪

要开始记录跟踪,从 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)或更高版本的设备上,可以使用名为 System Tracing 的系统应用 在设备上记录系统跟踪

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

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

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

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

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

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

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

使用 Debug API 记录 CPU 活动

您可以使用 Debug API 使您的应用程序能够在 CPU 分析器中启动和停止 CPU 活动的录制。

当您的应用程序调用 startMethodTracing(String tracePath) 时,CPU 分析器将开始录制,当您的应用程序调用 stopMethodTracing() 时,CPU 分析器将停止录制。在使用此 API 触发的 CPU 活动录制期间,CPU 分析器会将 Debug 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)或更高版本的设备。