定義自訂事件

系統追蹤只會顯示系統層級程序的相關資訊,因此有時很難知道在系統事件相關的特定時間,執行的是哪個應用程式或遊戲的方法。

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 用於原生程式碼,請參閱「原生程式碼中的自訂追蹤事件」。