Seguimiento de composiciones

A menudo, los seguimientos son la mejor fuente de información cuando se analiza un problema de rendimiento por primera vez. Te permiten formular una hipótesis del problema y de dónde comenzar a buscar.

Hay dos niveles de seguimiento compatibles con Android: registro del sistema y seguimiento de método.

Debido a que el registro del sistema solo hace un seguimiento de las áreas marcadas específicamente para el seguimiento, tiene una sobrecarga baja y no afecta en gran medida el rendimiento de tu app. El registro del sistema es ideal para ver cuánto tiempo tardan en ejecutarse secciones particulares de tu código.

El seguimiento de método realiza un seguimiento de cada llamada a función en tu app. Esto es muy costoso y, por lo tanto, afecta en gran medida el rendimiento de tu app, pero te brinda un panorama total de lo que sucede, a qué funciones se llama y con qué frecuencia.

De forma predeterminada, los registros del sistema no incluyen funciones de componibilidad individuales. Están disponibles en seguimientos de método.

En este momento, estamos probando una nueva funcionalidad de registro del sistema para mostrar funciones de componibilidad dentro de los registros del sistema. Te brinda la baja intrusión del registro del sistema, con niveles de detalle de seguimiento de método en la composición.

Cómo configurar el seguimiento de composición

Para probar el seguimiento de la recomposición en tu proyecto, debes actualizar a al menos las siguientes versiones:

  • Android Studio Flamingo
  • IU de Compose: 1.3.0
  • Compilador de Compose: 1.3.0

El dispositivo o emulador en el que ejecutas el seguimiento también debe estar en el nivel mínimo de API 30.

Además, debes agregar una nueva dependencia en el seguimiento del entorno de ejecución de Compose:

implementation("androidx.compose.runtime:runtime-tracing:1.7.5")

Si usas la BoM de Compose, no es necesario que especifiques la versión:

val composeBom = platform("androidx.compose:compose-bom:2024.10.01")
implementation(composeBom)
// ...

// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")

Con esta dependencia, cuando realices un seguimiento del sistema que incluya la recomposición, podrás ver automáticamente las funciones de componibilidad.

Cómo realizar un registro del sistema

Para realizar un registro del sistema y ver el nuevo seguimiento de la recomposición en acción, sigue estos pasos:

  1. Abre el generador de perfiles:

    Android Studio: Start Profiling
    Figura 2: Android Studio, Start Profiling
  2. Haz clic en CPU timeline.

    Android Studio Profiler: CPU timeline
    Figura 3: Android Studio Profiler: CPU timeline
  3. Navega por la app hasta la IU a la que deseas hacer un seguimiento y, luego, selecciona System Trace y Record.

    Opciones de seguimiento: System Trace
    Figura 4: Opciones de seguimiento: System Trace
  4. Usa tu app para generar la recomposición y detener la grabación. Una vez que el seguimiento se procesó y aparece, deberías poder ver los elementos componibles en el seguimiento de recomposición. Puedes usar el teclado y el mouse para hacer zoom y desplazarte por el seguimiento. Si no estás familiarizado con la navegación de un seguimiento, consulta la documentación Cómo realizar registros.

    Registro del sistema
    Figura 5: Registro del sistema

    Si haces doble clic en un elemento componible en el gráfico, accederás a su código fuente.

  5. También puedes ver elementos componibles en el gráfico tipo llama junto con el archivo y el número de línea:

    Gráfico tipo llama
    Figura 6: Gráfico tipo llama

Advertencias

Sobrecarga de tamaño de APK

Si bien buscamos minimizar la sobrecarga de la función tanto como sea posible, se produce un aumento del tamaño del APK para las apps de Compose que provienen de strings de seguimiento incorporadas en el APK por el compilador de Compose. Este aumento de tamaño puede ser relativamente pequeño si tu app no usa Compose o mucho más para apps completas de Compose. Además, estas cadenas de seguimiento no están ofuscadas, por lo que pueden aparecer en las herramientas de seguimiento, como se mostró antes. El compilador de Compose los inserta en todas las apps a partir de la versión 1.3.0.

Para quitar las strings de seguimiento en tu compilación de producción, agrega la siguiente regla de ProGuard:

-assumenosideeffects public class androidx.compose.runtime.ComposerKt {

   boolean isTraceInProgress();

   void traceEventStart(int,int,int,java.lang.String);

   void traceEventStart(int,java.lang.String);

   void traceEventEnd();

}

Es posible que estas funciones cambien en el futuro, pero se mencionarán en las notas de la versión de Compose.

Ten en cuenta que mantenerlas, mientras se incurren en costos de tamaño del APK, garantiza que el APK del perfil sea el mismo que ejecutan los usuarios de la app.

Tiempos precisos

Para generar perfiles precisos, al igual que con cualquier prueba de rendimiento, debes hacer que la app sea profileable y non-debuggable según las aplicaciones perfilables.

Cómo capturar un registro desde la terminal

Es posible capturar un registro de composición desde la terminal. Para ello, debes realizar los pasos que Android Studio suele hacer automáticamente.

Cómo agregar dependencias

Primero, agrega las dependencias adicionales a tu app.

implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")

Cómo generar un comando de registro

  1. Genera un comando de registro mediante Perfetto.
  2. Agrega manualmente la sección de la fuente de datos track_event como se muestra en el siguiente ejemplo:

    adb shell perfetto \
      -c - --txt \
      -o /data/misc/perfetto-traces/trace \
    <<EOF
    buffers: {
        size_kb: 63488
        fill_policy: RING_BUFFER
    }
    buffers: {
        size_kb: 2048
        fill_policy: RING_BUFFER
    }
    data_sources: {
        config {
            name: "track_event"
        }
    }
    duration_ms: 10000
    flush_period_ms: 30000
    incremental_state_config {
        clear_period_ms: 5000
    }
    EOF

Cómo capturar un registro

  1. Inicia la app y prepara la sección de la que quieras crear un registro.
  2. Habilita los registros en la app mediante una emisión.

    # set app package variable, e.g. com.google.samples.apps.nowinandroid.debug
    # can be found through `adb shell ps -ef` or `adb shell cmd package list packages`
    package=<your app process>
    
    # issue a broadcast to enable tracing
    adb shell am broadcast \
    -a androidx.tracing.perfetto.action.ENABLE_TRACING \
    $package/androidx.tracing.perfetto.TracingReceiver
    
  3. Inicia el comando de grabación que creaste anteriormente.

Cómo abrir el registro

  1. adb pull <location> es el registro del dispositivo (ubicación especificada en el comando record).

  2. Ábrelo en Perfetto.

Cómo capturar un registro con Jetpack Macrobenchmark

Puedes medir el rendimiento con Jetpack Macrobenchmark, que proporciona registros como resultados. Para habilitar el registro de composición con macrocomparativas, debes hacer lo siguiente:

  1. Agrega estas dependencias adicionales al módulo de prueba Macrobenchmark:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. Agrega el argumento de instrumentación androidx.benchmark.fullTracing.enable=true antes de ejecutar comparativas. Consulta Argumentos de instrumentación de Macrobenchmark para obtener más información sobre los argumentos de instrumentación de Macrobenchmark.

Comentarios

Nos encantaría recibir tus comentarios sobre esta función, cualquier error que encuentres en ella y cualquier solicitud que tengas. Puedes enviarnos comentarios a través de la Herramienta de seguimiento de errores.