Définir des événements personnalisés

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

Pour créer des événements de trace personnalisés dans votre code, utilisez la bibliothèque "tracing-ktx". La fonction de trace de premier niveau, en particulier, gère automatiquement la logique de début et de fin. Vous pouvez le voir dans l'extrait de code suivant.
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

Pour créer des événements de trace personnalisés dans votre code, utilisez la classe 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.