Hari ini, rilis Jetpack Compose Desember '25 sudah stabil. Rilis ini berisi modul Compose inti versi 1.10 dan Material 3 versi 1.4 (lihat pemetaan BOM lengkap), yang menambahkan fitur baru dan peningkatan performa utama.
Untuk menggunakan rilis hari ini, upgrade versi BOM Compose Anda ke 2025.12.00:
implementation(platform("androidx.compose:compose-bom:2025.12.00"))Peningkatan performa
Kami tahu bahwa performa runtime aplikasi Anda sangat penting bagi Anda dan pengguna Anda, sehingga performa telah menjadi prioritas utama bagi tim Compose. Rilis ini menghadirkan sejumlah peningkatan—dan Anda mendapatkan semuanya hanya dengan mengupgrade ke versi terbaru. Benchmark scroll internal kami menunjukkan bahwa Compose kini sesuai dengan performa yang akan Anda lihat jika menggunakan Tampilan:
Benchmark performa scroll yang membandingkan Tampilan dan Jetpack Compose di berbagai versi Compose
Komposisi yang dapat dijeda dalam pengambilan data awal lambat
Komposisi yang dapat dijeda dalam pengambilan data awal lambat kini diaktifkan secara default. Hal ini merupakan perubahan mendasar pada cara kerja runtime Compose, yang dirancang untuk mengurangi jank secara signifikan selama workload UI yang berat.
Sebelumnya, setelah komposisi dimulai, komposisi harus dijalankan hingga selesai. Jika komposisi kompleks, hal ini dapat memblokir thread utama lebih lama dari satu frame, sehingga menyebabkan UI membeku. Dengan komposisi yang dapat dijeda, runtime kini dapat "menjeda" pekerjaannya jika kehabisan waktu dan melanjutkan pekerjaan di frame berikutnya. Hal ini sangat efektif jika digunakan dengan pengambilan data awal tata letak lambat untuk menyiapkan frame terlebih dahulu. Lazy layout CacheWindow API yang diperkenalkan di Compose 1.9 adalah cara yang bagus untuk mengambil data awal lebih banyak konten dan mendapatkan manfaat dari komposisi yang dapat dijeda untuk menghasilkan performa UI yang jauh lebih lancar.
Komposisi yang dapat dijeda dikombinasikan dengan pengambilan data awal Lambat membantu mengurangi jank
Kami juga telah mengoptimalkan performa di tempat lain, dengan peningkatan pada Modifier.onPlaced, Modifier.onVisibilityChanged, dan implementasi pengubah lainnya. Kami akan terus berinvestasi untuk meningkatkan performa Compose.
Fitur baru
Mempertahankan
Compose menawarkan sejumlah API untuk menyimpan dan mengelola status di berbagai siklus proses; misalnya, remember mempertahankan status di seluruh komposisi, dan rememberSavable/rememberSerializable untuk mempertahankan status di seluruh aktivitas atau pembuatan ulang proses.retain adalah API baru yang berada di antara API ini, yang memungkinkan Anda mempertahankan nilai di seluruh perubahan konfigurasi tanpa diserialisasi, tetapi tidak di seluruh proses. Karena retain tidak melakukan serialisasi status Anda, Anda dapat mempertahankan objek seperti ekspresi lambda, aliran, dan objek besar seperti bitmap, yang tidak dapat diserialisasi dengan mudah. Misalnya, Anda dapat menggunakan retain untuk mengelola pemutar media (seperti ExoPlayer) guna memastikan pemutaran media tidak terganggu oleh perubahan konfigurasi.
@Composable
fun MediaPlayer() {
val applicationContext = LocalContext.current.applicationContext
val exoPlayer = retain { ExoPlayer.Builder(applicationContext).apply { ... }.build() }
...
}Kami ingin mengucapkan terima kasih kepada komunitas AndroidDev (terutama tim Circuit), yang telah memengaruhi dan berkontribusi pada desain fitur ini.
Material 1.4
Library material3 versi 1.4.0 menambahkan sejumlah komponen dan peningkatan baru:
TextFieldkini menawarkan versi berbasisTextFieldStateeksperimental, yang menyediakan metode yang lebih andal untuk mengelola status teks. Selain itu, varianSecureTextFielddanOutlinedSecureTextFieldbaru kini ditawarkan. ComposableTextmaterial kini mendukung perilaku autoSize.- Komponen carousel kini menawarkan varian
HorizontalCenteredHeroCarouselbaru. TimePickerkini mendukung peralihan antara mode pemilih dan input.- Tuas tarik vertikal membantu pengguna mengubah ukuran dan/atau posisi panel adaptif.
Carousel hero yang berpusat secara horizontal
Perhatikan bahwa Material 3 Expressive API terus dikembangkan dalam rilis alfa library material3. Untuk mempelajari lebih lanjut, lihat presentasi terbaru ini:
Fitur animasi baru
Kami terus memperluas API animasi, termasuk update untuk menyesuaikan animasi elemen bersama.
Elemen bersama dinamis
Secara default, animasi sharedElement() dan sharedBounds() mencoba menganimasikan
perubahan tata letak setiap kali kunci yang cocok ditemukan dalam status target. Namun, Anda mungkin ingin menonaktifkan animasi ini secara dinamis berdasarkan kondisi tertentu, seperti arah navigasi atau status UI saat ini.
Untuk mengontrol apakah transisi elemen bersama terjadi, Anda kini dapat menyesuaikan SharedContentConfig yang diteruskan ke rememberSharedContentState(). Properti isEnabled menentukan apakah elemen bersama aktif.
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
}
}
}Lihat dokumentasi untuk mengetahui informasi selengkapnya.
Modifier.skipToLookaheadPosition()
Pengubah baru, Modifier.skipToLookaheadPosition(), telah ditambahkan dalam rilis ini, yang mempertahankan posisi akhir composable saat melakukan animasi elemen bersama. Hal ini memungkinkan transisi seperti animasi jenis “reveal”, seperti yang dapat dilihat dalam contoh Androidify dengan pengungkapan progresif kamera. Lihat tips video di sini untuk mengetahui informasi selengkapnya:
Kecepatan awal dalam transisi elemen bersama
Rilis ini menambahkan API transisi elemen bersama baru, prepareTransitionWithInitialVelocity, yang memungkinkan Anda meneruskan kecepatan awal (misalnya dari gestur) ke transisi elemen bersama:
Modifier.fillMaxSize()
.draggable2D(
rememberDraggable2DState { offset += it },
onDragStopped = { velocity ->
// Set up the initial velocity for the upcoming shared element
// transition.
sharedContentStateForDraggableCat
?.prepareTransitionWithInitialVelocity(velocity)
showDetails = false
},
)
Transisi elemen bersama yang dimulai dengan kecepatan awal dari gestur
Transisi terselubung
EnterTransition dan ExitTransition menentukan cara composable AnimatedVisibility/AnimatedContent muncul atau menghilang. Opsi selubung eksperimental baru memungkinkan Anda menentukan warna untuk konten selubung atau scrim; misalnya, memudarkan lapisan hitam semi-transparan di atas konten:
Konten animasi terselubung – perhatikan selubung (atau scrim) semi-transparan di atas konten petak selama animasi
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 ->
...
}
Perubahan mendatang
Penghentian Modifier.onFirstVisible
Compose 1.9 memperkenalkan Modifier.onVisibilityChanged dan Modifier.onFirstVisible. Setelah meninjau masukan Anda, jelas bahwa kontrak Modifier.onFirstVisible tidak dapat dipenuhi secara deterministik; khususnya, saat item pertama kali terlihat. Misalnya, tata letak Lambat dapat menghapus item yang di-scroll keluar dari area pandang, lalu menyusunnya lagi jika di-scroll kembali ke tampilan. Dalam situasi ini, callback onFirstVisible akan diaktifkan lagi, karena merupakan item yang baru disusun. Perilaku serupa juga akan terjadi saat kembali ke layar yang sebelumnya dikunjungi yang berisi onFirstVisible. Oleh karena itu, kami telah memutuskan untuk menghentikan pengubah ini dalam rilis Compose berikutnya (1.11) dan merekomendasikan migrasi ke onVisibilityChanged. Lihat dokumentasi untuk mengetahui informasi selengkapnya.
Pengiriman coroutine dalam pengujian
Kami berencana mengubah pengiriman coroutine dalam pengujian untuk meningkatkan ketidakstabilan pengujian dan menangkap lebih banyak masalah. Saat ini, pengujian menggunakan UnconfinedTestDispatcher, yang berbeda dengan perilaku produksi; misalnya, efek dapat berjalan segera, bukan diantrekan. Dalam rilis mendatang, kami berencana memperkenalkan API baru yang menggunakan StandardTestDispatcher secara default agar sesuai dengan perilaku produksi. Anda dapat mencoba perilaku baru sekarang di 1.10:
@get:Rule // also createAndroidComposeRule, createEmptyComposeRule val rule = createComposeRule(effectContext = StandardTestDispatcher())
Menggunakan StandardTestDispatcher akan mengantrekan tugas, sehingga Anda harus menggunakan mekanisme sinkronisasi seperti composeTestRule.waitForIdle() atau composeTestRule.runOnIdle(). Jika pengujian Anda menggunakan runTest, Anda harus memastikan bahwa runTest dan aturan Compose Anda menggunakan instance StandardTestDispatcher yang sama untuk sinkronisasi.
// 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 { /* ... */ }
}
Alat
API yang hebat layak mendapatkan alat yang hebat, dan Android Studio memiliki sejumlah tambahan terbaru untuk developer Compose:
- Transform UI: Lakukan iterasi pada desain Anda dengan mengklik kanan
@Preview, memilih Transform UI, lalu menjelaskan perubahan dalam bahasa alami. - Generate
@Preview: Klik kanan composable dan pilih Gemini > Generate [Composable name] Preview. - Sesuaikan Material Symbols dengan dukungan baru untuk variasi ikon di wizard Vector Asset.
- Hasilkan kode dari tangkapan layar atau minta Gemini untuk mencocokkan UI yang ada dengan gambar target. Hal ini dapat digabungkan dengan dukungan MCP jarak jauh, misalnya untuk terhubung ke file Figma dan membuat UI Compose dari desain.
- Perbaiki masalah kualitas UI mengaudit UI Anda untuk masalah umum, seperti masalah aksesibilitas, lalu mengusulkan perbaikan.
Untuk melihat cara kerja alat ini, tonton demonstrasi terbaru ini:
Selamat Menyusun
Kami terus berinvestasi di Jetpack Compose untuk menyediakan API dan alat yang Anda butuhkan untuk membuat UI yang menarik dan kaya. Kami menghargai masukan Anda, jadi harap bagikan masukan Anda tentang perubahan ini atau hal yang ingin Anda lihat berikutnya di pelacak masalah kami.
Lanjutkan membaca
-
Berita Produk
Dalam waktu hampir 5 tahun sejak Jetpack Compose diluncurkan, kami telah berinvestasi untuk menyediakan semua fitur, performa, dan alat yang Anda butuhkan untuk membangun UI yang luar biasa di berbagai perangkat Android.
Nick Butcher • Waktu baca: 2 menit
-
Berita Produk
Di Google I/O 2026, kami memperkenalkan peralihan Android dari sistem operasi ke sistem kecerdasan. Kami juga menunjukkan cara membangun pengalaman cerdas secara native dengan sistem dan menghadirkan kecanggihan AI Google ke dalam aplikasi Anda.
Jingyu Shi • Waktu baca: 2 menit
-
Berita Produk
Dengan senang hati kami mengumumkan bahwa dukungan resmi untuk Unreal Engine dan Godot telah hadir untuk Android XR. Kami juga meluncurkan alat baru yang dirancang untuk meningkatkan produktivitas Anda dan mengaktifkan kemampuan XR baru: Android XR Engine Hub dan Android XR Interaction Framework.
Luke Hopkins, Ryan Bartley • Waktu baca: 4 menit
Terus dapatkan informasi
Dapatkan insight pengembangan Android terbaru yang dikirim ke kotak masuk Anda setiap minggu.