组合跟踪

在首次调查性能问题时,跟踪通常是最佳信息来源。它们使您能够形成关于问题是什么以及从哪里开始查找的假设。

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

由于系统跟踪仅跟踪专门标记为跟踪的区域,因此其开销低,并且不会很大程度地影响应用的性能。系统跟踪非常适合查看代码的特定部分运行需要多长时间。

方法跟踪跟踪应用中的每个函数调用。这非常昂贵,因此会极大地影响应用的性能,但它为您提供了正在发生的事情、正在调用哪些函数以及调用频率的完整画面。

默认情况下,系统跟踪**不**包含各个可组合函数。它们在方法跟踪中可用。

我们目前正在测试新的系统跟踪功能,以在系统跟踪中显示可组合函数。它为您提供了来自系统跟踪的低侵入性,以及组合中的方法跟踪级别的详细信息。

组合跟踪设置

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

  • Android Studio Flamingo
  • Compose UI:1.3.0
  • Compose 编译器:1.3.0

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

此外,您需要在 Compose Runtime Tracing 上添加一个新的依赖项

implementation("androidx.compose.runtime:runtime-tracing:1.0.0-beta01")

使用此依赖项,当您进行包含重组的系统跟踪时,您可以自动看到可组合函数。

进行系统跟踪

要进行系统跟踪并查看新的重组跟踪的实际效果,请按照以下步骤操作

  1. 打开分析器

    Android Studio - Start Profiling
    图 2. Android Studio - 开始分析
  2. 点击CPU 时间线

    Android Studio Profiler - CPU timeline
    图 3. Android Studio 分析器 - CPU 时间线
  3. 导航到您要跟踪的 UI 的应用,然后选择系统跟踪记录

    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 相同。

精确计时

为了进行精确的分析,就像任何性能测试一样,您需要使应用可分析不可调试,如可分析应用中所述。

从终端捕获跟踪

可以从终端捕获组合跟踪。为此,您必须执行 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>从设备中提取跟踪(录制命令中指定的 location)。

  2. Perfetto中打开。

使用 Jetpack Macrobenchmark 捕获跟踪

您可以使用Jetpack Macrobenchmark衡量性能,它提供跟踪作为结果。要在宏基准测试中启用组合跟踪,您需要

  1. 将这些其他依赖项添加到宏基准测试测试模块

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

反馈

我们很乐意听取您对此功能的反馈、您发现的任何错误以及您提出的任何请求。您可以通过问题跟踪器向我们发送反馈。