Ergonomía de los desarrolladores en Compose

Jetpack Compose acelera el desarrollo de IU y aumenta la productividad de los ingenieros de Android. Sin embargo, agregar una herramienta nueva a un proyecto requiere cierta consideración, ya que puede afectar al APK, así como la compilación y el rendimiento del tiempo de ejecución.

Tamaño del APK y tiempos de compilación

En esta sección, comparamos cómo se vieron afectadas dos apps diferentes después de agregar Jetpack Compose o migrar a él:

  • Tivi migró por completo a Compose, por lo que se quitaron las bibliotecas de componentes de AppCompat y Material Design.
  • Sunflower (rama de compose_recyclerview) agregó Compose solo para ser usado con elementos de RecyclerView. Las demás dependencias son las mismas.

Tamaño del APK

La adición de bibliotecas a tu proyecto afecta el tamaño del APK. Veamos cómo Compose afectó el tamaño de los proyectos mencionados anteriormente. Los siguientes resultados son de la versión reducida del APK de cada proyecto con la opción de reducción de recursos y código habilitada. Además, se usó el modo completo de R8 y se realizaron las mediciones con el Analizador de APK.

Tivi observó una reducción del 46% en el tamaño del APK, de 4.49 MB a 2.39 MB. También vio una reducción del 17% en la cantidad de métodos tras migrar a Compose. Las líneas de código XML disminuyeron un 76%.

El tamaño del APK de Sunflower aumentó 575 KB cuando se agregó Compose al proyecto, pasó de 2,407 KB a 2,982 KB. Dado que Compose se usa muy poco en esa rama de Sunflower, el proyecto no obtiene los beneficios del tamaño del APK exclusivo de Compose, como la eliminación de la dependencia de AppCompat del proyecto.

Tiempo de compilación

Con los mismos proyectos, midamos cómo Compose afecta el rendimiento de compilación.

Se tienen en cuenta los tiempos de compilación de depuración, que son una parte crucial del desarrollo.

Antes de la migración a Compose, el tiempo de compilación promedio de Tivi era de 108.71 segundos. Después de migrar completamente a Compose, disminuyó a 76.96 segundos, que representa una disminución del 29% en el tiempo de compilación. Esta reducción de tiempo se logró en gran medida debido a la posibilidad de quitar la vinculación de datos y Epoxy del proyecto, que usan procesadores de anotaciones Kapt, y al aumento de velocidad de Hilt en AGP 7.0.

Sin embargo, Sunflower experimentó un incremento del 7.6% en el tiempo de compilación promedio, de 11.57 segundos a 12.45 segundos.

Conclusiones

Cuando comiences a implementar Compose en tu app, verás un incremento en el tamaño del APK y el tiempo de compilación, que disminuirá y superará la métrica original una vez que se complete la migración a Compose.

Rendimiento del tiempo de ejecución

En esta sección, se cubren temas relacionados con el rendimiento del tiempo de ejecución en Jetpack Compose a fin de que puedas observar la diferencia en el rendimiento entre Jetpack Compose y el sistema de View, y cómo puedes medirlo.

Recomposiciones inteligentes

Cuando algunas partes de la IU no son válidas, Compose hace todo lo posible por reescribir las partes que deben actualizarse. Obtén más información sobre este tema en la guía del Ciclo de vida de los elementos componibles.

Comparación con el sistema de View

Debido a su diseño y según lo que aprendimos del sistema de View, Jetpack Compose lo supera en rendimiento.

Todo supera a View

Cada View que se muestra en la pantalla, como TextView, Button o ImageView, requiere asignaciones de memoria, seguimiento de estado explícito y varias devoluciones de llamada para admitir todos los casos de uso. Además, el propietario de la View personalizada debe implementar una lógica explícita a fin de evitar el rediseño innecesario, como en el procesamiento repetitivo de datos.

Jetpack Compose lo soluciona de varias maneras. Compose no tiene objetos que se puedan actualizar de forma explícita para dibujar vistas. Los elementos de la IU son funciones simples que admiten composición cuya información se escribe en la composición de manera reproducible. Esto limita el seguimiento de estado explícito, las asignaciones de memoria y las devoluciones de llamada únicamente a elementos componibles que requieren esas funciones, en lugar de usarlos para todas las extensiones de un tipo de View determinado.

Además, Compose ofrece recomposiciones inteligentes listas para usar y reproduce el resultado obtenido anteriormente si no se requieren cambios.

Múltiples pases de diseño

Los ViewGroups tradicionales tienen mucha expresividad en sus API de medición y diseño, lo cual hace que sea más fácil generar varios pases de diseño. Realizar varios pases de diseño puede agregar más trabajo si se realizan en ciertos puntos anidados de la jerarquía de vistas.

Jetpack Compose realiza un solo pase de diseño para todos los elementos componibles de diseño a través del contrato de la API. Esto permite que Compose procese de manera eficiente los árboles detallados de la IU. En caso de que se necesiten varias mediciones, Compose tiene un sistema especial, las medidas intrínsecas.

El rendimiento del inicio de View

El sistema de View debe aumentar los diseños XML cuando muestra un diseño en particular por primera vez. Con Jetpack Compose, te ahorras este paso, dado que los diseños están escritos en Kotlin y se compilan como el resto de tu app.

Comparativas de Compose

En Jetpack Compose 1.0, existen diferencias notables entre el rendimiento de una app en los modos debug y release. Para los tiempos representativos, siempre usa la compilación de release en lugar de debug cuando generes perfiles de tu app.

Para verificar el rendimiento del código de Jetpack Compose, puedes usar la biblioteca de Jetpack Macrobenchmark (consulta cómo usar el proyecto MacrobenchmarkSample con Jetpack Compose). El equipo de Jetpack Compose también la usa para detectar regresiones que puedan producirse. Por ejemplo, consulta esta comparativa de columnas diferidas y su panel para realizar un seguimiento de las regresiones.

Instalación de perfiles de Compose

Debido a que Jetpack Compose es una biblioteca sin empaquetar, no se beneficia de Zygote, que precarga las clases y los elementos de diseño que pertenecen al kit de herramientas de la IU del sistema de View. Jetpack Compose 1.0 usa la instalación de perfiles para compilaciones de lanzamiento. Los instaladores de perfiles permiten que las apps especifiquen código fundamental que compilará AOT durante la instalación. Compose envía las reglas de instalación del perfil que reducen los tiempos de inicio y los bloqueos en las apps de Compose.