如需开始记录跟踪数据,请从 CPU 性能剖析器上方或下方的下拉菜单中选择记录配置,然后点击 Record。
与您的应用交互,然后在完成时点击 Stop。性能分析器会自动在轨迹窗格中显示其跟踪信息,如图 2 所示。
- 选定范围:确定需在轨迹窗格中检查所记录时间的哪一部分。当您首次记录轨迹时,CPU 性能分析器会自动在 CPU 时间轴上选择记录的完整长度。如需仅检查已记录的时间范围中的一部分的跟踪数据,请拖动突出显示区域的边缘。
- “Interaction”部分:沿着时间轴显示用户互动和应用生命周期事件。
- “Threads”部分:沿时间轴针对每个线程显示线程状态活动(例如运行、休眠等)和调用图表(在 System Trace 中则为跟踪事件图表)。
- 使用鼠标和键盘快捷键在时间轴上导航。
- 双击线程名称,或在选中线程时按 Enter 键以展开或折叠线程。
- 选择某个线程即可在“Analysis”窗格中查看更多信息。 按住 Shift 或 Ctrl(Mac 上为 Command)可选择多个线程。
- 选择方法调用(或 System Trace 中的轨迹事件),以在“Analysis”窗格中查看更多信息。
- “Analysis”窗格:显示您选择的时间范围和线程/方法调用的跟踪数据。在此窗格中,您可以选择如何查看每个堆栈轨迹(使用“Analysis”标签页),以及如何测量执行时间(使用“Time reference”下拉菜单)。
- “Analysis”窗格标签页:选择如何显示跟踪数据详细信息。如需详细了解各个选项,请参阅检查跟踪数据。
- "Time reference"菜单:选择以下选项之一,以确定如何测量每次调用的时间信息(仅在示例/跟踪 Java 方法中受支持):
- Wall clock time:该时间信息表示实际经过的时间。
- Thread time:该时间信息表示实际经过的时间减去线程没有占用 CPU 资源的那部分时间。对于任何给定的调用,其线程时间始终小于或等于其挂钟时间。线程时间可以让您更好地了解线程的实际 CPU 使用中有多少是给定方法或函数占用的。
-
Filter:按函数、方法、类或软件包名称过滤跟踪数据。例如,如果您需快速识别与特定调用相关的轨迹数据,请在搜索字段中输入名称。在 Flame chart 标签页中,会突出显示包含符合搜索查询条件的调用、软件包或类的调用堆栈。在 Top down 和 Bottom up 标签页中,这些调用堆栈优先于其他轨迹结果。您还可以通过勾选搜索字段旁边的相应方框来启用以下选项:
- Regex:如需在您的搜索中包含正则表达式,请使用此选项。
- Match case:如果您的搜索区分大小写,请使用此选项。
- 放大:按 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 Recording Configurations 对话框中创建、修改和查看记录配置,从 CPU 性能剖析器顶部的记录配置下拉菜单中选择 Edit configurations 即可打开该对话框。
如需查看某个现有记录配置的设置,请在 CPU Recording Configurations 对话框的左侧窗格中选择该配置。
如需创建一个新的记录配置,请执行以下操作:
- 点击对话框左上角的 Add 图标 。这将创建一个包含一些默认设置的新配置。
- 为您的配置命名。
- 选择一种 Trace Technology。
- 对于采样记录配置,以微秒 (μs) 为单位指定 Sampling interval。此值表示应用的每个调用堆栈样本的时间间隔。指定的时间间隔越短,达到记录数据的文件大小限制就越快。
- 对于写入连接设备的记录数据,以兆字节 (MB) 为单位指定 File size limit。当您停止记录时,Android Studio 会解析此数据并将其显示在性能分析器窗口中。因此,如果您提高此限制并记录大量的数据,Android Studio 解析文件所需的时间会大大增加,并且可能不会做出响应。
注意:如果您使用的连接设备搭载的是 Android 8.0(API 级别 26)或更高版本,那么对轨迹数据的文件大小没有限制,系统会忽略此值。不过,您仍需留意每次记录后设备收集了多少数据,Android Studio 可能会无法解析大型跟踪文件。例如,如果您记录的是采样时间间隔很短的采样跟踪数据,或是在应用于短时间内调用许多方法的情况下记录检测跟踪数据,那么很快就会生成大型跟踪文件。
- 如需接受所做的更改并继续对其他配置进行更改,请点击 Apply。如需接受进行的所有更改并关闭对话框,请点击 OK。
使用 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 性能分析器需要一个可调试的应用在界面中显示记录状态。
重要提示:Debug
API 应该与用于开始和停止 CPU 活动记录的其他方法(如 CPU 性能分析器图形界面中的按钮,以及记录配置中用于在应用启动时自动记录的设置)分开使用。
由于存在 8MB 的缓冲区空间限制,因此 Debug
API 中的 startMethodTracing(String tracePath)
方法专为时间间隔较短或难以手动启动/停止记录的场景而设计。如需设置持续时间更长的记录,请使用 Android Studio 中的性能剖析器界面。
如需了解详情,请参阅通过检测您的应用生成跟踪日志。
在应用启动过程中记录 CPU 活动
如需在应用启动过程中自动开始记录 CPU 活动,请执行以下操作:
- 依次选择 Run > Edit Configurations。
- 在 Profiling 标签中,勾选 Start recording a method trace on startup 旁边的复选框。
- 从菜单中选择 CPU 记录配置。
- 点击 Apply。
- 依次选择 Run > Profile,将应用部署到搭载 Android 8.0(API 级别 26)或更高版本的设备。