CPU Profiler 使用指南

共 8417字,需浏览 17分钟

 ·

2021-02-02 22:29

和你一起终身学习,这里是程序员Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

一、CPU Profiler 概述
二、CPU Profiler 使用方法
三、使用CPU Profiler 记录 traces
四、CPU Profiler 记录Trace 配置方法
五、CPU Profiler 创建、编辑 、查看Trace 配置方法
六、使用 Debug API 记录CPU 活动
七、记录 app 启动时候的CPU信息
八、导出 Trace
九、导入Trace文件
十、分析 Trace

一、CPU Profiler 概述

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

您可以在与应用程序交互时使用CPU Profiler 实时检查应用程序的CPU使用率和线程使用情况,或者也可以记录的method traces,function traces, 或者 system traces的详细信息。

1.CPU Profiler 配置使用方法:

  • System Trace

主要捕获应用程序与系统资源交互的trace信息。

  • Method and function traces

对于应用程序进程中的每个线程,您可以找出在一段时间内执行了哪些方法(Java)或函数(C / C ++),以及每个方法或函数在执行过程中消耗的CPU资源。您还可以使用方法和函数跟踪来识别调用方 和被调用方。调用者是调用另一个方法或功能的方法或函数,被调用者是被另一个方法或功能调用的对象。您可以使用此信息来确定哪些方法或函数负责过多地调用特定的资源繁重的任务,并优化应用程序的代码以避免不必要的工作。

记录方法轨迹时,可以选择采样 记录或仪器记录。记录功能轨迹时,只能使用采样记录。

二、CPU Profiler 使用方法

1.CPU Profiler 打开方法

1.打开 Android Studio,选择 View > Tool Windows > Profiler。

打开 Profiler

或者直接点击Profiler 图标即可

直接点击Profiler 图标也可以

如果在“ 选择部署目标”对话框中出现提示,请选择将应用程序进行概要分析的设备。如果您已经通过USB连接了设备,但未在其中列出设备,请确保已 启用USB调试。

2.单击CPU时间轴中的任意位置以打开CPU Profiler

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

图1. CPU Profiler中的时间线

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

  1. 事件时间轴:显示应用程序中的活动在其生命周期中通过不同状态过渡时的活动,并指示用户与设备的交互,包括屏幕旋转事件。有关在运行Android 7.1(API级别25)及更低版本的设备上启用事件时间轴的信息,请参阅 启用高级配置。

  2. CPU时间轴:显示应用程序的实时CPU使用率(占总可用CPU时间的百分比)以及应用程序正在使用的线程总数。时间线还显示了其他进程(例如系统进程或其他应用程序)的CPU使用率,因此您可以将其与应用程序的使用率进行比较。您可以通过沿时间轴的水平轴移动鼠标来检查历史CPU使用率数据。

3.线程活动时间轴:列出属于您的应用进程的每个线程,并使用以下列出的颜色沿时间轴指示其活动。记录跟踪后,可以从该时间轴中选择一个线程以在跟踪窗格中检查其数据。
绿色:线程处于活动状态或准备使用CPU。也就是说,它处于运行或可运行状态。
黄色:线程处于活动状态,但是在完成工作之前,它正在等待I / O操作(例如磁盘或网络I / O)。
灰色:线程正在休眠,不占用任何CPU时间。当线程需要访问尚不可用的资源时,有时会发生这种情况。线程要么进入自愿睡眠状态,要么内核使线程进入睡眠状态,直到所需的资源可用为止。
该CPU还探查报告线程的CPU使用的是Android的工作室和Android平台添加到您的应用程序,如 JDWP,Profile Saver, Studio:VMStats,Studio:Perfa,和 Studio:Heartbeat(虽然,确切的名称显示在线程活动时间表可能会有所不同)。Android Studio报告此数据,以便您可以确定何时线程活动和CPU使用率实际上是由您的应用程序代码引起的。

三、使用CPU Profiler 记录 traces

要开始记录跟踪,请 从CPU Profiler顶部的下拉菜单中选择一个记录配置,然后单击Record

图2. CPU事件探查器显示正在记录的状态,持续时间和类型。

与您的应用进行交互,然后在完成后单击“ 停止”。探查器自动选择记录的时间范围,并在跟踪窗格中显示其跟踪信息,如图3所示。如果要检查跟踪是否有其他线程,请从线程活动时间轴中选择它。

图3.记录方法跟踪后的CPU Profiler。

  1. 选定范围:确定要在跟踪窗格中检查的记录时间部分。首次记录跟踪时,CPU Profiler会自动在CPU时间轴中选择记录的整个长度。要仅在记录的时间范围的一部分中检查跟踪数据,请拖动突出显示区域的边缘。

  2. 时间戳记:指示记录的跟踪的开始和结束时间,相对于探查器开始收集CPU使用率信息的时间。要选择整个记录,请单击时间戳。

  3. 跟踪窗格:显示所选时间范围和线程的跟踪数据。仅在您记录了至少一条跟踪之后,才会显示此窗格。在此窗格中,您可以选择如何查看每个堆栈跟踪(使用跟踪选项卡)以及如何测量执行时间(使用时间参考下拉菜单)。

  4. 跟踪窗格选项卡:选择如何显示跟踪详细信息。有关每个选项的详细信息,请参阅检查跟踪。

  5. 时间参考菜单:选择以下一项以确定如何测量每个呼叫的时间信息:

    • 挂钟时间:时间信息表示实际经过的时间。

    • 线程时间:当线程不消耗CPU资源时,时序信息表示实际经过的时间减去该时间的任何部分。对于任何给定的调用,其线程时间始终小于或等于其挂钟时间。使用线程时间可以使您更好地了解给定方法或函数消耗了多少线程的实际CPU使用率。

  6. 过滤器:按功能,方法,类或程序包名称过滤跟踪数据。例如,如果要快速识别与特定呼叫相关的跟踪数据,请单击“ 过滤器”或按Ctrl + F(在Mac上为Command + F),然后在搜索字段中键入名称。在“ 调用图”和“ 火焰图”选项卡中,强调包含与搜索查询匹配的调用,程序包或类的调用堆栈。在“ 自上而下”和“ 自下而上”选项卡中,这些调用堆栈的优先级高于其他跟踪结果。您还可以通过选中搜索字段旁边的相应框来启用以下选项:

    • 正则表达式:要在搜索中包括正则表达式,请使用此选项。

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

四、CPU Profiler 记录Trace 配置方法

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

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

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

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

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

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

    在内部,此配置用于 [simpleperf](https://developer.android.google.cn/ndk/guides/simpleperf.html)跟踪应用程序的本机代码。如果要指定其他选项simpleperf,例如对特定的设备CPU进行采样或以高精度指定采样持续时间,则可以 从命令行使用simpleperf

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

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

    此跟踪配置基于systrace。您可以 使用systrace 命令行实用程序来指定CPU Profiler中提供的选项之外的选项。所提供的其他系统级数据 systrace可以帮助您检查本机系统进程并排除丢失或延迟的帧。

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

五、PU Profiler 创建、编辑 、查看Trace 配置方法

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

编辑配置 profiler

要查看现有记录配置的设置,请在“ CPU记录配置”对话框的左窗格中选择它。
要创建新的录制配置,请执行以下操作:

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

  2. 命名您的配置。

  3. 选择一种跟踪技术

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

  5. 为写入连接的设备的记录数据指定文件大小限制(以兆字节(MB)为单位)。当您停止记录时,Android Studio会解析此数据并将其显示在事件探查器窗口中。因此,如果您增加限制并记录大量数据,则Android Studio解析文件所花费的时间会更长,并且可能会变得无响应。
    注意:如果您使用的是运行Android 8.0(API级别26)或更高版本的已连接设备,则跟踪数据的文件大小没有限制,并且该值将被忽略。但是,您仍然需要注意每次录制后设备会收集多少数据-Android Studio可能难以解析大型跟踪文件。例如,如果您正在记录采样间隔较短的采样跟踪,或者在应用程序在短时间内调用许多方法的同时记录检测跟踪,则将快速生成大型跟踪文件。

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

六、使用 Debug API 记录CPU 活动

您可以使用DebugAPI使您的应用能够启动和停止在CPU Profiler中记录CPU活动。

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

要使用DebugAPI 控制对CPU活动的记录,请将您检测的应用程序部署到运行Android 8.0(API级别26)或更高版本的设备。

重要说明:该DebugAPI旨在与其他用于启动和停止CPU活动记录的方式分开使用,例如CPU Profiler图形用户界面中的按钮以及用于在应用程序启动时自动记录的记录配置中的设置。
有关更多信息,请参阅 通过检测您的应用程序生成跟踪日志。

七、记录 app 启动时候的CPU信息

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

选择运行>编辑配置。
在“ 分析”选项卡中,选中“ 启动时开始记录方法跟踪 ”旁边的框。
从菜单中选择一个CPU记录配置。
点击应用。
选择“运行”>“配置文件”,将您的应用程序部署到运行Android 8.0(API级别26)或更高版本的设备。

八、导出 Trace

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

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

在CPU时间轴中,右键单击要导出的记录的方法跟踪或系统跟踪。
从菜单中选择“ 导出跟踪 ”。
浏览到要保存文件的位置,指定文件名,然后单击“ 确定”。
要从“ 会话”窗格中导出跟踪文件,请执行以下操作:

在“ 会话”窗格中,右键单击要导出的记录的跟踪。
单击会话条目右侧的“ 导出方法跟踪”或“ 导出系统跟踪”按钮。
浏览到要保存文件的位置,指定文件名,然后单击“ 确定”。

导出 Trace

九、导入Trace文件

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

通过单击“探查器”的“ 会话”窗格中的“ ****启动新探查器会话 ,然后选择“ 从文件加载”,导入跟踪文件

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

  • CPU活动未沿CPU时间轴表示。

  • 线程活动时间线仅指示每个线程在何处可以使用跟踪数据,而不指示实际的线程状态(例如运行,等待或休眠)。

十、分析 Trace

CPU Profiler中的跟踪窗格提供了几个选项卡,使您可以选择如何从记录的跟踪中查看信息。

对于方法迹线和功能迹线,可以从“ 调用图”,“ 火焰图”,“自上而下 ”和“ 自下而上”选项卡中进行选择。对于系统跟踪,可以从“ 跟踪事件”,“ 火焰图”,“自上而下 ”和“ 自下而上”选项卡中进行选择。

“ 调用图”,“ 火焰图”,“自上而下 ”和“ 自下而上”选项卡

提示:检查“ 呼叫图”或“ 火焰图”时,请按住Control键(在Mac上为Command)并滚动鼠标滚轮来放大和缩小。

1.使用“呼叫图表”选项卡检查跟踪

“ 呼叫图表”选项卡提供了方法跟踪或功能跟踪的图形表示,其中呼叫的时间段和计时在水平轴上表示,其被呼叫者在垂直轴上表示。对系统API的调用以橙色显示,对您应用程序自己的方法的调用以绿色显示,对第三方API(包括Java语言API)的调用以蓝色显示。图4显示了一个示例调用图,并说明了给定方法或函数的自身时间,子级时间和总时间的概念。您可以在有关如何使用“自上而下”和“自下而上”检查迹线的部分中了解有关这些概念的更多信息 。

图4.一个示例调用图,它说明了方法D的自我,孩子和总时间

提示:要跳转方法或函数的源代码,请右键单击它,然后选择“ 跳转到源代码”。这可从任何跟踪窗格选项卡使用。

2.使用“火焰图”选项卡检查痕迹

“ 火焰图”选项卡提供了一个反向调用图,该图汇总了相同的调用堆栈。也就是说,收集共享相同调用者序列的相同方法或函数,并在火焰图表中将其表示为一个较长的条(而不是将它们显示为多个较短的条,如调用表中所示)。这样可以更轻松地查看哪些方法或函数消耗最多的时间。但是,这也意味着水平轴不代表时间轴;相反,它指示每个方法或函数执行所需的相对时间。

为了帮助说明这个概念,请考虑图5中的调用图。请注意,方法D多次调用B(B 1,B 2和B 3),而其中一些调用B则调用C(C 1和C 3)。

图5.具有多个方法调用的调用图,这些方法调用共享一个公用的调用者序列

因为B 1,B 2和B 3共享相同的呼叫者序列(A→D→B),所以将它们聚合在一起,如图6所示。类似地,C 1和C 3聚合是因为它们共享相同的呼叫者序列。(A→D→B→C); 请注意,不包括C 2,因为它具有不同的调用方序列(A→D→C)。

图6.聚集共享相同调用栈的相同方法。

聚集的调用用于创建火焰图,如图7所示。请注意,对于火焰图中的任何给定调用,消耗最多CPU时间的被调用者将首先出现。

图7.图5所示的调用图的火焰图表示。

3.使用“自上而下”和“自下而上”检查迹线

“ 自上而下”选项卡显示调用列表,在其中扩展方法或功能节点将显示其被调用者。图8显示了图4中呼叫图表的俯视图。图中的每个箭头都从呼叫者指向被呼叫者。

如图8所示,在“ 自上而下”选项卡中展开方法A的节点将显示其被调用方,方法B和D。此后,展开方法D的节点将显示其被调用方,方法B和C,依此类推。与“ 火焰图” 选项卡相似,自上而下的树汇总了共享同一调用堆栈的相同方法的跟踪信息。也就是说,“ 火焰图”选项卡提供了“自上而下”选项卡的图形表示。

“ 自上而下”选项卡提供以下信息,以帮助描述每个调用花费的CPU时间(时间也表示为所选范围内线程总时间的百分比):

自我:方法或函数调用花费在执行其自己的代码而不是其被调用者身上的时间,如图4中方法D所示。
子级:方法或函数调用花费在执行其被调用方而不是其自身代码上的时间,如图4中方法D所示。
总计:方法的“ 自我”和“ 子级”时间的总和。这表示应用程序花费在执行调用上的总时间,如图4中方法D所示。

“ 自下而上”选项卡显示调用列表,在其中扩展功能或方法的节点将显示其调用者。使用图8中所示的示例跟踪,图9提供了方法C的自底向上树。在自底向上的树中打开方法C的节点将显示其唯一的调用者,方法B和D。请注意,尽管B调用了C两次,当在自底向上的树中展开方法C的节点时,B仅出现一次。之后,为B扩展节点将显示其调用方,方法A和D。

“ 自下而上”选项卡对于按消耗最多(或最少)CPU时间的方法或功能进行排序很有用。您可以检查每个节点,以确定哪些调用者花费最多的CPU时间来调用这些方法或函数。与自顶向下的树相比,自底向上的树中每个方法或功能的时序信息均参考每个树顶部(顶部节点)的方法。CPU时间也表示为该记录期间线程总时间的百分比。下表有助于说明如何解释顶级节点及其调用者(子节点)的时序信息。

注意:对于给定的记录,当探查器达到文件大小限制时,Android Studio会停止收集新数据(但是,这不会停止记录)。在执行检测跟踪时,这通常会更快地发生,因为与采样跟踪相比,这种类型的跟踪在较短的时间内收集了更多数据。如果将检查时间延长到达到限制后的记录时间,则跟踪窗格中的计时数据不会更改(因为没有新数据可用)。此外,当您仅选择记录中没有可用数据的部分时,跟踪窗格将显示NaN作为计时信息。

4.使用“跟踪事件”选项卡检查系统跟踪

检查系统跟踪时,可以使用“ 跟踪事件”选项卡查看每个线程上发生的事件的详细信息。

要查看线程的详细信息,请在“ 线程”窗格中选择该线程。这将在“ 内核”窗格中突出显示线程在每个CPU内核上的活动,并在“ 跟踪事件”选项卡中显示线程的事件。将鼠标指针悬停在“ 跟踪事件”选项卡中的事件上,可以查看事件的名称以及在每种状态下花费的时间。

例如,图10显示了RenderThread在“ 线程”窗格中选中的对象,在“ 内核”窗格中的CPU 0和CPU 1上突出显示了其活动,以及在“ 跟踪事件”选项卡中花费在特定事件上的时间。

图10.查看渲染线程的CPU活动和跟踪事件

有关检查系统跟踪信息的其他信息,请参阅文档的“ 调查UI性能问题” 部分systrace

5.检查帧渲染数据

您可以检查应用程序花费多长时间在主线程上渲染每个帧,并RenderThread调查导致UI混乱和帧率低的瓶颈。

要查看帧渲染数据,请 使用允许您跟踪系统调用的配置来记录跟踪。记录完跟踪之后,在名为FRAMES的部分下查找有关每个帧的信息,如图11所示。

图11.花费超过16ms的每个帧以红色显示

友情推荐

Android开发干货分享

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

分享到朋友圈吧,方便您使用时快速查找!

浏览 67
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报