Obecnie wersja Jetpack Compose z grudnia 2025 r. jest stabilna. Zawiera wersję 1.10 podstawowych modułów Compose i wersję 1.4 biblioteki Material 3 (pełne mapowanie BOM), które dodają nowe funkcje i znacznie poprawiają wydajność.
Aby używać dzisiejszej wersji, uaktualnij wersję BOM Compose do 2025.12.00:
implementation(platform("androidx.compose:compose-bom:2025.12.00"))Ulepszenia wydajności
Wiemy, że wydajność aplikacji jest niezwykle ważna dla Ciebie i Twoich użytkowników, dlatego zespół Compose traktuje ją priorytetowo. Ta wersja zawiera szereg ulepszeń, które uzyskasz, aktualizując ją do najnowszej wersji. Nasze wewnętrzne testy przewijania pokazują, że Compose osiąga teraz podobną wydajność jak Views:
Porównanie wydajności przewijania w przypadku widoków i Jetpack Compose w różnych wersjach Compose
Możliwość wstrzymania kompozycji w przypadku leniwego pobierania wstępnego
Wstrzymywanie kompozycji w wstępnym wczytywaniu z opóźnieniem jest teraz domyślnie włączone. Jest to zasadnicza zmiana w sposobie działania harmonogramów środowiska wykonawczego Compose, która ma na celu znaczne ograniczenie zacinania się interfejsu podczas dużych obciążeń.
Wcześniej po rozpoczęciu kompozycji musiała ona zostać ukończona. Jeśli kompozycja była złożona, mogło to blokować wątek główny przez dłużej niż jedną klatkę, co powodowało zawieszanie się interfejsu. Dzięki kompozycji z możliwością wstrzymania środowisko wykonawcze może teraz „wstrzymać” pracę, jeśli kończy mu się czas, i wznowić ją w następnej klatce. Jest to szczególnie skuteczne w połączeniu z wstępnym pobieraniem układu z leniwym ładowaniem, które przygotowuje ramki z wyprzedzeniem. Interfejsy API CacheWindow w układzie Lazy wprowadzone w Compose 1.9 to świetny sposób na wstępne pobieranie większej ilości treści i korzystanie z kompozycji z możliwością wstrzymania, co zapewnia znacznie płynniejsze działanie interfejsu.
Możliwość wstrzymania kompozycji w połączeniu z leniwym pobieraniem wstępnym pomaga ograniczyć zacinanie się
Zoptymalizowaliśmy też działanie innych funkcji, wprowadzając ulepszenia w Modifier.onPlaced, Modifier.onVisibilityChanged i innych implementacjach modyfikatorów. Będziemy nadal inwestować w poprawę wydajności Compose.
Nowe funkcje
Zachowaj
Compose udostępnia kilka interfejsów API do przechowywania stanu i zarządzania nim w różnych cyklach życia. Na przykład remember zachowuje stan w różnych kompozycjach, a rememberSavable/rememberSerializable – w różnych aktywnościach lub procesach. retain to nowy interfejs API, który znajduje się między tymi interfejsami API i umożliwia zachowywanie wartości po zmianach konfiguracji bez serializacji, ale nie po śmierci procesu. retain nie serializuje stanu, więc możesz zachowywać obiekty takie jak wyrażenia lambda, przepływy i duże obiekty, np. mapy bitowe, których nie można łatwo zserializować. Możesz na przykład użyć retain do zarządzania odtwarzaczem multimediów (np. ExoPlayer), aby mieć pewność, że odtwarzanie multimediów nie zostanie przerwane przez zmianę konfiguracji.
@Composable
fun MediaPlayer() {
val applicationContext = LocalContext.current.applicationContext
val exoPlayer = retain { ExoPlayer.Builder(applicationContext).apply { ... }.build() }
...
}Chcemy podziękować społeczności AndroidDev (zwłaszcza zespołowi Circuit), która miała wpływ na projekt tej funkcji i przyczyniła się do jej powstania.
Material 1.4
Wersja 1.4.0 biblioteki material3 zawiera szereg nowych komponentów i ulepszeń:
TextFieldoferuje teraz eksperymentalną wersję opartą naTextFieldState, która zapewnia bardziej niezawodną metodę zarządzania stanem tekstu. Dodatkowo oferujemy teraz nowe wariantySecureTextFieldiOutlinedSecureTextField. KomponentTextz biblioteki Material Design obsługuje teraz zachowanie autoSize.- Komponent karuzeli ma teraz nowy
HorizontalCenteredHeroCarouselwariant. TimePickerobsługuje teraz przełączanie między selektorem a trybami wprowadzania.- Pionowy uchwyt do przeciągania pomaga użytkownikom zmieniać rozmiar lub położenie panelu adaptacyjnego.
Poziomy karuzela powitalna wyśrodkowana
Pamiętaj, że interfejsy API Material 3 Expressive są nadal rozwijane w wersjach alfa biblioteki material3. Więcej informacji znajdziesz w tym nagraniu:
Nowe funkcje animacji
Stale rozwijamy nasze interfejsy API animacji, w tym aktualizacje umożliwiające dostosowywanie animacji wspólnych elementów.
Dynamiczne udostępnione elementy
Domyślnie animacje sharedElement() i sharedBounds() próbują animować
układ zmienia się za każdym razem, gdy w stanie docelowym zostanie znaleziony pasujący klucz. Możesz jednak dynamicznie wyłączać tę animację w określonych warunkach, np. w zależności od kierunku nawigacji lub bieżącego stanu interfejsu.
Aby określić, czy ma nastąpić przejście elementu udostępnionego, możesz teraz dostosować wartość SharedContentConfig przekazywaną do funkcji rememberSharedContentState(). Właściwość isEnabled określa, czy element udostępniony jest aktywny.
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
}
}
}Więcej informacji znajdziesz w dokumentacji.
Modifier.skipToLookaheadPosition()
W tej wersji dodaliśmy nowy modyfikator Modifier.skipToLookaheadPosition(), który zachowuje ostateczną pozycję elementu kompozycyjnego podczas wykonywania animacji elementów udostępnionych. Umożliwia to wykonywanie przejść, takich jak animacja typu „reveal”, co widać w przykładzie Androidify z progresywnym ujawnianiem aparatu. Więcej informacji znajdziesz w tym filmie:
Prędkość początkowa w przypadku przejść między elementami współdzielonymi
Ta wersja zawiera nowy interfejs API przejścia elementu udostępnionego, prepareTransitionWithInitialVelocity, który umożliwia przekazywanie początkowej prędkości (np. z gestu) do przejścia elementu udostępnionego:
Modifier.fillMaxSize()
.draggable2D(
rememberDraggable2DState { offset += it },
onDragStopped = { velocity ->
// Set up the initial velocity for the upcoming shared element
// transition.
sharedContentStateForDraggableCat
?.prepareTransitionWithInitialVelocity(velocity)
showDetails = false
},
)
Przejście elementu współdzielonego, które rozpoczyna się z początkową prędkością pochodzącą z gestu
Przejścia zasłonięte
EnterTransition i ExitTransition określają, jak element kompozycyjny AnimatedVisibility/AnimatedContent pojawia się lub znika. Nowa eksperymentalna opcja zasłony umożliwia określenie koloru, którym mają być zasłonięte treści, np. stopniowe pojawianie się i znikanie półprzezroczystej czarnej warstwy na treściach:
Treści animowane z zasłoną – zwróć uwagę na półprzezroczystą zasłonę (lub siatkę) na treściach w siatce podczas animacji
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 ->
...
}
Nadchodzące zmiany
Wycofanie Modifier.onFirstVisible
W wersji 1.9 Compose wprowadzono funkcje Modifier.onVisibilityChanged i Modifier.onFirstVisible. Po zapoznaniu się z Twoją opinią okazało się, że nie można było w sposób deterministyczny dotrzymać warunków umowy dotyczących Modifier.onFirstVisible, a w szczególności momentu, w którym element po raz pierwszy staje się widoczny. Na przykład układ Lazy może usuwać elementy, które znikają z obszaru widocznego na ekranie, a następnie ponownie je tworzyć, gdy wracają do widoku. W takiej sytuacji wywołanie zwrotne onFirstVisible zostanie uruchomione ponownie, ponieważ jest to nowo utworzony element. Podobne zachowanie wystąpi również podczas powrotu do wcześniej odwiedzonego ekranu zawierającego onFirstVisible. Dlatego zdecydowaliśmy się wycofać ten modyfikator w następnej wersji Compose (1.11) i zalecamy przejście na onVisibilityChanged. Więcej informacji znajdziesz w dokumentacji.
Wysyłanie coroutine w testach
Planujemy zmienić wysyłanie współprogramów w testach, aby zmniejszyć ich niestabilność i wykrywać więcej problemów. Obecnie testy korzystają z UnconfinedTestDispatcher, co różni się od działania w wersji produkcyjnej. Na przykład efekty mogą być uruchamiane natychmiast, a nie dodawane do kolejki. W przyszłej wersji planujemy wprowadzić nowy interfejs API, który domyślnie będzie używać StandardTestDispatcher, aby dopasować się do zachowań w środowisku produkcyjnym. Nowe działanie możesz wypróbować już teraz w wersji 1.10:
@get:Rule // also createAndroidComposeRule, createEmptyComposeRule val rule = createComposeRule(effectContext = StandardTestDispatcher())
Użycie StandardTestDispatcher spowoduje umieszczenie zadań w kolejce, więc musisz użyć mechanizmów synchronizacji, takich jak composeTestRule.waitForIdle() lub composeTestRule.runOnIdle(). Jeśli test korzysta z runTest, musisz zadbać o to, aby runTest i reguła tworzenia wiadomości korzystały z tej samej instancji StandardTestDispatcher na potrzeby synchronizacji.
// 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 { /* ... */ }
}
Narzędzia
Dobre interfejsy API zasługują na dobre narzędzia, a Android Studio ma kilka nowości dla deweloperów korzystających z Compose:
- Przekształć interfejs: iteruj projekty, klikając prawym przyciskiem myszy
@Preview, wybierając opcję Przekształć interfejs, a następnie opisując zmianę w języku naturalnym. - Generowanie
@Preview: kliknij prawym przyciskiem myszy element kompozycyjny i wybierz Gemini > Wygeneruj podgląd [nazwa elementu kompozycyjnego] . - Dostosowywanie symboli Material dzięki nowej obsłudze wariantów ikon w kreatorze zasobów wektorowych.
- Generuj kod na podstawie zrzutu ekranu lub poproś Gemini o dopasowanie istniejącego interfejsu do obrazu docelowego. Można to połączyć ze zdalną obsługą MCP, np. aby połączyć się z plikiem Figmy i wygenerować interfejs Compose na podstawie projektów.
- Rozwiązywanie problemów z jakością interfejsu sprawdza interfejs pod kątem typowych problemów, takich jak problemy z dostępnością, a następnie proponuje rozwiązania.
Aby zobaczyć te narzędzia w akcji, obejrzyj tę demonstrację:
Przyjemnego pisania
Stale inwestujemy w Jetpack Compose, aby udostępniać Ci interfejsy API i narzędzia potrzebne do tworzenia atrakcyjnych i bogatych interfejsów. Twoja opinia jest dla nas bardzo ważna, dlatego podziel się z nami swoimi uwagami na temat tych zmian lub tym, co chciałbyś zobaczyć w przyszłości, w naszym systemie śledzenia problemów.
Czytaj dalej
-
Wiadomości o usługach
Od czasu wprowadzenia Jetpack Compose, czyli przez prawie 5 lat, inwestowaliśmy w dostarczanie Ci wszystkich funkcji, wydajności i narzędzi, których potrzebujesz do tworzenia niesamowitych interfejsów na różnych urządzeniach z Androidem.
Nick Butcher • Czas czytania: 2 minuty
-
Wiadomości o usługach
Zależy nam na tym, aby użytkownicy Google Play mieli jak najlepsze wrażenia, a deweloperzy dysponowali narzędziami i możliwościami dostosowania, które pozwolą im osiągnąć sukces.
Paul Feng • Czas czytania: 3 minuty
-
Wiadomości o usługach
W ubiegłym roku wprowadziliśmy weryfikację dewelopera aplikacji na Androida, aby zwiększyć bezpieczeństwo ekosystemu i uniemożliwić nieuczciwym podmiotom ukrywanie się za anonimowością podczas publikowania szkodliwych aplikacji.
Matthew Forsythe • Czas czytania: 2 minuty
Bądź na bieżąco
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.