カスタム イベントを定義する

システム トレースでは、システムレベルでのみプロセスに関する情報が表示されるため、アプリまたはゲームのどのメソッドが、ある時点でシステム イベント対して実行されていたかを特定するのが困難な場合があります。

Jetpack には、コードの特定のセクションにラベルを付けるために使用できるトレース API が用意されています。この情報は、その後、デバイスでキャプチャされたトレースで報告されます。Macrobenchmark は、カスタム トレース ポイントを使用してトレースを自動的にキャプチャします。

systrace コマンドライン ツールを使用してトレースをキャプチャする場合は、-a オプションが必要です。このオプションを使用しない場合、アプリのメソッドはシステム トレース レポートに表示されません。

Kotlin

コードを使用してカスタム トレース イベントを作成するには、trace-ktx ライブラリを使用します。 特に、トップレベルのトレース関数は開始ロジックと終了ロジックを自動的に処理します。これは、次のコード スニペットで確認できます。
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() を呼び出して、別のスレッドから終了することはできません。1 つのスレッド内で両方のメソッドを呼び出す必要があります。

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 を使用する方法について詳しくは、ネイティブ コードのカスタム トレース イベントのドキュメントをご覧ください。