在首次调查性能问题时,轨迹通常是最佳信息来源。它们让您能够就问题所在以及从何处着手拟定假设。
Android 支持两个级别的跟踪:系统跟踪和方法跟踪。
由于系统跟踪仅跟踪专门标记为跟踪的区域,因此它具有 开销较低,并且不会对应用的性能产生很大影响。系统跟踪非常适合用于查看运行代码的特定部分需要多长时间。
方法跟踪会跟踪应用中的每个函数调用。费用非常高 这会极大地影响应用的性能 描述正在发生的情况、被调用的函数以及调用频率 调用它们。
默认情况下,系统轨迹不包含单独的可组合函数。方法轨迹包含这些函数。
我们目前正在测试新的系统跟踪功能,用于在系统轨迹中显示可组合函数。这样,您便可获享系统跟踪的低干扰,并获得有关组合的方法跟踪级详细信息。
设置组合跟踪
如要在项目中试用重组跟踪,您需要至少更新到以下版本:
- Android Studio Flamingo
- Compose 界面:1.3.0
- Compose Compiler:1.3.0
运行轨迹的设备或模拟器也必须至少为 API 级别 30。
此外,您还需要添加 Compose Runtime Tracing 的新依赖项:
implementation("androidx.compose.runtime:runtime-tracing:1.0.0-beta01")
利用此依赖项,当您获取包含重组的系统轨迹时, 系统会自动显示可组合函数。
获取系统轨迹
如需获取系统轨迹并查看新的重组跟踪的实际效果,请按以下步骤操作:
打开性能分析器:
图 2. Android Studio - 开始分析 点击 CPU 时间轴
图 3. Android Studio 性能分析器 - CPU 时间轴 将应用转到您要跟踪的界面,然后选择 System Trace 和 Record
图 4. 跟踪选项 - System Trace 使用您的应用发起重组并停止记录。轨迹处理完毕并显示后,您现在应该能在重组轨迹中看到可组合项。您可以使用键盘和鼠标在轨迹上缩放和平移;如果您不熟悉如何浏览轨迹,请参阅记录轨迹文档。
图 5. 系统轨迹 双击图表中的可组合项即可转到其源代码。
您还可以在火焰图中查看可组合项以及文件和行号:
图 6. 火焰图
注意事项
APK 大小开销
虽然我们旨在尽可能减少该功能的开销,但由于 Compose 编译器将跟踪字符串嵌入在 APK 中,因此 Compose 应用的 APK 大小会增加。这种大小的增加 相对较小(如果您的应用没有大量使用 Compose),或者针对完整 Compose 使用较大容量 。这些跟踪字符串也未经过混淆处理,因此可以出现在 如上文所示Compose 编译器会将它们注入 从版本 1.3.0 开始。
您可以通过添加以下 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>
:来自设备的跟踪记录(在 record 命令)。在 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 以及任何请求。您可以向我们发送反馈, 跟踪器。