Oggi, la release di Jetpack Compose di dicembre 2025 è stabile. Contiene la versione 1.10 dei moduli Compose di base e la versione 1.4 di Material 3 (vedi la mappatura completa della distinta base), aggiungendo nuove funzionalità e importanti miglioramenti delle prestazioni.
Per utilizzare la release di oggi, esegui l'upgrade della versione della distinta base di Compose a 2025.12.00:
implementation(platform("androidx.compose:compose-bom:2025.12.00"))
Miglioramenti delle prestazioni
Sappiamo che le prestazioni di runtime della tua app sono estremamente importanti per te e per i tuoi utenti, quindi le prestazioni sono state una priorità assoluta per il team di Compose. Questa release introduce una serie di miglioramenti, che puoi ottenere tutti semplicemente eseguendo l'upgrade all'ultima versione. I nostri benchmark di scorrimento interni mostrano che Compose ora corrisponde alle prestazioni che vedresti se utilizzassi le visualizzazioni:
Benchmark delle prestazioni di scorrimento che confronta le visualizzazioni e Jetpack Compose in diverse versioni di Compose
Composizione in pausa nel prefetch lazy
La composizione in pausa nel prefetch lazy è ora attiva per impostazione predefinita. Si tratta di una modifica fondamentale al funzionamento della pianificazione di runtime di Compose, progettata per ridurre significativamente il jank durante i carichi di lavoro UI pesanti.
In precedenza, una volta avviata una composizione, doveva essere eseguita fino al completamento. Se una composizione era complessa, poteva bloccare il thread principale per un periodo di tempo superiore a un singolo frame, causando il blocco della UI. Con la composizione in pausa, il runtime può ora "mettere in pausa" il suo lavoro se sta esaurendo il tempo e riprenderlo nel frame successivo. Questo è particolarmente efficace se utilizzato con il prefetch del layout lazy per preparare i frame in anticipo. Le API CacheWindow del layout lazy introdotte in Compose 1.9 sono un ottimo modo per precaricare più contenuti e sfruttare la composizione in pausa per ottenere prestazioni della UI molto più fluide.
La composizione in pausa combinata con il prefetch lazy aiuta a ridurre il jank
Abbiamo anche ottimizzato le prestazioni altrove, con miglioramenti a Modifier.onPlaced, Modifier.onVisibilityChanged e altre implementazioni di modificatori. Continueremo a investire nel miglioramento delle prestazioni di Compose.
Nuove funzionalità
Retain
Compose offre una serie di API per conservare e gestire lo stato in diversi cicli di vita; ad esempio, remember mantiene lo stato tra le composizioni e rememberSavable/rememberSerializable per mantenerlo durante la ricreazione di attività o processi.retain è una nuova API che si trova tra queste API e ti consente di mantenere i valori durante le modifiche alla configurazione senza essere serializzati, ma non durante l'interruzione del processo. Poiché retain non serializza lo stato, puoi mantenere oggetti come espressioni lambda, flussi e oggetti di grandi dimensioni come bitmap, che non possono essere serializzati facilmente. Ad esempio, puoi utilizzare retain per gestire un player multimediale (ad esempio ExoPlayer) per assicurarti che la riproduzione dei contenuti multimediali non venga interrotta da una modifica alla configurazione.
@Composable
fun MediaPlayer() {
val applicationContext = LocalContext.current.applicationContext
val exoPlayer = retain { ExoPlayer.Builder(applicationContext).apply { ... }.build() }
...
}
Ringraziamo la community AndroidDev (in particolare il team di Circuit), che ha influenzato e contribuito alla progettazione di questa funzionalità.
Material 1.4
La versione 1.4.0 della libreria material3 aggiunge una serie di nuovi componenti e miglioramenti:
-
TextFieldora offre una versione sperimentale basata suTextFieldState, che fornisce un metodo più solido per la gestione dello stato del testo. Inoltre, ora sono disponibili le nuove variantiSecureTextFieldeOutlinedSecureTextField. Il composableTextdi Material ora supporta il comportamento di ridimensionamento automatico. -
Il componente carosello ora offre una nuova
HorizontalCenteredHeroCarouselvariante. -
TimePickerora supporta il passaggio tra le modalità di selezione e di input. - Una maniglia di trascinamento verticale aiuta gli utenti a modificare le dimensioni e/o la posizione di un riquadro adattivo.
Carosello orizzontale con elemento principale centrato
Tieni presente che le API Material 3 Expressive continuano a essere sviluppate nelle release alpha della libreria material3. Per saperne di più, guarda questo recente intervento:
Nuove funzionalità di animazione
Continuiamo a espandere le nostre API di animazione, inclusi gli aggiornamenti per la personalizzazione delle animazioni degli elementi condivisi.
Elementi condivisi dinamici
Per impostazione predefinita, le animazioni sharedElement() e sharedBounds() tentano di animare
le modifiche al layout ogni volta che viene trovata una chiave corrispondente nello stato di destinazione. Tuttavia, potresti voler disabilitare questa animazione in modo dinamico in base a determinate condizioni, come la direzione di navigazione o lo stato attuale della UI.
Per controllare se la transizione dell'elemento condiviso si verifica, ora puoi personalizzare SharedContentConfig passato a rememberSharedContentState(). La proprietà isEnabled determina se l'elemento condiviso è attivo.
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
}
}
}
Per saperne di più, consulta la documentazione.
Modifier.skipToLookaheadPosition()
In questa release è stato aggiunto un nuovo modificatore, Modifier.skipToLookaheadPosition(), che mantiene la posizione finale di un composable durante l'esecuzione delle animazioni degli elementi condivisi. Ciò consente di eseguire transizioni come l'animazione di tipo "rivela", come si può vedere nell'esempio di Androidify con la rivelazione progressiva della fotocamera. Per saperne di più, guarda il video con il suggerimento qui:
Velocità iniziale nelle transizioni degli elementi condivisi
Questa release aggiunge una nuova API di transizione degli elementi condivisi, prepareTransitionWithInitialVelocity, che ti consente di passare una velocità iniziale (ad es. da un gesto) a una transizione degli elementi condivisi:
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 transizione di elementi condivisi che inizia con una velocità iniziale da un gesto
Transizioni velate
EnterTransition e ExitTransition definiscono la modalità di visualizzazione o scomparsa di un composable AnimatedVisibility/AnimatedContent. Una nuova opzione di velo sperimentale ti consente di specificare un colore per velare o oscurare i contenuti; ad esempio, dissolvendo un livello nero semi-opaco sui contenuti:
Contenuti animati velati: nota il velo (o la schermata) semi-opaco sui contenuti della griglia durante l'animazione
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 ->
...
}
Modifiche imminenti
Deprecazione di Modifier.onFirstVisible
Compose 1.9 ha introdotto Modifier.onVisibilityChanged e Modifier.onFirstVisible. Dopo aver esaminato il tuo feedback, è diventato evidente che il contratto di Modifier.onFirstVisible non era possibile rispettarlo in modo deterministico, in particolare quando un elemento diventa per la prima volta visibile. Ad esempio, un layout lazy può eliminare gli elementi che scorrono fuori dalla finestra e poi comporli di nuovo se scorrono di nuovo nella visualizzazione. In questa circostanza, il callback onFirstVisible verrà attivato di nuovo, poiché si tratta di un elemento appena composto. Un comportamento simile si verificherebbe anche quando si torna a una schermata visitata in precedenza contenente onFirstVisible. Pertanto, abbiamo deciso di ritirare questo modificatore nella prossima release di Compose (1.11) e consigliamo di eseguire la migrazione a onVisibilityChanged. Per saperne di più, consulta la documentazione.
Invio di coroutine nei test
Prevediamo di modificare l'invio di coroutine nei test per migliorare l'instabilità dei test e rilevare più problemi. Attualmente, i test utilizzano UnconfinedTestDispatcher, che differisce dal comportamento di produzione; ad esempio, gli effetti potrebbero essere eseguiti immediatamente anziché essere accodati. In una release futura, prevediamo di introdurre una nuova API che utilizza StandardTestDispatcher per impostazione predefinita per corrispondere ai comportamenti di produzione. Puoi provare il nuovo comportamento ora nella versione 1.10:
@get:Rule // also createAndroidComposeRule, createEmptyComposeRule val rule = createComposeRule(effectContext = StandardTestDispatcher())
L'utilizzo di StandardTestDispatcher accoderà le attività, quindi devi utilizzare meccanismi di sincronizzazione come composeTestRule.waitForIdle() o composeTestRule.runOnIdle(). Se il test utilizza runTest, devi assicurarti che runTest e la regola di Compose condividano la stessa istanza StandardTestDispatcher per la sincronizzazione.
// 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 { /* ... */ }
}
Strumenti
Le API di qualità meritano strumenti di qualità e Android Studio ha una serie di aggiunte recenti per gli sviluppatori di Compose:
-
Trasforma UI: esegui l'iterazione sui tuoi progetti facendo clic con il tasto destro del mouse su
@Preview, selezionando Trasforma UI e poi descrivendo la modifica in linguaggio naturale. -
Genera
@Preview: fai clic con il tasto destro del mouse su un composable e seleziona Gemini > Genera anteprima [nome composable] . - Personalizza i simboli di Material con il nuovo supporto per le varianti delle icone nella procedura guidata per gli asset vettoriali.
- Genera codice da uno screenshot o chiedi a Gemini di abbinare la UI esistente a un'immagine di destinazione. Questa operazione può essere combinata con il supporto MCP remoto, ad esempio per connettersi a un file Figma e generare la UI di Compose dai progetti.
- Correggi i problemi di qualità della UI esegue un audit della UI per rilevare problemi comuni, come quelli di accessibilità, e poi propone correzioni.
Per vedere questi strumenti in azione, guarda questa recente dimostrazione:
Buon lavoro con Compose
Continuiamo a investire in Jetpack Compose per fornirti le API e gli strumenti di cui hai bisogno per creare UI ricche e accattivanti. Il tuo contributo è importante per noi, quindi condividi il tuo feedback su queste modifiche o su ciò che ti piacerebbe vedere in futuro nel nostro Issue Tracker.
Continua a leggere
-
Notizie sui prodotti
La release di Jetpack Compose di aprile 2026 è stabile. Questa release contiene la versione 1.11 dei moduli Compose di base (vedi la mappatura completa della distinta base), gli strumenti di debug degli elementi condivisi, gli eventi del trackpad e altro ancora.
Meghan Mehta • Lettura di 5 minuti
-
Notizie sui prodotti
Android Studio Panda 4 è ora stabile e pronto per essere utilizzato in produzione. Questa release include la modalità di pianificazione, la previsione della modifica successiva e altro ancora, rendendo più facile che mai la creazione di app Android di alta qualità.
Matt Dyor • Lettura di 5 minuti
-
Notizie sui prodotti
Se sei uno sviluppatore Android che vuole implementare funzionalità di AI innovative nella tua app, abbiamo lanciato di recente nuovi aggiornamenti potenti.
Thomas Ezan • Lettura di 3 minuti
Resta al passo con le novità
Ricevi settimanalmente nella tua casella di posta gli ultimi approfondimenti sullo sviluppo di Android.