组合跟踪

在首次调查性能问题时,轨迹通常是最佳信息来源。它们让您能够就问题所在以及从何处着手拟定假设。

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.0.0-beta01")

借助此依赖项,当您获取包含重组的系统轨迹时,系统会自动看到可组合函数。

获取系统轨迹

如需获取系统轨迹并查看新的重组跟踪的实际效果,请按以下步骤操作:

  1. 打开性能分析器:

    Android Studio - 开始分析
    图 2. Android Studio - 开始分析
  2. 点击 CPU 时间轴

    Android Studio 性能分析器 - CPU 时间轴
    图 3. Android Studio 性能分析器 - CPU 时间轴
  3. 将应用转到您要跟踪的界面,然后选择 System TraceRecord

    跟踪选项 - System Trace
    图 4. 跟踪选项 - System Trace
  4. 使用您的应用发起重组并停止记录。轨迹处理完毕并显示后,您现在应该能在重组轨迹中看到可组合项。您可以使用键盘和鼠标在轨迹上缩放和平移;如果您不熟悉如何浏览轨迹,请参阅记录轨迹文档。

    系统轨迹
    图 5. 系统轨迹

    双击图表中的可组合项即可转到其源代码。

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

    火焰图
    图 6. 火焰图

注意事项

APK 大小开销

虽然我们旨在尽可能减少该功能的开销,但由于 Compose 编译器将跟踪字符串嵌入在 APK 中,因此 Compose 应用的 APK 大小会增加。如果您的应用并未大量使用 Compose,这一大小增量可能会相对较小;如果您的应用是全 Compose 应用,则增量会较大。这些跟踪字符串未经额外混淆处理,因此可以显示在跟踪工具中,如前所示。从版本 1.3.0 开始,Compose 编译器会将它们注入所有应用。

您可以通过添加以下 ProGuard 规则,在正式版 build 中移除跟踪字符串:

-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 来衡量性能,它会将跟踪记录作为结果。如需使用 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 插桩参数。如需详细了解 Macrobenchmark 插桩参数,请参阅 Macrobenchmark 插桩参数

反馈

我们乐于倾听您对此功能的反馈、使用该功能时发现的任何 bug 以及任何请求。您可以通过问题跟踪器向我们发送反馈。