捕获 Macrobenchmark 指标

指标是从基准测试中提取的主要信息类型。它们作为 List 传递给 measureRepeated 函数,这使您可以一次指定多个已测量的指标。基准测试至少需要一种指标才能运行。

以下代码片段捕获帧时序和自定义跟踪部分指标

Kotlin

benchmarkRule.measureRepeated(
    packageName = TARGET_PACKAGE,
    metrics = listOf(
        FrameTimingMetric(),
        TraceSectionMetric("RV CreateView"),
        TraceSectionMetric("RV OnBindView"),
    ),
    iterations = 5,
    // ...
)

Java

benchmarkRule.measureRepeated(
    TARGET_PACKAGE,     // packageName
    Arrays.asList(      // metrics
        new StartupTimingMetric(),
        new TraceSectionMetric("RV CreateView"),
        new TraceSectionMetric("RV OnBindView"),
    ),
    5,                  // Iterations
    // ...
);

在此示例中,RV CreateViewRV OnBindView 是在 RecyclerView 中定义的可跟踪块的 ID。 createViewHolder() 方法的源代码 是如何在您自己的代码中定义可跟踪块的示例。

StartupTimingMetricTraceSectionMetricFrameTimingMetricPowerMetric 将在本文档的后面部分详细介绍。

基准测试结果输出到 Android Studio,如图 1 所示。如果定义了多个指标,则所有指标都将组合到输出中。

Results of TraceSectionMetric and FrameTimingMetric.
图 1. TraceSectionMetricFrameTimingMetric 的结果。

StartupTimingMetric

StartupTimingMetric 捕获应用启动时间指标,包含以下值

  • timeToInitialDisplayMs:从系统接收启动 Intent 到渲染目标 Activity 的第一帧所花费的时间。
  • timeToFullDisplayMs:从系统接收启动 Intent 到应用使用 reportFullyDrawn() 方法报告完全绘制所花费的时间。测量在渲染 reportFullyDrawn() 调用后(或包含)的第一帧完成后停止。此测量可能在 Android 10(API 级别 29)及更早版本上不可用。

StartupTimingMetric 输出启动迭代的最小值、中位数和最大值。为了评估启动改进,您应该关注中位数,因为它提供了对典型启动时间的最佳估计。有关导致应用启动时间的原因的更多信息,请参阅 应用启动时间

StartupTimingMetric results
图 2. StartupTimingMetric 结果。

FrameTimingMetric

FrameTimingMetric 捕获基准测试(例如滚动或动画)生成的帧的时间信息,并输出以下值

  • frameOverrunMs:给定帧超出其截止时间的时间量。正数表示帧丢失且可见卡顿或抖动。负数表示帧比截止时间快多少。注意:此功能仅在 Android 12(API 级别 31)及更高版本上可用。
  • frameDurationCpuMs:帧在 UI 线程和 RenderThread 上的 CPU 上生成所花费的时间。

这些测量以 50th、90th、95th 和 99th 百分位数的分布形式收集。

有关如何识别和改进缓慢帧的更多信息,请参阅 缓慢渲染

FrameTimingMetric results
图 3. FrameTimingMetric 结果。

TraceSectionMetric

TraceSectionMetric 捕获与提供的 sectionName 匹配的跟踪区段出现的次数及其花费的时间。对于时间,它以毫秒为单位输出最小时间、中位数和最大时间。跟踪区段由函数调用 trace(sectionName)Trace.beginSection(sectionName)Trace.endSection() 之间的代码(或其异步变体)定义。它始终选择在测量期间捕获的跟踪区段的第一个实例。默认情况下,它仅输出您软件包中的跟踪区段;若要包含软件包外部的进程,请设置 targetPackageOnly = false

有关跟踪的更多信息,请参阅 系统跟踪概述定义自定义事件

TraceSectionMetric
图 4. TraceSectionMetric 结果。

PowerMetric

PowerMetric 捕获您测试期间提供的 功耗类别 的功耗或能量变化。每个选定的类别都细分为其可测量的子组件,未选定的类别将添加到“未选择”指标中。

这些指标测量系统范围内的功耗,而不是每个应用的功耗,并且仅限于 Pixel 6、Pixel 6 Pro 及更高版本的设备

  • power<category>Uw:此类别中测试期间消耗的功率。
  • energy<category>Uws:此类别中测试期间每单位时间的能量转移量。

类别包括以下内容

  • CPU
  • DISPLAY
  • GPU
  • GPS
  • MEMORY
  • MACHINE_LEARNING
  • NETWORK
  • UNCATEGORIZED

对于某些类别(例如 CPU),可能难以将其他进程完成的工作与您自己的应用完成的工作区分开来。为了最大程度地减少干扰,请移除或限制不必要的应用和帐户。

PowerMetric results
图 5. PowerMetric 结果。