Jetpack Compose accélère le développement de l'interface utilisateur et améliore la productivité des ingénieurs Android. Cependant, l'ajout d'un nouvel outil à un projet demande réflexion, car il peut avoir une incidence sur l'APK et sur les performances de compilation et d'exécution.
Taille de l'APK et durées de la compilation
Dans cette section, nous comparons l'impact de deux applications distinctes lors de l'ajout ou de la migration vers Jetpack Compose :
- Migration complète de Tivi vers Compose, et suppression des bibliothèques AppCompat et Material Design.
- Sunflower (branche
compose_recyclerview
) n'ajoute Compose que pour les éléments d'un objetRecyclerView
. Toutes les autres dépendances sont identiques.
Taille de l'APK
L'ajout de bibliothèques à votre projet affecte la taille de l'APK. Voyons l'impact de Compose sur la taille des projets mentionnés ci-dessus. Les résultats suivants portent sur l'APK en version réduite de chaque projet dans les conditions suivantes : la réduction des ressources et du code est activée, le mode complet de R8 est utilisé et les mesures sont effectuées à l'aide de l'analyseur d'APK.
Nous avons observé une réduction de 46 % de la taille de l'APK pour Tivi, qui passe de 4,49 Mo à 2,39 Mo. Le nombre de méthodes a également diminué de 17 % après la migration complète vers Compose. La quantité de lignes de code XML a été réduite de 76 %.
La taille de l'APK de Sunflower a augmenté de 575 Ko, passant de 2 407 Ko à 2 982 Ko lors de l'ajout de Compose. Comme Compose est à peine utilisé dans cette branche Sunflower, le projet ne bénéficie pas des avantages liés à la taille de l'APK exclusifs à Compose, comme la suppression de la dépendance AppCompat du projet.
Durée de la compilation
En utilisant les mêmes projets, mesurons l'impact de Compose sur les performances de compilation.
Cela tient compte des durées de compilation pour le débogage, particulièrement importantes lors du développement.
La durée de compilation moyenne de Tivi avant la migration vers Compose était de 108,71 secondes. Après la migration complète vers Compose, la durée de compilation moyenne est passée à 76,96 secondes. Diminution de 29 % de la durée de compilation La suppression de la liaison de données et d'Epoxy du projet, qui utilisent les processeurs d'annotations kapt, ainsi que la rapidité supérieure de Hilt dans AGP 7.0 ont grandement influencé la réduction de ce délai.
Sunflower a toutefois enregistré une augmentation de 7,6 % de sa durée médiane de compilation (de 11,57 secondes à 12,45 secondes).
Conclusion
Lorsque vous commencez à utiliser Compose dans votre application, vous pouvez observer une augmentation de la taille de l'APK et un allongement de la durée de compilation, qui diminue et dépasse la métrique d'origine une fois la migration du projet vers Compose terminée.
Performances d'exécution
Cette section aborde des sujets liés aux performances d'exécution dans Jetpack Compose, pour vous aider à comparer ses performances à celles du système View et à les mesurer.
Recompositions intelligentes
Lorsque certaines parties de l'interface utilisateur ne sont non valides, Compose s'efforce de recomposer uniquement les portions à mettre à jour. Pour en savoir plus, consultez le guide intitulé "Cycle de vie des composables".
Comparaison avec le système View
En raison de sa conception et des enseignements tirés du système View, Jetpack Compose vous offre de meilleures performances.
Tout étend la vue
Chaque View
qui s'affiche à l'écran, comme TextView
, Button
ou ImageView
, nécessite l'allocation de mémoire, un suivi d'état explicite et plusieurs rappels pour couvrir tous les cas d'utilisation. De plus, le propriétaire View
personnalisé doit implémenter une logique explicite pour empêcher la redéfinition lorsqu'elle n'est pas nécessaire, par exemple pour le traitement répétitif des données.
Jetpack Compose résout ce problème de différentes manières. Compose ne comporte pas d'objets explicites pouvant être mis à jour pour l'affichage des vues. Les éléments d'UI sont des fonctions modulables simples dont les informations sont écrites dans la composition de manière rejouable.
Cela permet de réduire le suivi de l'état explicite, les allocations de mémoire et les rappels pour les composables qui nécessitent les mêmes caractéristiques. Il n'est donc pas nécessaire de les demander avec toutes les extensions d'un type View
donné.
De plus, Compose propose des recompositions intelligentes prêtes à l'emploi, qui relancent le résultat déjà tracé si aucune modification n'est nécessaire.
Plusieurs passes de mise en page
Les ViewGroups traditionnels ont une forte expressivité dans leurs API de mesure et de mise en page, ce qui permet de générer facilement plusieurs passes de mise en page. Ces différentes passes de mise à page peuvent demander beaucoup de travail si elles sont effectuées à des points imbriqués spécifiques dans la hiérarchie des vues.
Jetpack Compose applique une seule passe de mise en page pour tous les composables de mise en page via son contrat d'API. Compose peut ainsi gérer efficacement les arborescences profondes. Si plusieurs mesures sont nécessaires, Compose dispose d'un système spécifique, les mesures intrinsèques.
Afficher les performances de démarrage
Le système View doit gonfler les mises en page XML lorsqu'une mise en page spécifique s'affiche pour la première fois. Ce coût est enregistré dans Jetpack Compose, car les mises en page sont écrites en Kotlin et compilées comme le reste de votre application.
Analyse comparative de Compose
Dans Jetpack Compose 1.0, les performances d'une application entre les modes debug
et release
présentent des différences importantes. Pour obtenir des délais représentatifs, utilisez toujours la compilation release
au lieu de debug
lors du profilage de votre application.
Pour vérifier les performances de votre code Jetpack Compose, vous pouvez utiliser la bibliothèque Jetpack Macrobenchmark. Consultez le projet MacrobenchmarkSample pour découvrir comment l'utiliser avec Jetpack Compose. L'équipe Jetpack Compose l'utilise également pour détecter les régressions potentielles. Reportez-vous à cette analyse comparative de la colonne différée et à son tableau de bord pour suivre les régressions.
Installation de profil dans Compose
Étant donné que Jetpack Compose est une bibliothèque sans catégorie, Zygote n'est pas disponible pour précharger les classes et les drawables de l'UI du système View. Jetpack Compose 1.0 utilise l'installation de profil pour les builds de publication. Les programmes d'installation de profil permettent aux applications de spécifier le code essentiel à compiler de manière anticipée lors de l'installation.- Compose intègre des règles d'installation de profil qui réduisent la durée de démarrage et les à-coups dans les applications Compose.