系统跟踪仅在系统层面显示进程信息,因此有时很难了解您的应用或游戏的哪些方法正在相对于系统事件在特定时间执行。
Jetpack 提供了一个跟踪 API,可用于标记特定的代码段。此信息随后会在设备上捕获的跟踪中报告。Macrobenchmark 会自动捕获带有自定义跟踪点的跟踪。
使用 systrace 命令行工具捕获跟踪时,需要使用 -a
选项。如果没有此选项,您的应用方法将不会出现在系统跟踪报告中。
Kotlin
class MyAdapter : RecyclerView.Adapter<MyViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { trace("MyAdapter.onCreateViewHolder") { MyViewHolder.newInstance(parent) } } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { trace("MyAdapter.onBindViewHolder") { trace("MyAdapter.queryDatabase") val rowItem = queryDatabase(position) dataset.add(rowItem) } holder.bind(dataset[position]) } } }
Java
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return TraceKt.trace( "MyAdapter.onCreateViewHolder", () -> MyViewHolder.newInstance(parent) ); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { TraceKt.trace( "MyAdapter.onBindViewHolder", () -> { TraceKt.trace( "MyAdapter.queryDatabase", () -> { Item rowItem = queryDatabase(position); dataset.add(rowItem); } ); } ); } }
我们建议使用 Kotlin 扩展函数,即使在 Java 代码中也是如此,因为它会在 lambda 完成时自动结束跟踪。这消除了忘记结束跟踪的风险。
您还可以使用 NDK API 来实现自定义跟踪事件。要了解如何将此 API 用于原生代码,请参阅原生代码中的自定义跟踪事件。