系統追蹤只會顯示系統層級程序的相關資訊,因此有時很難知道在系統事件相關的特定時間,執行的是哪個應用程式或遊戲的方法。
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,請參閱「原生程式碼中的自訂追蹤記錄事件」。