Cómo generar registros de seguimiento mediante la instrumentación de tu app

Para generar un seguimiento de método de la ejecución de tu app, puedes instrumentarla usando la clase Debug. Si instrumentas tu app de esa manera, tendrás más control sobre el momento exacto en el que el dispositivo inicia y finaliza el registro de la información de seguimiento. El dispositivo también guardará tus registros de seguimiento con los nombres que especifiques, por lo que podrás identificar fácilmente cada registro más adelante. Luego, podrás ver cada registro usando el Generador de perfiles de CPU de Android Studio.

También puedes iniciar y detener el seguimiento en el Generador de perfiles de CPU sin tener que instrumentar el código de tu app.

Antes de comenzar a generar registros de seguimiento, asegúrate de que tu app haya agregado lógica para guardar los registros de seguimiento en el directorio específico de la app.

Cómo instrumentar tu app

Para crear registros de seguimiento, llama al método startMethodTracing() donde desees que el sistema comience a registrar datos de seguimiento.

En la llamada, puedes especificar el nombre para el archivo .trace; el sistema lo guardará en un directorio específico del paquete destinado a datos persistentes de la app en el dispositivo de destino. Este es el mismo directorio que devuelve getExternalFilesDir() y, en la mayoría de los dispositivos, se encuentra en el directorio ~/sdcard/. Este archivo contiene los datos binarios del seguimiento de métodos y una tabla de asignación con nombres de métodos y subprocesos. Para detener el seguimiento, llama al método stopMethodTracing().

En el siguiente ejemplo, se inicia y detiene la grabación del registro de seguimiento con el nombre sample.trace:

Kotlin

// Starts recording a trace log with the name you provide. For example, the
// following code tells the system to start recording a .trace file to the
// device with the name "sample.trace".
Debug.startMethodTracing("sample")

// The system begins buffering the generated trace data, until your
// application calls <code><a href="/reference/android/os/Debug.html#stopMethodTracing()">stopMethodTracing()</a></code>, at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing()

Java

// Starts recording a trace log with the name you provide. For example, the
// following code tells the system to start recording a .trace file to the
// device with the name "sample.trace".
Debug.startMethodTracing("sample");
...
// The system begins buffering the generated trace data, until your
// application calls <code><a href="/reference/android/os/Debug.html#stopMethodTracing()">stopMethodTracing()</a></code>, at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing();

Ten en cuenta que si tu app llama nuevamente a startMethodTracing(), sin cambiar el nombre del registro de seguimiento, se reemplaza el registro existente guardado en el dispositivo. Para descubrir cómo cambiar de forma dinámica el nombre de cada registro de seguimiento, visita la sección sobre cómo guardar varios registros.

Si el sistema alcanza el tamaño de búfer máximo antes de que llames al método stopMethodTracing(), se detiene el seguimiento y se envía una notificación a la consola. Los métodos que inician y detienen los seguimientos funcionan durante todo el proceso de tu app. Es decir, puedes llamar a startMethodTracing() en el método onCreate(Bundle) de tu actividad y a stopMethodTracing() en el método onDestroy() de esa actividad.

Ten en cuenta que tu app se ejecuta con mayor lentitud cuando la generación de perfiles se encuentra habilitada. Es decir, no debes usar los datos de generación de perfiles para determinar sincronizaciones absolutas (por ejemplo, "el método foo() tarda 2.5 segundos en ejecutarse"). La información de sincronización de los registros de seguimiento es útil solo cuando se compara con datos de registros de seguimiento anteriores; esto te permite ver si los cambios recientes ralentizan o agilizan tu app.

Cuando realices implementaciones en dispositivos con Android 5.0 (nivel de API 21) o versiones posteriores, podrás usar la generación de perfiles basada en muestras para generar perfiles que tengan un menor impacto en el rendimiento durante el tiempo de ejecución. Para habilitar la generación de perfiles basada en muestras, llama a startMethodTracingSampling() (en vez de llamar a startMethodTracing()) con un intervalo de muestreo especificado. El sistema reúne muestras de forma periódica hasta que tu app llama a stopMethodTracing().

Cómo guardar varios registros

Si tu app inicia y detiene un seguimiento de métodos varias veces sin especificar un nuevo nombre para el registro de seguimiento, el dispositivo reemplazará el registro de seguimiento más antiguo por el nuevo; es decir, solo conservará el más reciente. Para guardar varios registros de seguimiento en tu dispositivo, cambia el nombre de los registros de seguimiento de forma dinámica cada vez que tu app llame a startMethodTracing(). En el siguiente ejemplo, se usa la clase SimpleDateFormat para incluir la fecha y hora actuales al nombrar a cada registro de seguimiento:

Kotlin

// Uses the <code><a href="/reference/java/text/SimpleDateFormat.html">SimpleDateFormat</a></code> class to create a String with
// the current date and time.
val dateFormat: DateFormat = SimpleDateFormat("dd_MM_yyyy_hh_mm_ss", Locale.getDefault())
val logDate: String = dateFormat.format(Date())
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing("sample-$logDate")

Java

// Uses the <code><a href="/reference/java/text/SimpleDateFormat.html">SimpleDateFormat</a></code> class to create a String with
// the current date and time.
SimpleDateFormat dateFormat =
        new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss", Locale.getDefault());
String logDate = dateFormat.format(new Date());
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing(
        "sample-" + logDate);

Cómo acceder a registros de seguimiento en el dispositivo

Luego de que el sistema cree un registro de seguimiento en tu dispositivo, podrás acceder al archivo de una de las siguientes maneras:

  • Usa el explorador de dispositivos. Para abrir el explorador de dispositivos, haz clic en View > Tool Windows > Device Explorer (o haz clic en el botón Device Explorer en la barra de ventanas de herramientas). Como se muestra en la figura 1, puedes encontrar los archivos .trace si navegas al directorio específico del paquete de tu app.

    Figura 1: Cómo encontrar los registros de seguimiento usando el explorador de dispositivos

  • Copia el archivo a tu máquina local usando el comando adb pull. El siguiente comando copia un registro de seguimiento con el nombre sample.trace del dispositivo al directorio ~/Documents/trace-logs/ de tu máquina local.

    adb pull path-on-device/sample.trace ~/Documents/trace-logs/

Luego, podrás importar el archivo de seguimiento con el Generador de perfiles de CPU.