在首次调查性能问题时,追踪通常是最佳信息来源。它们能帮助您形成问题假设并确定从何处开始查找。
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.8.1")
如果您正在使用 Compose BOM,则无需指定版本。
val composeBom = platform("androidx.compose:compose-bom:2025.05.00")
implementation(composeBom)
// ...
// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")
有了此依赖项,当您进行包含重组的系统追踪时,您将能够自动看到可组合函数。
执行系统追踪
要执行系统追踪并查看新的重组追踪的实际运行情况,请按照以下步骤操作:
打开 Profiler
图 2. Android Studio - 开始性能分析 点击 CPU timeline
图 3. Android Studio Profiler - CPU 时间轴 将您的应用导航到要追踪的界面,然后选择 System Trace 并点击 Record
图 4. 追踪选项 - 系统追踪 使用您的应用触发重组并停止录制。一旦追踪处理完毕并显示,您现在应该能够在重组追踪中看到可组合项。您可以使用键盘和鼠标缩放和平移追踪;如果您不熟悉追踪导航,请参阅录制追踪文档。
图 5. 系统追踪 双击图表中的可组合项会将您带到其源代码。
您也可以在火焰图中看到可组合项以及文件和行号
图 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 相同。
精确计时
为了进行精确分析,与任何性能测试一样,您需要按照可分析应用中的说明,将应用设置为 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 测试模块中:
implementation("androidx.tracing:tracing-perfetto:1.0.0") implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
在运行基准测试之前添加
androidx.benchmark.fullTracing.enable=true
仪器化参数。有关宏基准测试仪器化参数的更多信息,请查看宏基准测试仪器化参数。
反馈
我们非常希望听到您对此功能的反馈、您发现的任何错误以及您提出的任何请求。您可以通过问题跟踪器向我们发送反馈。