Novedades sobre productos
Novedades de la versión de diciembre de 2025 de Jetpack Compose
Lectura de 6 min
Hoy, la versión de diciembre de 2025 de Jetpack Compose es estable. Contiene la versión 1.10 de los módulos principales de Compose y la versión 1.4 de Material 3 (consulta la asignación completa de la BOM), lo que agrega nuevas funciones y mejoras de rendimiento importantes.
Para usar la versión de hoy, actualiza la versión de la BOM de Compose a 2025.12.00:
implementation(platform("androidx.compose:compose-bom:2025.12.00"))
Mejoras en el rendimiento
Sabemos que el rendimiento en el tiempo de ejecución de tu app es muy importante para ti y tus usuarios, por lo que el rendimiento ha sido una prioridad importante para el equipo de Compose. Esta versión incluye varias mejoras, y puedes obtenerlas todas con solo actualizar a la versión más reciente. Nuestras comparativas internas de desplazamiento muestran que Compose ahora coincide con el rendimiento que verías si usaras Views:
Comparación del rendimiento del desplazamiento entre Views y Jetpack Compose en diferentes versiones de Compose
Composición pausable en la recuperación previa diferida
La composición pausable en la carga previa diferida ahora está habilitada de forma predeterminada. Este es un cambio fundamental en el funcionamiento de la programación del tiempo de ejecución de Compose, diseñado para reducir significativamente el jank durante las cargas de trabajo pesadas de la IU.
Anteriormente, una vez que comenzaba una composición, debía ejecutarse hasta completarse. Si una composición era compleja, esto podía bloquear el subproceso principal durante más de un fotograma, lo que provocaba que la IU se congelara. Con la composición pausable, el tiempo de ejecución ahora puede "pausar" su trabajo si se le acaba el tiempo y reanudarlo en el siguiente fotograma. Esto es particularmente eficaz cuando se usa con la recuperación previa de diseños diferidos para preparar fotogramas con anticipación. Las APIs de Lazy layout CacheWindow que se introdujeron en Compose 1.9 son una excelente manera de realizar una recuperación previa de más contenido y aprovechar la composición pausable para producir un rendimiento de la IU mucho más fluido.
La composición pausable combinada con la recuperación previa diferida ayuda a reducir la inestabilidad
También optimizamos el rendimiento en otros lugares, con mejoras en Modifier.onPlaced, Modifier.onVisibilityChanged y otras implementaciones de modificadores. Seguiremos invirtiendo para mejorar el rendimiento de Compose.
Nuevas funciones
Retain
Compose ofrece varias APIs para mantener y administrar el estado en diferentes ciclos de vida; por ejemplo, remember persiste el estado en todas las composiciones, y rememberSavable/rememberSerializable para persistir en la recreación de actividades o procesos. retain es una nueva API que se encuentra entre estas APIs y te permite conservar valores en los cambios de configuración sin serializarlos, pero no en la finalización del proceso. Como retain no serializa tu estado, puedes conservar objetos como expresiones lambda, flujos y objetos grandes, como mapas de bits, que no se pueden serializar fácilmente. Por ejemplo, puedes usar retain para administrar un reproductor multimedia (como ExoPlayer) y asegurarte de que la reproducción de contenido multimedia no se interrumpa por un cambio de configuración.
@Composable
fun MediaPlayer() {
val applicationContext = LocalContext.current.applicationContext
val exoPlayer = retain { ExoPlayer.Builder(applicationContext).apply { ... }.build() }
...
}
Queremos agradecer a la comunidad de AndroidDev (en especial al equipo de Circuit), que influyó en el diseño de esta función y contribuyó a él.
Material 1.4
La versión 1.4.0 de la biblioteca material3 agrega varios componentes y mejoras nuevos:
-
TextFieldahora ofrece una versión experimental basada enTextFieldState, que proporciona un método más sólido para administrar el estado del texto. Además, ahora se ofrecen nuevas variantes deSecureTextFieldyOutlinedSecureTextField. El elementoTextcomponible de Material ahora admite el comportamiento de autoSize. -
El componente de carrusel ahora ofrece una nueva
HorizontalCenteredHeroCarouselvariante. -
TimePickerahora admite el cambio entre los modos de selector y de entrada. - Un controlador de arrastre vertical ayuda a los usuarios a cambiar el tamaño o la posición de un panel adaptable.
Carrusel de héroes centrado horizontalmente
Ten en cuenta que las APIs de Material 3 Expressive se siguen desarrollando en las versiones alfa de la biblioteca material3. Para obtener más información, mira esta charla reciente:
Nuevas funciones de animación
Seguimos expandiendo nuestras APIs de animación, incluidas las actualizaciones para personalizar las animaciones de elementos compartidos.
Elementos compartidos dinámicos
De forma predeterminada, las animaciones de sharedElement() y sharedBounds() intentan animar
El diseño cambia cada vez que se encuentra una clave coincidente en el estado de destino. Sin embargo, es posible que desees inhabilitar esta animación de forma dinámica según ciertas condiciones, como la dirección de navegación o el estado actual de la IU.
Para controlar si se produce la transición de elementos compartidos, ahora puedes personalizar el SharedContentConfig que se pasa a rememberSharedContentState(). La propiedad isEnabled determina si el elemento compartido está activo.
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
}
}
}
Consulta la documentación para obtener más información.
Modifier.skipToLookaheadPosition()
En esta versión, se agregó un nuevo modificador, Modifier.skipToLookaheadPosition(), que mantiene la posición final de un elemento componible cuando se realizan animaciones de elementos compartidos. Esto permite realizar transiciones como la animación de tipo “revelar”, como se puede ver en el ejemplo de Androidify con la revelación progresiva de la cámara. Consulta la sugerencia en video aquí para obtener más información:
Velocidad inicial en transiciones de elementos compartidos
Esta versión agrega una nueva API de transición de elementos compartidos, prepareTransitionWithInitialVelocity, que te permite pasar una velocidad inicial (p.ej., desde un gesto) a una transición de elementos compartidos:
Modifier.fillMaxSize()
.draggable2D(
rememberDraggable2DState { offset += it },
onDragStopped = { velocity ->
// Set up the initial velocity for the upcoming shared element
// transition.
sharedContentStateForDraggableCat
?.prepareTransitionWithInitialVelocity(velocity)
showDetails = false
},
)
Una transición de elemento compartido que comienza con una velocidad inicial a partir de un gesto
Transiciones veladas
EnterTransition y ExitTransition definen cómo aparece o desaparece un elemento AnimatedVisibility/AnimatedContent componible. Una nueva opción de velo experimental te permite especificar un color para velar o cubrir el contenido, por ejemplo, atenuar una capa negra semitransparente sobre el contenido:
Contenido animado velado: Observa el velo (o scrim) semiopaco sobre el contenido de la cuadrícula durante la animación
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 ->
...
}
Próximos cambios
Baja de Modifier.onFirstVisible
Compose 1.9 introdujo Modifier.onVisibilityChanged y Modifier.onFirstVisible. Después de revisar tus comentarios, quedó claro que el contrato de Modifier.onFirstVisible no se podía cumplir de forma determinística, específicamente cuando un elemento primero se hace visible. Por ejemplo, un diseño Lazy puede descartar elementos que se desplazan fuera de la ventana gráfica y, luego, volver a componerlos si se desplazan de nuevo a la vista. En esta circunstancia, se volvería a activar la devolución de llamada onFirstVisible, ya que se trata de un elemento recién compuesto. También se produciría un comportamiento similar cuando se navega hacia atrás a una pantalla visitada anteriormente que contiene onFirstVisible. Por lo tanto, decidimos dar de baja este modificador en la próxima versión de Compose (1.11) y recomendamos migrar a onVisibilityChanged. Consulta la documentación para obtener más información.
Despacho de corrutinas en pruebas
Planeamos cambiar el envío de corrutinas en las pruebas para mejorar su confiabilidad y detectar más problemas. Actualmente, las pruebas usan UnconfinedTestDispatcher, que difiere del comportamiento de producción. Por ejemplo, los efectos pueden ejecutarse de inmediato en lugar de ponerse en cola. En una versión futura, planeamos introducir una nueva API que use StandardTestDispatcher de forma predeterminada para que coincida con los comportamientos de producción. Puedes probar el nuevo comportamiento ahora en la versión 1.10:
@get:Rule // also createAndroidComposeRule, createEmptyComposeRule val rule = createComposeRule(effectContext = StandardTestDispatcher())
Si usas StandardTestDispatcher, se pondrán en cola las tareas, por lo que debes usar mecanismos de sincronización como composeTestRule.waitForIdle() o composeTestRule.runOnIdle(). Si tu prueba usa runTest, debes asegurarte de que runTest y tu regla de Compose compartan la misma instancia de StandardTestDispatcher para la sincronización.
// 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 { /* ... */ }
}
Herramientas
Las APIs excelentes merecen herramientas excelentes, y Android Studio tiene varias incorporaciones recientes para los desarrolladores de Compose:
-
IU de transformación: Itera tus diseños haciendo clic con el botón derecho en
@Preview, seleccionando IU de transformación y, luego, describiendo el cambio en lenguaje natural. -
Generar
@Preview: Haz clic con el botón derecho en un elemento componible y selecciona Gemini > Generar vista previa de [nombre del elemento componible] . - Personaliza Material Symbols con la nueva compatibilidad con variaciones de íconos en el asistente de Vector Asset.
- Genera código a partir de una captura de pantalla o pídele a Gemini que haga coincidir tu IU existente con una imagen objetivo. Esto se puede combinar con la compatibilidad con MCP remota, p.ej., para conectarse a un archivo de Figma y generar una IU de Compose a partir de diseños.
- La auditoría Fix UI quality issues audita tu IU para detectar problemas comunes, como problemas de accesibilidad, y, luego, propone correcciones.
Para ver estas herramientas en acción, mira esta demostración reciente:
Happy Composing
Seguimos invirtiendo en Jetpack Compose para proporcionarte las APIs y las herramientas que necesitas para crear IU atractivas y enriquecidas. Valoramos tus comentarios, así que compártelos sobre estos cambios o lo que te gustaría ver a continuación en nuestro rastreador de problemas.
Seguir leyendo
-
Novedades sobre productos
Si eres desarrollador de Android y quieres implementar funciones innovadoras basadas en IA en tu app, hace poco lanzamos nuevas y potentes actualizaciones.
Thomas Ezan • Lectura de 3 min
-
Novedades sobre productos
Android 17 alcanzó la versión beta 4, la última versión beta programada de este ciclo de lanzamiento, un hito fundamental para la compatibilidad de las apps y la estabilidad de la plataforma.
Daniel Galpin • Lectura de 4 min
-
Novedades sobre productos
Hacer de Google Play la experiencia más segura y confiable posible Hoy anunciamos un nuevo conjunto de actualizaciones de políticas y una función de transferencia de cuentas para mejorar la privacidad de los usuarios y proteger tu empresa del fraude.
Bennet Manuel • Lectura de 3 min
Mantente al día
Recibe la información más reciente sobre el desarrollo de Android en tu bandeja de entrada todas las semanas.