Jetpack Compose : La mise à jour de Décembre ’25 Débarque avec des Performances Turbo et des Fonctionnalités Inédites !

Jetpack Compose : La mise à jour de Décembre '25 Débarque avec des Performances Turbo et des Fonctionnalités Inédites !

La communauté Android est en ébullition ! Jetpack Compose, le framework UI déclaratif de Google, vient de déployer sa très attendue version stable de Décembre ’25. Annoncée par Nick Butcher, Chef de Produit Jetpack Compose, cette mouture majeure promet de propulser vos applications Android vers de nouveaux sommets de fluidité et d’efficacité, tout en enrichissant l’arsenal des développeurs.

De Nick Butcher, Chef de Produit Jetpack Compose



La version Décembre ’25 de Jetpack Compose est enfin stable ! Elle intègre les modules de base de Compose en version 1.10 et Material 3 en version 1.4 (consultez le mapping complet du BOM), apportant son lot de nouvelles fonctionnalités et, surtout, des améliorations de performances majeures. Pour en profiter, mettez simplement à jour votre version du BOM Compose à 2025.12.00 :


implementation(platform(« androidx.compose:compose-bom:2025.12.00 »))

Des Performances à Couper le Souffle

Nous savons que la performance d’exécution de votre application est cruciale, tant pour vous que pour vos utilisateurs. C’est pourquoi l’équipe Compose a fait de la performance une priorité absolue. Cette version apporte une série d’optimisations significatives, toutes disponibles simplement en mettant à jour ! Nos benchmarks internes révèlent que Compose égale désormais les performances que vous obtiendriez avec les « Views » traditionnelles en termes de défilement.

Benchmark de performance de défilement comparant les « Views » et Jetpack Compose sur différentes versions de Compose.


Composition Interruptible et Préchargement Paresseux : Fini les Saccades !

La composition interruptible dans le préchargement paresseux est désormais activée par défaut. C’est une refonte fondamentale de la manière dont le runtime Compose gère les tâches, conçue pour réduire drastiquement les saccades (« jank ») lors de charges UI intenses. Auparavant, une composition complexe pouvait bloquer le thread principal, gelant l’interface. Désormais, le runtime peut « pauser » son travail s’il manque de temps et le reprendre à la frame suivante, assurant une fluidité impeccable. Les API CacheWindow des layouts paresseux introduites dans Compose 1.9 sont un excellent moyen de précharger plus de contenu et de bénéficier de cette nouvelle capacité.


La composition interruptible combinée au préchargement paresseux aide à réduire les saccades.


D’autres optimisations ont été réalisées, notamment pour Modifier.onPlaced et Modifier.onVisibilityChanged. Google promet de continuer à investir dans l’amélioration des performances de Compose.


Nouvelles Fonctionnalités : État, UI et Interactivité Réinventés

Gérer l’État avec ‘retain’ : Le Pont Manquant

Compose propose déjà remember (pour la persistance à travers les compositions) et rememberSavable/rememberSerializable (pour la persistance après la recréation d’activité ou de processus). La nouvelle API retain se positionne entre ces deux, permettant de persister des valeurs lors des changements de configuration sans sérialisation, mais pas après la mort du processus. Cela signifie que vous pouvez conserver des objets non sérialisables comme les lambdas, les flux de données (flows) ou des bitmaps volumineux. Idéal pour gérer un lecteur multimédia comme ExoPlayer, évitant toute interruption lors d’une rotation d’écran !


@Composable

fun MediaPlayer() {

    val applicationContext = LocalContext.current.applicationContext

    val exoPlayer = retain { ExoPlayer.Builder(applicationContext).apply { … }.build() }

    …

}

Un grand merci à la communauté AndroidDev, et en particulier à l’équipe Circuit, pour leur influence et leur contribution à la conception de cette fonctionnalité !

Material 1.4 : Plus de Composants, Plus de Contrôle

La version 1.4.0 de la bibliothèque material3 ajoute son lot de nouveautés :

Un carrousel héroïque centré horizontalement.


N’oubliez pas que les API Material 3 Expressive continuent d’être développées dans les versions alpha de la bibliothèque material3. Un récent talk est disponible pour en savoir plus.

De Nouvelles Animations qui Changent la Donne

Google ne cesse d’enrichir ses API d’animation, avec des mises à jour pour la personnalisation des animations d’éléments partagés.


Éléments Partagés Dynamiques : Plus de Contrôle sur vos Transitions

Par défaut, les animations sharedElement() et sharedBounds() animent les changements de layout dès qu’une clé correspondante est trouvée. Désormais, vous pouvez désactiver ces animations dynamiquement en fonction de la direction de navigation ou de l’état actuel de l’UI. La propriété isEnabled de la SharedContentConfig passée à rememberSharedContentState() vous donne ce contrôle précis.


SharedTransitionLayout {

        val transition = updateTransition(currentState)

        transition.AnimatedContent { targetState ->

            // Create the configuration that depends on state changing.

            fun animationConfig() : SharedTransitionScope.SharedContentConfig {

                return object : SharedTransitionScope.SharedContentConfig {

                    override val SharedTransitionScope.SharedContentState.isEnabled: Boolean

                        get() =

                            // determine whether to perform a shared element transition

                }

            }

}

Pour plus de détails, consultez la documentation.

Modifier.skipToLookaheadPosition() : Des Révélations Spectaculaires

Un nouveau modificateur, Modifier.skipToLookaheadPosition(), fait son apparition. Il permet de conserver la position finale d’un composable lors des animations d’éléments partagés, ouvrant la porte à des transitions de type « révélation », comme le montre l’exemple Androidify avec la révélation progressive de la caméra. Un tutoriel vidéo est disponible pour plus d’informations.




Vitesse Initiale dans les Transitions d’Éléments Partagés : Le Geste Maîtrisé

Cette version introduit une nouvelle API de transition d’éléments partagés, prepareTransitionWithInitialVelocity. Elle vous permet de transmettre une vélocité initiale (par exemple, issue d’un geste de l’utilisateur) à une transition d’éléments partagés, pour des animations plus naturelles et réactives.


Modifier.fillMaxSize()

    .draggable2D(

        rememberDraggable2DState { offset += it },

        onDragStopped = { velocity ->

            // Set up the initial velocity for the upcoming shared element

            // transition.

            sharedContentStateForDraggableCat

                ?.prepareTransitionWithInitialVelocity(velocity)

            showDetails = false

        }

    )

Une transition d’élément partagé qui démarre avec une vélocité initiale issue d’un geste.

Transitions Voilées : L’Art de l’Apparition/Disparition

EnterTransition et ExitTransition définissent comment un composable AnimatedVisibility/AnimatedContent apparaît ou disparaît. Une nouvelle option expérimentale, veil, permet de spécifier une couleur pour voiler ou obscurcir le contenu, par exemple en estompant une couche noire semi-opaque sur l’interface lors d’une transition.


Contenu animé voilé – notez le voile semi-opaque sur le contenu de la grille pendant l’animation.


AnimatedContent(

    targetState = page,

    modifier = Modifier.fillMaxSize().weight(1f),

    transitionSpec = {

        if (targetState > initialState) {

            (slideInHorizontally { it } togetherWith

                    slideOutHorizontally { -it / 2 } + veilOut(targetColor = veilColor))

        } else {

            slideInHorizontally { -it / 2 } +

                    unveilIn(initialColor = veilColor) togetherWith slideOutHorizontally { it }

        }

    },

) { targetPage ->

    …

}

Changements à Venir : Préparons le Futur

Dépréciation de Modifier.onFirstVisible : Une Meilleure Dépendance

Compose 1.9 a introduit Modifier.onVisibilityChanged et Modifier.onFirstVisible. Cependant, après de nombreux retours, il est apparu que le contrat de Modifier.onFirstVisible ne pouvait être respecté de manière déterministe (par exemple, un élément recomposé après être sorti du viewport déclenchait à nouveau le callback). En conséquence, ce modificateur sera déprécié dans la prochaine version (1.11), et nous recommandons de migrer vers onVisibilityChanged. Pour plus d’informations, consultez la documentation.


Distribution des Coroutines dans les Tests : Vers une Plus Grande Fiabilité

Google prévoit de modifier la distribution des coroutines dans les tests pour améliorer leur fiabilité et détecter plus de problèmes. Actuellement, les tests utilisent UnconfinedTestDispatcher, ce qui diffère du comportement de production (les effets pouvant s’exécuter immédiatement). Une future version introduira une nouvelle API utilisant StandardTestDispatcher par défaut, pour mieux correspondre aux comportements de production. Vous pouvez d’ores et déjà essayer ce nouveau comportement avec la version 1.10 :


@get:Rule // also createAndroidComposeRule, createEmptyComposeRule

val rule = createComposeRule(effectContext = StandardTestDispatcher())

L’utilisation de StandardTestDispatcher mettra les tâches en file d’attente, nécessitant l’utilisation de mécanismes de synchronisation comme composeTestRule.waitForIdle() ou composeTestRule.runOnIdle(). Si votre test utilise runTest, assurez-vous de partager la même instance de StandardTestDispatcher pour la synchronisation.


// 1. Create a SINGLE dispatcher instance

val testDispatcher = StandardTestDispatcher()


// 2. Pass it to your Compose rule

@get:Rule

val composeRule = createComposeRule(effectContext = testDispatcher)


@Test

// 3. Pass the *SAME INSTANCE* to runTest

fun myTest() = runTest(testDispatcher) {

    composeRule.setContent { /* … */ }

}


Outils : Le Studio Android se Surpasse pour Compose

De grandes API méritent de grands outils, et Android Studio a récemment reçu plusieurs ajouts majeurs pour les développeurs Compose :

  • Transformer l’UI : Itérez sur vos designs en faisant un clic droit sur le @Preview, sélectionnant « Transformer l’UI », et décrivant le changement en langage naturel.

  • Générer un @Preview : Clic droit sur un composable et sélectionnez Gemini > Générer un aperçu de [Nom du composable].




Pour voir ces outils en action, regardez cette récente démonstration.


Bon Composing !

Google continue d’investir massivement dans Jetpack Compose pour fournir les API et les outils nécessaires à la création d’interfaces utilisateur élégantes et performantes. Votre avis est précieux ! N’hésitez pas à partager vos commentaires sur ces changements ou vos attentes pour l’avenir de Compose via leur système de suivi des bugs.

Mots-clés : Jetpack Compose, Android, Développement Mobile, Performances, Material Design, Animations

Source : Article original

Retour en haut