Android 代码插桩

有多种方法可以在 Android 上使用分析器。有一个“Java”分析器功能(通过 about:profiling),它可以启用 JVM 代码的分析。如果您正在分析 Android 设备,则预设很可能已将其打开。

除了采样之外,还可以创建标记来专门标记时间点或持续时间。这有助于理解前端的特定部分,或记录样本中通常不会显示的事件。

注意

本指南深入解释了 Android 标记。要详细了解如何在 C++、JavaScript 或 Rust 中添加标记,请分别查看其在 标记JavaScript 代码插桩Rust 代码插桩 中的文档。

GeckoView Java 代码库中的标记

如果您在 GeckoView 代码库中,则应该可以访问 GeckoRuntimeGeckoRuntime 有一个 getProfilerController 方法来获取 ProfilerController。请参阅 ProfilerController Java 文件 (javadoc) 以查找可以用来为源代码添加插桩的方法。

以下是一个示例

// Simple marker
sGeckoRuntime.getProfilerController().addMarker("Marker Name");

// Simple marker with additional information
sGeckoRuntime.getProfilerController().addMarker("Marker Name", "info");

// Duration marker
Double startTime = sGeckoRuntime.getProfilerController().getProfilerTime();
// ...some code you want to measure...
sGeckoRuntime.getProfilerController().addMarker("Marker Name", startTime);

// Duration marker with additional information
sGeckoRuntime.getProfilerController().addMarker("Marker Name", startTime, "info");

您可以根据需要选择 addMarker 的各种重载。

如果您需要在将其添加到标记之前计算某些信息,建议使用 isProfilerActive if 检查来包装该代码,以确保它仅在分析器处于活动状态时才执行。以下是一个示例

ProfilerController profilerController = runtime.getProfilerController();
if (profilerController.isProfilerActive()) {
  // Compute the information you want to include.
  String info = ...
  sGeckoRuntime.getProfilerController().addMarker("Marker Name", info);
}

Fenix 代码库中的标记

如果您在 Fenix 代码库中,则应该可以访问 Android 组件。Android 组件包括 此处提供的 Profiler 接口,以及其相应的 此处提供的实现。您应该能够使用 ProfilerController 执行所有操作。以下是如何调用它们的一个示例

// Simple marker
components.core.engine.profiler?.addMarker("Marker Name");

// Simple marker with additional information
components.core.engine.profiler?.addMarker("Marker Name", "info");

// Duration marker
val startTime = components.core.engine.profiler?.getProfilerTime()
// ...some code you want to measure...
components.core.engine.profiler?.addMarker("Marker Name", startTime, "additional info")

// Duration marker with additional information
components.core.engine.profiler?.addMarker("Marker Name", startTime, "info");

同样,您可以根据需要选择 addMarker 的各种重载。

与上面的 GeckoView 示例类似,如果您需要在将其添加到标记之前计算某些信息,建议使用 isProfilerActive if 检查来包装该代码,以确保它仅在分析器处于活动状态时才执行。以下是一个示例

if (components.core.engine.profiler?.isProfilerActive() == true) {
  // Compute the information you want to include.
  var info = ...
  components.core.engine.profiler?.addMarker("Marker Name", info)
}