Android Studio性能分析(二)

189 阅读13分钟

一、使用CPU Profiler检查CPU活动

优化应用程序的CPU使用率有很多优势,例如提供更快、更流畅的用户体验以及延长设备电池寿命。

可以使用CPU Profiler在与你的应用程序交互时实时检查您的应用程序的CPU使用率和线程活动,或者您可以检查记录的方法跟踪、函数跟踪和系统跟踪中的详细信息。

CPU Profiler记录和显示的详细信息取决于您选择的记录配置:

  • 系统跟踪:捕获细粒度的详细信息,使您可以检查您的应用程序如何和与系统资源交互。
  • 方法和函数跟踪:对于您的应用程序进程中的每个线程,您可以了解在一段时间内执行了哪些方法(Java)或函数(C/C++),以及每个方法或函数在执行过程中消耗的CPU资源。您还可以使用方法和韩函数跟踪来识别调用者被调用者。调用者是调用另一个方法或函数的方法换或函数,被调用者是被另一个方法或函数调用的方法或函数。您可以使用此信息来确定哪些方法或函数是负责过于频繁地调用特定的资源密集型任务,并优化您的应用代码以避免不必要的工作。

记录方法轨迹时,您可以选择sampled或者instrumented recording。记录函数轨迹时,只能使用采样记录。

1.1、CPU分析器概述

要打开CPU Profiler,请按照下面步骤操作:

  1. 选择View > Tool Windows > Profiler或单击工具栏中的Profile.

image.png

如果选择Select Deployment Target弹窗出现提示,请选择要将您的应用程序部署到设备以进行分析。如果您已通过USB链接设备但未看到它列出,请确保您已经启用USB调试

  1. 单击CPU时间线中的任意位置以打开CPU Profiler。

当您打开CPU Profiler时,它会立即开始显示您应用的CPU使用率和线程活动。您应该会看到类似于下图的内容。

image.png

如上图所示,CPU Profiler的默认视图包括以下时间线:

  1. 事件时间线:显示应用程序中的活动,因为它们在其生命周期中通过不同状态进行转换,并指示用户与设备的交互,包括屏幕旋转事件。
  2. CPU时间线:显示您的应用程序的实时CPU使用率(占总可用过CPU时间的百分比)以及您应用程序正在使用的线程总数。时间线还显示其他进程(例如系统进程或其他应用程序)的CPU使用情况,因此您可以将其与您的应用程序的使用情况进行比较。您可以通过沿时间轴的水平轴移动鼠标来查看历史CPU使用率数据。
  3. 线程活动时间线:列出属于您的应用程序进程的每个线程,并使用下列的颜色指示其沿时间线的活动。记录跟踪后,您可以从此时间线中选择一个线程以在跟踪窗格中检查其数据。
    • 绿色:线程处于活动状态或准备使用CPU。也就是说,它处于运行或可运行状态。
    • 黄色:线程处于活动状态,但它在完成其工作之前正在等待I/O操作(例如,磁盘或网络I/O)
    • 灰色:线程正在休眠,没有占用任何CPU时间。当线程需要访问尚不可用的资源时,有时会发生这种情况。要么线程进入自愿睡眠,要么内核让线程进入睡眠状态,知道所需的资源可用。

CPU Profiler还会报告Android Studio和Android平台添加到您的应用进程的线程的CPU使用情况,例如JDWPProfile SaverStudio:VMStatsStudio:PerfaStudio:Heartbeat(尽管线程活动时间轴中显示的确切名称可能有所不同)。Android Studio报告此数据,以便您可以确定线程活动和CPU使用率何时实际上是由您的应用程序代码引起的。

二、录制 traces

要开始记录traces,请从CPU Profiler上方或下方菜单选择一种记录配置,然后单击Record.

image.png

上图显示正在制作的记录的状态、持续时间和类型。

与您的应用程序交互,完成后单击“停止”。探查器会自动在跟踪窗口中显示其跟踪信息。

image.png

  1. 选定范围:确定要在跟踪窗口中检查的记录时间部分。首次记录跟踪时,CPU Profiler会自动选择CPU时间线中记录的整个长度。要仅检查记录时间范围的一部分的跟踪数据,请拖动突出显示区域的边缘。
  2. 交互部分:沿时间线显示用户交互和应用程序声明周期事件。
  3. 线程部分:显示时间轴上每个线程的线程状态活动(例如运行、睡眠等)和调用图表(或系统跟踪中的跟踪事件图表)
    • 使用鼠标和键盘快捷键来浏览时间线
    • 双击线程名称或在选择线程时按Enter键以展开或折叠线程。
    • 选择一个线程以在“分析”窗口中查看其他信息。按住Shift或Ctrl(Mac上的命令)可选择多个线程。
    • 选择一个方法调用(或系统跟踪中的跟踪事件)以在“分析”窗口中查看其他信息。
  4. 分析窗口:显示您选择的时间范围和线程或方法调用的跟踪数据。在此窗口中,你可以选择如何查看每个堆栈跟踪(使用分析选项卡)以及如何测量执行时间(使用时间参考下拉菜单)。
  5. 分析窗口选项卡:选择如何显示跟踪详细信息。
  6. 事件参考菜单:选择以下选项之一以确定如何测量每个调用的时间信息(仅在Sample/Trace Java Methods中受支持):
    • 挂钟时间: 计时信息表示实际经过的时间。
    • 线程时间:计时信息表示实际经过的时间减去线程未消耗CPU资源时的任何时间部分。对于任何给定的调用,它的线程时间总是小于或等于它的挂钟时间,使用线程时间可以让您更好地了解给定方法或函数消耗了多少线程的实际CPU使用率。
  7. Filter:按函数、方法、类或包名称过滤跟踪数据。例如,如果您想快速识别与特定呼叫相关的跟踪数据,请在搜索字段中键入名称。在火焰图选项卡中,包含与搜索查询匹配的调用、包或类的调用对账函被强调。在自上而下自下而上选项卡中,这些调用堆栈优先于其他跟踪结果。您还可以通过选中搜索字段的相应框来启用以下选项:
    • 正则表达式:要在搜索中包含正则表达式,请使用此选项。

    • 匹配大小写:如果您的搜索区分大小写,请使用此选项。

提示: 检查线程时间线时,可以使用以下快捷方式:

  • 放大: 按住 W 或滚动鼠标滚轮,同时按住 Ctrl(Mac 上的命令)。
  • 缩小: 按住 Ctrl(Mac 上的命令)的同时按 S 键或向后滚动鼠标滚轮。
  • 向左平移: 按住 Space 键的同时按住 A 键或向右拖动鼠标。
  • 向右平移: 按住 D 键或向左拖动鼠标。
  • 展开或折叠话题: 双击话题名称或在选择话题时按 Enter 键。

2.1、选择录音配置

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

  • 示例Java方法:在应用程序基于Java的代码执行期间,以频繁的时间间隔捕获应用程序的调用堆栈,探查器比较捕获的数据集,以获取有关应用程序基于Java的代码执行的时间和资源使用信息。

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

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

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

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

在内部,此配置用于simpleperf跟踪应用程序的本机代码。如果要为指定其他选项simpleperf,例如对特定设备CPU进行采样或以高精度指定采样持续时间,则可以从命令函使用simpleperf.

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

使用此跟踪配置,您可以通过检测代码在分析器时间线中直观地标记重要的代码例程序。要检测C/C++代码,请使用trace.h.要检测Java代码,请使用该类Trace

此跟踪配置基于systrace.您可以使用systrace命令行实用程序指定CPU Profile中提供的选项之外的选项。提供的防腐剂爱系统级数据systrace可以帮助您检查本机系统进程并解决掉帧或延迟帧的问题。

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

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

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

要创建新的录制裴子豪,请执行以下操作:

  1. 单击对话框左上角的添加+这将创建一个具有一些默认设置的新配置。

  2. 命名您的配置。

  3. 选择跟踪技术

  4. 对于采样记录配置,以微秒(μs)为单位指定采样间隔。此值表示应用程序调用堆栈的每个样本之间的时间。您指定的时间间隔越短,您达到记录数据的文件大小限制的速度就越快。

  5. 为写入连接设备的记录数据指定文件大小限制,以兆字节(MB)为单位。当您停止录制时Android Studio会解析此数据并将其显示在分析器窗口中。因此,如果您增加限制并记录大量数据,Android Studio将花费更长的时间解析文件并且可能变得无响应。

     注意: 如果您使用运行 Android 8.0(API 级别 26)或更高版本的连接设备,则跟踪数据的文件大小没有限制,并且该值将被忽略。但是,您仍然需要注意设备在每次记录后收集了多少数据——Android Studio 可能难以解析大型跟踪文件。例如,如果您正在记录具有较短采样间隔的采样跟踪或检测跟踪,而您的应用程序会在短时间内调用许多方法,那么您将快速生成大型跟踪文件。
    
  6. 要接受更改并继续对其配置进行更改,请单击应用。要接受所有应用的更改并关闭对话框,请单击确定

2.3、使用调用API记录CPU活动

您可以使用Debug API让您的应用程序能够在CPU Profiler中开始和停止CPU活动。

CPU Profiler在您的应用程序调用时开始记录startMethodTracing(String tracePath),而CPU Profiler在您的应用程序调用停止记录stopMethodTracing()。在记录使用此API触发的CPU活动时,CPU分析器将调用API显示为活动的CPU记录配置。

要使用API控制CPU活动的记录Debug,请将您的检测应用程序部署到运行Android8.0(API级别 26)或更高版本的设备。可分析应用程序支持API启动的记录,但Android Studioo分析器需要可调式应用程序才能在UI中记录状态。

注意:由于缓冲区大小限制为8M,API startMethodTracing(String tracePath)中的方法Debug专为短间隔换或难以手动开始/停止记录的场景而设计。如果较长时间记录,请使用Android Studio中的探查器。

2.4、记录应用程序启动期间的CPU活动

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

  1. 选择运行 > 编辑配置
  2. Profiling选项卡中,选中Start recording a method trace on startup旁边的框。
  3. 从菜单中选择CPU记录配置。
  4. 单击应用
  5. 通过选择Run > Profile将您的应用程序部署到运行Android 8.0(API级别26)或更高版本的设备。

三、导出 traces

使用CPU分析器记录CPU活动后,您可以将数据导出为文件以.trace与他人共享或稍后检查。

要从CPU时间线导出跟踪文件,请执行以下操作:

  1. 在CPU时间线中,右键单击要导出的已记录方法跟踪或系统跟踪。
  2. 从菜单中选择Export Trace
  3. 浏览到要保存文件的位置,指定文件名,然后单击“OK”。

要从会话窗口导出跟踪文件,请执行以下操作:

  1. 在“Sessions”窗口中,右键单击要导出的记录跟踪。
  2. 单击会话条目右侧的“Export method trace”或“Export system trace”按钮。
  3. 浏览到要保存文件的位置,指定文件名,然后单击“OK”.

四、导入 traces

您可以导入.trace使用Debug API或CPU Profiler创建的文件。

通过点击探查起会话窗口中的Start new profiler session, 然后选择+从文件加载来导入跟踪文件。

您可以在CPU Profiler中检查导入的跟踪,就像在CPU Profiler中直接捕获的跟踪一样,但有以下例外:

  1. CPU活动不沿CPU时间线表示(系统跟踪除外)。
  2. 线程部分的时间线不显示线程状态,例如运行、等待或睡眠(系统跟踪除外)。