Profiler是Android Studio中提供的一个分析工具,它提供了四个维度的分析,CPU(函数调用)、MEMORY(内存分配)、NETWORK(网络流量)、ENERGY(耗电量)。这一篇根据官方的介绍针对CPU维度提供的分析功能进行下整理。

CPU维度下提供了四种分析方式,Call Chart、Flame Chart、Top Down、Bottom Up。

Call Chart(调用图)

用一张抽象图来描述,每个色块表示一个方法调用,水平方向是时间轴,竖直方向从上到下为调用关系。

Java Flight Recorder 火焰图 android 火焰图_方法调用

从图中我们可以很清楚到看到各个方法在时间维度上的调用关系。

Flame Chart(火焰图)

同样用一张抽象图表示,水平方向表示record时间段内方法调用的百分比,竖直方向从下到上为调用关系。

Java Flight Recorder 火焰图 android 火焰图_profiler_02

从图中可以清晰的看出耗时占比高的调用栈(A->B->C)。

那么火焰图是如何得到的呢?

以Call Chart为基础,把一致的调用栈合并起来,并按照持续时间进行排序,就得到了Flame Chart。

过程如下图:

Java Flight Recorder 火焰图 android 火焰图_Self_03

Top Down(自顶向下)

Top Down 将方法调用关系用树的形式进行展现,根节点是最外层的调用者。分析结果中有三个数值,Total、Self、Children,分别表示方法总耗时、本身耗时、调用的子方法耗时。

将Flame Chart中的百分比折算成时间,计算出每个方法的耗时情况如下表

Java Flight Recorder 火焰图 android 火焰图_cpu_04

在Flame Chart中找到主要耗时操作,在Top Down确定具体耗时,两者配合使用效果更佳。

Bottom Up(自底向上)

Bottom Up同样是以多颗树(官方介绍中称之为森林)的形式进行展现,只不过作为根节点的是被调用者。分析结果中同样包含了Total、Self、Children三个数值,如下图:

Java Flight Recorder 火焰图 android 火焰图_Self_05

但是有一点需要特别注意,Self指的是树中根节点的Self耗时。举个栗子,比如上表中第二行,B的Self是5s而不是2s,原因就是这棵树是C的Bottom Up树,所以这里的Self是指C被B调用的自身耗时,而不是B的自身耗时,这里需要重点注意。