Cómo definir eventos personalizados

El registro del sistema muestra información sobre los procesos solo a nivel del sistema; por lo tanto, algunas veces resulta difícil saber cuáles de los métodos de tu app o juego estaban en ejecución en un momento determinado respecto de los eventos del sistema.

Jetpack proporciona una API de registro que puedes usar para etiquetar una sección de código específica. Luego, esa información se informa en los registros capturados en el dispositivo. Las macrocomparativas capturan registros con puntos personalizados automáticamente.

Cuando se usa la herramienta de línea de comandos systrace para capturar registros, se requiere la opción -a; sin esta, los métodos de la app no aparecerán en un informe de registro del sistema.

Kotlin

Para crear eventos de registro personalizados en tu código, usa la biblioteca trace-ktx. En particular, la función de registro de nivel superior controla la lógica de inicio y la de finalización automáticamente. Puedes ver esta información en el siguiente fragmento de código.
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

Para crear eventos de registro personalizados en tu código, usa la clase Trace de la biblioteca de Jetpack tracing, como se muestra en el siguiente fragmento de código.

Nota: Cuando llamas a beginSection() varias veces, la llamada a endSection() solo finaliza el método beginSection() al que se llamó más recientemente. Por lo tanto, para las llamadas anidadas, como las del siguiente fragmento, asegúrate de que cada llamada a beginSection() coincida con una llamada a endSection().

Además, no puedes llamar a beginSection() en un subproceso y finalizarla desde otro subproceso. Debes llamar a ambos métodos en la misma conversación.

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();
        }
    }
}

También existe una API de NDK para los eventos de registro personalizados. Puedes obtener más información sobre el uso de esa API para el código nativo en la documentación Eventos de registro personalizados en código nativo.