系統追蹤只會顯示系統層級程序的相關資訊,因此有時很難瞭解在特定時間執行的系統事件相關應用程式或遊戲方法為何。
Jetpack 提供的追蹤 API,可用於為特定程式碼區段加上標籤。然後此資訊會在裝置中擷取的追蹤記錄內回報。Macrobenchmark 會透過自訂追蹤點自動擷取追蹤記錄。
使用 systrace 指令列工具擷取追蹤記錄時,必須使用 -a
選項;如果沒有這個選項,應用程式的方法就不會在系統追蹤記錄報表中顯示。
Kotlin
如要在程式碼中建立自訂追蹤事件,請使用 tracing-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()
,然後透過另一個執行緒結束,您必須在相同的執行緒上呼叫這兩種方法。
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,請參閱「原生程式碼中的自訂追蹤記錄事件」說明文件。