“自上而下”标签页显示一个调用列表,其中展开方法或函数节点会显示其被调用者。图 2 显示了以下调用图的自上而下图。图中的每个箭头都从调用者指向被调用者。
图 1. 一个调用图示例,说明了方法 D 的自身时间、子项时间和总时间。
如图 2 所示,展开“自上而下”标签页中方法 A 的节点会显示其被调用者,即方法 B 和 D。之后,展开方法 D 的节点会显示其被调用者,例如方法 B 和 C。与 火焰图 标签页类似,自上而下树会汇总共享相同调用堆栈的相同方法的跟踪信息。也就是说,“火焰图”标签页提供了“自上而下”标签页的图形表示。
“自上而下”标签页提供以下信息,以帮助描述每个调用所花费的 CPU 时间(时间也表示为线程在所选范围内总时间的百分比)
- 自身时间:方法或函数调用执行自身代码而非被调用者代码所花费的时间,如图 1 所示的方法 D。
- 子项时间:方法或函数调用执行其被调用者而非自身代码所花费的时间,如图 1 所示的方法 D。
- 总时间:方法的自身时间和子项时间的总和。这表示应用执行某个调用所花费的总时间,如图 1 所示的方法 D。

图 2. 自上而下树。

图 3. 图 5 中方法 C 的自下而上树。
“自下而上”标签页显示一个调用列表,其中展开函数或方法的节点会显示其调用者。使用图 2 所示的示例轨迹,图 3 提供了方法 C 的自下而上树。在自下而上树中打开方法 C 的节点会显示其每个唯一的调用者,即方法 B 和 D。请注意,尽管 B 调用 C 两次,但在自下而上树中展开方法 C 的节点时,B 只显示一次。之后,展开 B 的节点会显示其调用者,即方法 A 和 D。
“自下而上”标签页可用于根据方法或函数消耗的 CPU 时间量(最多或最少)进行排序。您可以检查每个节点,以确定哪些调用者在调用这些方法或函数时花费的 CPU 时间最多。与自上而下树相比,自下而上树中每个方法或函数的时间信息都是参照每棵树顶部的那个方法(顶层节点)而言的。CPU 时间也表示为该录制期间线程总时间的百分比。下表有助于解释如何解读顶层节点及其调用者(子节点)的时间信息。
自身时间 | 子项时间 | 总时间 | |
---|---|---|---|
自下而上树顶部的某个方法或函数(顶层节点) | 表示方法或函数执行自身代码而非被调用者代码所花费的总时间。与自上而下树相比,此时间信息表示在录制期间对此方法或函数的所有调用的总和。 | 表示方法或函数执行其被调用者而非自身代码所花费的总时间。与自上而下树相比,此时间信息表示在录制期间对此方法或函数的被调用者的所有调用的总和。 | 自身时间与子项时间之和。 |
调用者(子节点) | 表示被调用者在被调用者调用时所花费的自身总时间。以图 6 中的自下而上树为例,方法 B 的自身时间将等于方法 C 每次由 B 调用时自身时间的总和。 | 表示被调用者在被调用者调用时所花费的子项总时间。以图 6 中的自下而上树为例,方法 B 的子项时间将等于方法 C 每次由 B 调用时子项时间的总和。 | 自身时间与子项时间之和。 |
注意:对于给定的录制,当分析器达到文件大小限制时,Android Studio 会停止收集新数据(但这不会停止录制)。与采样跟踪相比,在执行插桩跟踪时,这种情况通常发生得更快,因为此类跟踪在更短的时间内收集更多数据。如果您将检查时间扩展到达到限制后发生的录制时段,则跟踪窗格中的时间数据不会更改(因为没有新数据可用)。此外,当您仅选择录制中没有可用数据的那部分时,跟踪窗格会为时间信息显示 NaN。