Le traçage système ne fournit des informations sur les processus qu'au niveau du système. Il est donc parfois difficile de savoir quelles méthodes de votre application ou de votre jeu s'exécutaient à un moment donné par rapport aux événements système.
Jetpack fournit une API de traçage que vous pouvez utiliser pour étiqueter une section de code particulière. Ces informations sont ensuite consignées dans les traces capturées sur l'appareil. Macrobenchmark capture automatiquement les traces avec des points de trace personnalisés.
Lorsque vous capturez des traces à l'aide de l'outil de ligne de commande Systrace, l'option -a
est obligatoire. Sans cette option, les méthodes de votre application n'apparaîtront pas dans un rapport de traçage système.
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
Trace
de la bibliothèque de traçage Jetpack, comme indiqué dans l'extrait de code suivant.
Remarque : Lorsque vous appelez beginSection()
plusieurs fois, l'appel de endSection()
ne met fin qu'à la méthode beginSection()
la plus récente. Ainsi, pour les appels imbriqués tels que ceux mentionnés dans l'extrait de code suivant, assurez-vous de faire correspondre chaque appel à beginSection()
avec un appel à endSection()
.
De plus, vous ne pouvez pas appeler beginSection()
sur un thread et le terminer à partir d'un autre thread. Vous devez appeler les deux méthodes sur le même thread.
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(); } } }
Il existe également une API NDK pour les événements de trace personnalisés. Pour en savoir plus sur l'utilisation de cette API pour votre code natif, consultez la documentation Événements de trace personnalisés dans le code natif.