定义自定义事件

系统跟踪仅在系统级别显示进程的相关信息,因此有时很难知道应用或游戏的哪些方法是在给定时间针对系统事件执行的。

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 用于原生代码,请参阅原生代码中的自定义跟踪事件