在首次调查性能问题时,轨迹通常是最佳信息来源。它们让您能够就问题所在以及从何处着手拟定假设。
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.7.5")
如果您使用的是 Compose BoM,则无需指定版本:
val composeBom = platform("androidx.compose:compose-bom:2024.10.01")
implementation(composeBom)
// ...
// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")
借助此依赖项,当您获取包含重组的系统轨迹时,可以自动看到可组合函数。
获取系统轨迹
如需获取系统轨迹并查看新的重组跟踪的实际效果,请按以下步骤操作:
打开性能分析器:
点击 CPU 时间轴
将应用转到您要跟踪的界面,然后选择 System Trace 和 Record
使用您的应用发起重组并停止记录。轨迹处理完毕并显示后,您现在应该能在重组轨迹中看到可组合项。您可以使用键盘和鼠标在轨迹上缩放和平移;如果您不熟悉如何浏览轨迹,请参阅记录轨迹文档。
双击图表中的可组合项即可转到其源代码。
您还可以在火焰图中查看可组合项以及文件和行号:
注意事项
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 相同。
准确计时
为了像任何其他性能测试一样进行准确分析,您需要按照可分析应用的要求将应用设置为 profileable
和 non-debuggable
。
从终端捕获轨迹
您可以从终端捕获组合跟踪记录。为此,您必须执行 Android Studio 通常自动为您执行的步骤。
添加依赖项
首先,向应用添加其他依赖项。
implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
生成记录命令
- 使用 Perfetto 生成记录命令。
手动添加
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
捕获跟踪记录
- 启动应用并准备要跟踪的部分。
通过发出广播在应用中启用跟踪。
# 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
启动您之前创建的录制命令。
打开跟踪记录
adb pull <location>
:设备中的轨迹(在记录命令中指定的位置)。在 Perfetto 中打开。
使用 Jetpack Macrobenchmark 捕获轨迹
您可以使用 Jetpack Macrobenchmark 衡量性能,该工具会以轨迹的形式提供结果。如需使用 Macrobenchmark 启用组合跟踪,您需要:
将以下其他依赖项添加到 Macrobenchmark 测试模块:
implementation("androidx.tracing:tracing-perfetto:1.0.0") implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
在运行基准测试之前添加
androidx.benchmark.fullTracing.enable=true
插桩参数。如需详细了解 Macrobenchmark 插桩参数,请参阅 Macrobenchmark 插桩参数。
反馈
我们乐于倾听您对此功能的反馈、使用该功能时发现的任何 bug 以及任何请求。您可以通过问题跟踪器向我们发送反馈。