
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 :
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 :
-
Le composant TextField propose désormais une version expérimentale basée sur TextFieldState, offrant une méthode plus robuste pour la gestion de l’état du texte. De nouvelles variantes SecureTextField et OutlinedSecureTextField sont également disponibles. Enfin, le composable Text de Material prend désormais en charge le comportement autoSize.
-
Le composant carrousel offre une nouvelle variante HorizontalCenteredHeroCarousel, détaillée dans les spécifications Material.
-
Le TimePicker supporte désormais le basculement entre les modes de sélection et de saisie.
-
Une poignée de glissement verticale aide les utilisateurs à ajuster la taille et/ou la position d’un panneau adaptatif.
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].
-
Personnaliser les icônes Material Symbols avec la nouvelle prise en charge des variations d’icônes dans l’assistant Vector Asset.
-
Générer du code à partir d’une capture d’écran ou demander à Gemini de faire correspondre votre UI existante à une image cible. Cela peut être combiné avec la prise en charge du MCP distant pour se connecter à un fichier Figma et générer l’UI Compose à partir des designs.
-
Corriger les problèmes de qualité de l’UI qui audite votre interface pour les problèmes courants (ex: accessibilité) et propose des corrections.
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






