Android Profiler分析(一)概述
Android Profiler分析(二) Memory Profiler
Android Profiler分析(三) CPU Profiler
CPU Profiler 可帮助您实时检查应用的 CPU 使用率和线程 Activity,并记录函数跟踪,以便您可以优化和调试您的应用代码。
要打开 CPU Profiler,请按以下步骤操作:
最大限度减少应用的 CPU 使用率具有许多优势,如提供更快更顺畅的用户体验,以及延长设备电池续航时间。 它还可帮助应用在各种新旧设备上保持良好性能。 与应用交互时,您可以使用 CPU Profiler 监控 CPU 使用率和线程 Activity。
对于应用进程中的每个线程,您可以查看一段时间内执行了哪些函数,以及在其执行期间每个函数消耗的 CPU 资源。 您还可以使用函数跟踪来识别调用方和被调用方。 调用方指调用其他函数的函数,而被调用方是指被其他函数调用的函数。 您可以使用此信息确定哪些函数负责调用常常会消耗大量特定资源的任务,并尝试优化应用代码以避免不必要的工作。
如果您想收集可帮助您检查原生系统进程的详细系统级数据,并解决掉帧引起的界面卡顿,您应使用 systrace。
或者,如果您想导出您使用 Debug 类捕获的 .trace 文件,您应使用 Traceview。
当您打开 CPU Profiler 时,它将立即开始显示应用的 CPU 使用率和线程Activity。 您应该会看到类似下图的一些内容:
CPU Profiler 的默认视图包括以下内容:
绿色: 表示线程处于活动状态或准备使用 CPU。 即,它正在“运行中”或处于“可运行”状态。
黄色: 表示线程处于活动状态,但它正在等待一个 I/O 操作(如磁盘或网络 I/O),然后才能完成它的工作。
灰色: 表示线程正在休眠且没有消耗任何CPU 时间。 当线程需要访问尚不可用的资源时偶尔会发生这种情况。 线程进入自主休眠或内核将此线程置于休眠状态,直到所需的资源可用。
Sampled: 一个默认配置,在应用执行期间频繁捕获应用的调用堆栈。 分析器比较捕获的数据集以推导与应用代码执行有关的时间和资源使用信息。 基于“Sampled”的跟踪的固有问题是,如果应用在捕获调用堆栈后进入一个函数并在下一次捕获前退出该函数,则分析器不会记录该函数调用。 如果您对此类生命周期很短的跟踪函数感兴趣,您应使用“Instrumented”跟踪。
Instrumented: 一个默认配置,在运行时设置应用以在每个函数调用的开始和结束时记录时间戳。 它收集时间戳并进行比较,以生成函数跟踪数据,包括时间信息和 CPU使用率。 请注意,与设置每个函数关联的开销会影响运行时性能,并可能会影响分析数据,对于生命周期相对较短的函数,这一点更为明显。此外,如果应用短时间内执行大量函数,则分析器可能会迅速超出它的文件大小限制,且不能再记录更多跟踪数据。
Edit configurations: 允许您更改上述“Sampled”和“Instrumented”记录配置的某些默认值,并将它们另存为自定义配置。
要开始记录函数跟踪,从下拉菜单中选择 Sampled 或 Instrumented 记录配置,或选择您创建的自定义记录配置,然后点击 Record 与应用交互并在完成后点击 Stop recording 。 分析器将自动选择记录的时间范围,并在函数跟踪窗格中显示其跟踪信息,如图 2 所示。如果您想检查另一个线程的函数跟踪,只需从线程 Activity 时间线中选中它。
Wall clock time:壁钟时间信息表示实际经过的时间。
Thread time:线程时间信息表示实际经过的时间减去线程没有消耗CPU 资源的任意时间部分。 对于任何给定函数,其线程时间始终少于或等于其壁钟时间。 使用线程时间可以让您更好地了解线程的实际 CPU使用率中有多少是给定函数消耗的
使用 Call Chart 标签检查跟踪
Call Chart 标签提供函数跟踪的图形表示形式,其中,水平轴表示函数调用(或调用方)的时间段和时间,并沿垂直轴显示其被调用者。 对系统 API 的函数调用显示为橙色,对应用自有函数的调用显示为绿色,对第三方 API(包括 Java 语言 API)的函数调用显示为蓝色。 下图展示了一个调用图表示例,并描绘了给定函数的 self time、children time 以及总时间的概念。 您可以在如何使用 Top Down 和 Bottom Up 检查跟踪部分详细了解这些概念。
一个调用图表示例,描绘了函数 D 的 self、children 及总时间,若要跳转到某个函数的源代码,请右键点击该函数并选择 Jump to Source。 这适用于任一跟踪窗格标签
使用 Flame Chart 标签检查跟踪
Flame Chart 标签提供一个倒置的调用图表,其汇总相同的调用堆栈。 即,收集共享相同调用方顺序的完全相同的函数,并在火焰图中用一个较长的横条表示它们(而不是将它们显示为多个较短的横条,如调用图表中所示)。 这样更方便您查看哪些函数消耗最多时间。 不过,这也意味着水平轴不再代表时间线,相反,它表示每个函数相对的执行时间。
为帮助说明此概念,请考虑以下图 中的调用图表。 请注意,函数 D 多次调用 B(B1、B2 和 B3),其中一些对 B 的调用也调用了 C(C1 和 C3)。
由于 B1、B2 和 B3 共享相同的调用方顺序 (A → D → B),因此,可将它们汇总在一起,如下所示。 同样,将 C1 和 C3 汇总在一起,因为它们也共享相同的调用方顺序 (A → D → B → C)—请注意,未包含 C2,因为它具有不同的调用方顺序 (A → D → C)。
汇总的函数调用用于创建火焰图,如下图所示。请注意,对于火焰图中任何给定的函数调用,消耗最多 CPU 时间的被调用方首先显示
使用 Top Down 和 Bottom Up 检查跟踪
Top Down 标签显示一个函数调用列表,在该列表中展开函数节点会显示函数的被调用方。如下图图表中的每个箭头都从调用方指向被调用方。
如下图 所示,在“Top Down”标签中展开函数 A 的节点可显示它的被调用方,即函数 B 和 D。 然后,展开函数 D 的节点可显示它的被调用方,即函数 B 和 C 等等。 与 Flame chart 标签相似,“Top Down”树汇总共享相同调用堆栈的相同函数的跟踪信息。 也就是说,Flame chart 标签可提供Top down 标签的图形化表示形式。
Top Down 标签提供以下信息以帮助说明在每个函数调用上所花费的 CPU 时间(时间也可以用线程总时间占所选时间范围的持续时间的百分比表示):
Bottom Up 标签用于按照消耗最多(最少)CPU 时间排序函数。 您可以检查每个节点以确定在调用函数上哪些调用方花了最多 CPU 时间。 与“Top Down”树相比,“Bottom Up”树中的每个函数的时间信息引用每个树顶部的函数(顶部模式)。 CPU 时间也可表示为在该记录期间占线程总时间的百分比。 下表有助于阐述如何解释顶部节点的时间信息及其调用方函数(子节点)。
您可以从 Android Studio 为您提供的记录配置中选择一个配置,如 Sampled 或 Instrumented,也可以创建自己的记录配置。 要创建或编辑自定义配置,或检查现有默认配置,可通过从记录配置下拉菜单中选择 Edit configurations 来打开 CPU Recording Configurations 对话框
您可以通过从左侧窗格中选择现有配置来检查其设置,也可按如下方式创建一个新的记录配置
如果您使用运行 API 级别 26
或更高版本的连接设备,则对于跟踪数据的文件大小没有限制,此值可忽略。不过,您仍需留意每次记录后设备收集了多少数据——Android
Studio
可能难以解析大型跟踪文件。例如,当应用短时间内调用许多函数时,如果您记录抽样间隔较短的“Sampled”跟踪或“Instrumented”跟踪,您很快就会生成大型跟踪文件
创建新配置后,系统将自动从记录配置下拉菜单中选中它,并且您可以将它用于您的下一次记录