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:
Abre el generador de perfiles:
Haz clic en CPU timeline.
Navega por la app hasta la IU a la que deseas hacer un seguimiento y, luego, selecciona System Trace y Record.
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.
Si haces doble clic en un elemento componible en el gráfico, accederás a su código fuente.
También puedes ver elementos componibles en el gráfico tipo llama junto con el archivo y el número de línea:
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
- Genera un comando de registro mediante Perfetto.
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
- Inicia la app y prepara la sección de la que quieras crear un registro.
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
Inicia el comando de grabación que creaste anteriormente.
Cómo abrir el registro
adb pull <location>
es el registro del dispositivo (ubicación especificada en el comando record).Á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:
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")
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.