在首次调查性能问题时,跟踪通常是最佳信息来源。它们使您能够形成关于问题是什么以及从哪里开始查找的假设。
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")
使用此依赖项,当您进行包含重组的系统跟踪时,您可以自动看到可组合函数。
进行系统跟踪
要进行系统跟踪并查看新的重组跟踪的实际效果,请按照以下步骤操作
打开分析器
点击CPU 时间线
导航到您要跟踪的 UI 的应用,然后选择系统跟踪和记录
使用您的应用导致重组并停止记录。处理完跟踪并显示后,您现在应该能够在重组跟踪中看到可组合项。您可以使用键盘和鼠标放大和缩小跟踪;如果您不熟悉导航跟踪,请参阅记录跟踪文档。
双击图表中的可组合项会将您带到其源代码。
您还可以在火焰图中看到可组合项以及文件和行号
注意事项
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")
生成录制命令
- 使用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>
从设备中提取跟踪(录制命令中指定的 location)。在Perfetto中打开。
使用 Jetpack Macrobenchmark 捕获跟踪
您可以使用Jetpack Macrobenchmark衡量性能,它提供跟踪作为结果。要在宏基准测试中启用组合跟踪,您需要
将这些其他依赖项添加到宏基准测试测试模块
implementation("androidx.tracing:tracing-perfetto:1.0.0") implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
在运行基准测试之前添加
androidx.benchmark.fullTracing.enable=true
instrumentation 参数。有关宏基准测试 instrumentation 参数的更多信息,请查看宏基准测试 instrumentation 参数。
反馈
我们很乐意听取您对此功能的反馈、您发现的任何错误以及您提出的任何请求。您可以通过问题跟踪器向我们发送反馈。