组合跟踪

跟踪通常是首次调查性能问题时获取信息的首选来源。它们允许您对问题是什么以及从哪里开始查找形成假设。

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

准确计时

为了进行准确的分析,与任何性能测试一样,您需要根据可分析应用程序使应用程序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. 将这些额外的依赖项添加到宏基准测试测试模块中

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

反馈

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