组合项追踪

在首次调查性能问题时,追踪通常是最佳信息来源。它们能帮助您形成问题假设并确定从何处开始查找。

Android 上支持两种级别的追踪:系统追踪和方法追踪。

由于系统追踪只追踪专门标记用于追踪的区域,因此其开销较低,对应用性能影响不大。系统追踪非常适合查看代码特定部分的运行时间。

方法追踪会追踪应用中的每个函数调用。这会产生很高的开销,因此会严重影响应用性能,但它能提供当前正在发生的所有情况的完整图景,包括调用了哪些函数以及调用频率。

默认情况下,系统追踪包含单个可组合函数。它们可在方法追踪中获取。

组合项追踪在系统追踪中显示可组合函数。该功能可提供系统追踪的低侵入性,同时在组合项中提供方法追踪级别的详细信息。

组合项追踪设置

要在项目中试用重组追踪,您需要更新到至少以下版本:

  • Android Studio Flamingo
  • Compose UI: 1.3.0
  • Compose Compiler: 1.3.0

您运行追踪的设备或模拟器也必须至少达到 API 级别 30。

此外,您还需要添加对 Compose Runtime Tracing 的新依赖项:

implementation("androidx.compose.runtime:runtime-tracing:1.8.1")

如果您正在使用 Compose BOM,则无需指定版本。

val composeBom = platform("androidx.compose:compose-bom:2025.05.00")
implementation(composeBom)
// ...

// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")

有了此依赖项,当您进行包含重组的系统追踪时,您将能够自动看到可组合函数。

执行系统追踪

要执行系统追踪并查看新的重组追踪的实际运行情况,请按照以下步骤操作:

  1. 打开 Profiler

    Android Studio - Start Profiling
    图 2. Android Studio - 开始性能分析
  2. 点击 CPU timeline

    Android Studio Profiler - CPU timeline
    图 3. Android Studio Profiler - CPU 时间轴
  3. 将您的应用导航到要追踪的界面,然后选择 System Trace 并点击 Record

    Trace options - System trace
    图 4. 追踪选项 - 系统追踪
  4. 使用您的应用触发重组并停止录制。一旦追踪处理完毕并显示,您现在应该能够在重组追踪中看到可组合项。您可以使用键盘和鼠标缩放和平移追踪;如果您不熟悉追踪导航,请参阅录制追踪文档。

    System trace
    图 5. 系统追踪

    双击图表中的可组合项会将您带到其源代码。

  5. 您也可以在火焰图中看到可组合项以及文件和行号

    Flame chart
    图 6. 火焰图

注意事项

APK 大小开销

虽然我们旨在最大限度地减少此功能的开销,但由于 Compose 编译器将追踪字符串嵌入到 APK 中,Compose 应用的 APK 大小会有所增加。如果您的应用使用 Compose 不多,则此大小增加相对较小;对于完全使用 Compose 的应用,则会更大。这些追踪字符串还未经过混淆处理,因此可以显示在追踪工具中,如前所示。Compose 编译器从 1.3.0 版本开始将它们注入所有应用。

您可以通过添加以下 Proguard 规则在生产版本中移除这些追踪字符串:

-assumenosideeffects public class androidx.compose.runtime.ComposerKt {

   boolean isTraceInProgress();

   void traceEventStart(int,int,int,java.lang.String);

   void traceEventStart(int,java.lang.String);

   void traceEventEnd();

}

这些函数将来可能会更改,但任何更改都将在 Compose 版本说明中提及。

请注意,保留这些函数虽然会产生一些 APK 大小成本,但可确保正在分析的 APK 与应用用户运行的 APK 相同。

精确计时

为了进行精确分析,与任何性能测试一样,您需要按照可分析应用中的说明,将应用设置为 profileablenon-debuggable

从终端捕获追踪

可以从终端捕获组合项追踪。为此,您必须执行 Android Studio 通常为您自动执行的步骤。

添加依赖项

首先,为您的应用添加额外的依赖项。

implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")

生成录制命令

  1. 使用 Perfetto 生成录制命令。
  2. 按照以下示例手动添加 track_event 数据源部分:

    adb shell perfetto \
      -c - --txt \
      -o /data/misc/perfetto-traces/trace \
    <<EOF
    buffers: {
        size_kb: 63488
        fill_policy: RING_BUFFER
    }
    buffers: {
        size_kb: 2048
        fill_policy: RING_BUFFER
    }
    data_sources: {
        config {
            name: "track_event"
        }
    }
    duration_ms: 10000
    flush_period_ms: 30000
    incremental_state_config {
        clear_period_ms: 5000
    }
    EOF

捕获追踪

  1. 启动应用并准备要追踪的部分。
  2. 通过发出广播在应用中启用追踪。

    # set app package variable, e.g. com.google.samples.apps.nowinandroid.debug
    # can be found through `adb shell ps -ef` or `adb shell cmd package list packages`
    package=<your app process>
    
    # issue a broadcast to enable tracing
    adb shell am broadcast \
    -a androidx.tracing.perfetto.action.ENABLE_TRACING \
    $package/androidx.tracing.perfetto.TracingReceiver
    
  3. 启动您之前创建的录制命令。

打开追踪

  1. adb pull <location> 从设备中取出追踪(位置在录制命令中指定)。

  2. Perfetto 中打开。

使用 Jetpack Macrobenchmark 捕获追踪

您可以使用 Jetpack Macrobenchmark 测量性能,它会提供追踪作为结果。要使用宏基准测试启用组合项追踪,您需要:

  1. 将这些额外的依赖项添加到 Macrobenchmark 测试模块中:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. 在运行基准测试之前添加 androidx.benchmark.fullTracing.enable=true 仪器化参数。有关宏基准测试仪器化参数的更多信息,请查看宏基准测试仪器化参数

反馈

我们非常希望听到您对此功能的反馈、您发现的任何错误以及您提出的任何请求。您可以通过问题跟踪器向我们发送反馈。