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

Para generar un seguimiento de métodos 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 la herramienta CPU Profiler de Android Studio.

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

Antes de comenzar a generar registros de seguimiento, asegúrate de que tu app tenga permisos de escritura en medios de almacenamiento externo (WRITE_EXTERNAL_STORAGE) para que pueda guardar los registros de seguimiento en el dispositivo.

Cómo instrumentar tu app

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

En la llamada, puedes especificar el nombre del 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 muestra getExternalFilesDir() y se encuentra en el directorio ~/sdcard/ de la mayoría de los dispositivos. 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 a stopMethodTracing().

En el siguiente ejemplo, se inicia y se 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, reemplazará 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 a stopMethodTracing(), detendrá el seguimiento y enviará 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 activada. 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 lugar de startMethodTracing()) con un intervalo de muestreo especificado. El sistema reúne ejemplos 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 la hora actuales al nombrar 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 los 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 archivos de dispositivos. Para abrir el explorador de archivos de dispositivos, haz clic en View > Tool Windows > Device File Explorer (o en el botón Device File Explorer que se encuentra en la barra de la ventana de herramientas). Como se muestra en la figura 1, puedes encontrar los archivos .trace navegando al directorio específico del paquete de tu app.

    Figura 1: Cómo encontrar los registros de seguimiento usando el explorador de archivos 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 CPU Profiler.