系统跟踪仅在系统级别显示进程的相关信息,因此有时很难知道应用或游戏的哪些方法是在给定时间针对系统事件执行的。
Jetpack 提供了一个跟踪 API,可用于为特定的代码段添加标签。然后,设备上捕获的跟踪记录中会报告此信息。Macrobenchmark 会自动使用自定义跟踪记录点来捕获跟踪记录。
使用 systrace 命令行工具捕获跟踪记录时,必须使用 -a
选项;如果不使用此选项,您应用的方法将不会显示在系统跟踪报告中。
Kotlin
如需在代码中创建自定义跟踪事件,请使用 tracking-ktx 库。
尤其是,顶层 trace 函数会自动处理开始和结束逻辑。详见以下代码段。
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
如需在代码中创建自定义跟踪事件,请使用 Jetpack 跟踪库中的
Trace
类,如以下代码段所示。
注意:如果您多次调用 beginSection()
,调用 endSection()
只会结束最近调用的 beginSection()
方法。因此,对于嵌套调用(如以下代码段中所示),请务必将每次对 beginSection()
的调用与对 endSection()
的调用正确匹配。
此外,您不能在一个线程上调用 beginSection()
,而在另一个线程上结束它;您必须在同一个线程上调用这两个方法。
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Trace.beginSection("MyAdapter.onCreateViewHolder"); MyViewHolder myViewHolder; try { myViewHolder = MyViewHolder.newInstance(parent); } finally { // In try and catch statements, always call "endSection()" in a // "finally" block. That way, the method is invoked even when an // exception occurs. Trace.endSection(); } return myViewHolder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { Trace.beginSection("MyAdapter.onBindViewHolder"); try { try { Trace.beginSection("MyAdapter.queryDatabase"); RowItem rowItem = queryDatabase(position); dataset.add(rowItem); } finally { Trace.endSection(); } holder.bind(dataset.get(position)); } finally { Trace.endSection(); } } }
还有一个适用于自定义跟踪事件的 NDK API。如需详细了解如何使用该 API 来处理原生代码,请参阅原生代码中的自定义跟踪事件文档。