Nowości dotyczące produktów
Co nowego w Jetpack Compose w wersji z grudnia 2025 r.
Czas czytania: 6 minut
Wersja Jetpack Compose z grudnia 2025 r. jest już stabilna. Zawiera ona wersję 1.10 podstawowych modułów Compose i wersję 1.4 biblioteki Material 3 (pełne mapowanie BOM), a także nowe funkcje i znaczące ulepszenia wydajności.
Aby korzystać z dzisiejszej wersji, zaktualizuj wersję BOM Compose do 2025.12.00:
implementation(platform("androidx.compose:compose-bom:2025.12.00"))
Ulepszenia wydajności
Wiemy, że wydajność aplikacji w czasie działania jest niezwykle ważna dla Ciebie i Twoich użytkowników, dlatego zespół Compose przykłada do niej dużą wagę. Ta wersja wprowadza szereg ulepszeń, które uzyskasz, po prostu aktualizując aplikację do najnowszej wersji. Nasze wewnętrzne testy porównawcze przewijania pokazują, że Compose osiąga teraz wydajność porównywalną z tą, którą można uzyskać przy użyciu widoków:
Test porównawczy wydajności przewijania porównujący widoki i Jetpack Compose w różnych wersjach Compose
Wstrzymywalna kompozycja w leniwym pobieraniu z wyprzedzeniem
Wstrzymywalna kompozycja w leniwym pobieraniu z wyprzedzeniem jest teraz domyślnie włączona. Jest to fundamentalna zmiana w sposobie działania harmonogramu Compose, która ma na celu znaczne zmniejszenie zacięć podczas intensywnej pracy interfejsu.
Wcześniej po rozpoczęciu kompozycji musiała ona zostać ukończona. Jeśli kompozycja była złożona, mogła blokować wątek główny na dłużej niż jedną klatkę, co powodowało zawieszanie się interfejsu. Dzięki wstrzymywalnej kompozycji środowisko wykonawcze może teraz „wstrzymać” pracę, jeśli zabraknie mu czasu, i wznowić ją w następnej klatce. Jest to szczególnie skuteczne w połączeniu z leniwym pobieraniem z wyprzedzeniem, które przygotowuje klatki z wyprzedzeniem. Interfejsy API CacheWindow układu leniwego wprowadzone w Compose 1.9 to świetny sposób na pobieranie większej ilości treści z wyprzedzeniem i korzystanie z wstrzymywalnej kompozycji, aby uzyskać znacznie płynniejsze działanie interfejsu.
Wstrzymywalna kompozycja w połączeniu z leniwym pobieraniem z wyprzedzeniem pomaga zmniejszyć zacięcia
Zoptymalizowaliśmy też wydajność w innych miejscach, wprowadzając ulepszenia w Modifier.onPlaced, Modifier.onVisibilityChanged i innych implementacjach modyfikatorów. Będziemy nadal inwestować w poprawę wydajności Compose.
Nowe funkcje
Retain
Compose oferuje szereg interfejsów API do przechowywania stanu i zarządzania nim w różnych cyklach życia. Na przykład remember utrwala stan w różnych kompozycjach, a rememberSavable/rememberSerializable – w przypadku ponownego tworzenia aktywności lub procesu.retain to nowy interfejs API, który znajduje się między tymi interfejsami i umożliwia utrwalanie wartości w przypadku zmian konfiguracji bez serializacji, ale nie w przypadku śmierci procesu. Ponieważ retain nie serializuje stanu, możesz utrwalać obiekty takie jak wyrażenia lambda, przepływy i duże obiekty, np. mapy bitowe, których nie można łatwo serializować. Możesz na przykład użyć retain do zarządzania odtwarzaczem multimediów (np. ExoPlayer), aby zapewnić, ż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 wpłynęła na projekt tej funkcji i przyczyniła się do jej powstania.
Material 1.4
Wersja 1.4.0 biblioteki material3 dodaje szereg nowych komponentów i ulepszeń:
TextFieldoferuje teraz eksperymentalną wersję opartą naTextFieldState, która zapewnia bardziej niezawodną metodę zarządzania stanem tekstu. Dodatkowo dostępne są teraz noweSecureTextFieldiOutlinedSecureTextFieldwarianty. KomponentTextbiblioteki Material obsługuje teraz zachowanie autoSize.- Komponent karuzeli oferuje teraz nowy
HorizontalCenteredHeroCarouselwariant. TimePickerobsługuje teraz przełączanie się między trybem selektora a trybem wprowadzania.- A pionowy uchwyt do przeciągania pomaga użytkownikom zmieniać rozmiar i/lub położenie panelu adaptacyjnego.
Karuzela pozioma wyśrodkowana
Pamiętaj, że Material 3 Expressive APIs są nadal rozwijane w wersjach alfa biblioteki material3. Więcej informacji znajdziesz w tym niedawnym wystąpieniu:
Nowe funkcje animacji
Stale rozwijamy nasze interfejsy API animacji, w tym aktualizacje umożliwiające dostosowywanie animacji udostępnionych elementów.
Dynamiczne udostępnione elementy
Domyślnie animacje sharedElement() i sharedBounds() próbują animować
zmiany układu, gdy w stanie docelowym zostanie znaleziony pasujący klucz. Możesz jednak wyłączyć tę animację dynamicznie na podstawie określonych warunków, takich jak kierunek nawigacji lub bieżący stan interfejsu.
Aby kontrolować, czy ma wystąpić przejście udostępnionego elementu, możesz teraz dostosować SharedContentConfig przekazywany do rememberSharedContentState(). Właściwość isEnabled określa, czy udostępniony element 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 ostateczne położenie komponentu podczas wykonywania animacji udostępnionych elementów. 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 tej wskazówce wideo:
Prędkość początkowa w przejściach udostępnionych elementów
Ta wersja dodaje nowy interfejs API przejścia udostępnionego elementu, prepareTransitionWithInitialVelocity, który umożliwia przekazywanie prędkości początkowej (np. z gestu) do przejścia udostępnionego elementu:
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 udostępnionego elementu, które rozpoczyna się z prędkością początkową z gestu
Przejścia zasłonięte
EnterTransition i ExitTransition określają, jak komponent AnimatedVisibility/AnimatedContent pojawia się lub znika. Nowa eksperymentalna opcja zasłony umożliwia określenie koloru, którym ma być zasłonięta lub przyciemniona treść. Możesz na przykład zastosować efekt stopniowego pojawiania się lub znikania półprzezroczystej czarnej warstwy na treści:
Animowana treść zasłonięta – podczas animacji widoczna jest półprzezroczysta zasłona (lub przyciemnienie) na treści siatki
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 Compose 1.9 wprowadziliśmy Modifier.onVisibilityChanged i Modifier.onFirstVisible. Po przeanalizowaniu Twoich opinii okazało się, że nie można deterministycznie spełnić warunków Modifier.onFirstVisible, zwłaszcza gdy element po raz pierwszy staje się widoczny. Na przykład układ leniwy może usuwać elementy, które przewijają się poza obszar widoczny, a następnie ponownie je komponować, jeśli wrócą do widoku. W takiej sytuacji wywoływane jest ponownie wywołanie zwrotne onFirstVisible, ponieważ jest to nowo skomponowany element. Podobne zachowanie wystąpi również w przypadku powrotu do wcześniej odwiedzonego ekranu zawierającego onFirstVisible. Z tego powodu 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 współprogramów w testach
Planujemy zmienić wysyłanie współprogramów w testach, aby zmniejszyć ich niestabilność i wykrywać więcej problemów. Obecnie testy używają UnconfinedTestDispatcher, który różni się od zachowania w środowisku produkcyjnym. Na przykład efekty mogą być wykonywane 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ć zachowanie do środowiska produkcyjnego. Nowe zachowanie możesz wypróbować teraz w wersji 1.10:
@get:Rule // also createAndroidComposeRule, createEmptyComposeRule val rule = createComposeRule(effectContext = StandardTestDispatcher())
Użycie StandardTestDispatcher spowoduje dodanie zadań do kolejki, dlatego musisz użyć mechanizmów synchronizacji, takich jak composeTestRule.waitForIdle() lub composeTestRule.runOnIdle(). Jeśli test używa runTest, musisz się upewnić, że runTest i reguła Compose współdzielą tę samą instancję 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
Świetne interfejsy API zasługują na świetne narzędzia, a Android Studio ma kilka nowych funkcji dla deweloperów Compose:
- Przekształć interfejs: aby iterować projekty, kliknij prawym przyciskiem myszy
@Preview, wybierz Przekształć interfejs, a następnie opisz zmianę w języku naturalnym. - Wygeneruj
@Preview: kliknij prawym przyciskiem myszy komponent i wybierz Gemini > Wygeneruj podgląd [nazwa komponentu] . - Dostosuj symbole Material dzięki nowej obsłudze wariantów ikon w kreatorze komponentów wektorowych.
- Wygeneruj kod na podstawie zrzutu ekranu lub zapytaj Gemini o dopasowanie istniejącego interfejsu do obrazu docelowego. Można to połączyć z obsługą zdalnego MCP np. aby połączyć się z plikiem Figma i wygenerować interfejs Compose na podstawie projektów.
- Rozwiąż problemy z jakością interfejsu : przeprowadza audyt interfejsu pod kątem typowych problemów, takich jak problemy z ułatwieniami dostępu, a następnie proponuje rozwiązania.
Aby zobaczyć te narzędzia w akcji, obejrzyj tę niedawną prezentację:
Miłego komponowania
Stale inwestujemy w Jetpack Compose, aby zapewnić Ci interfejsy API i narzędzia potrzebne do tworzenia pięknych, bogatych interfejsów. Cenimy Twoje opinie, dlatego podziel się nimi na temat tych zmian lub tego, co chcesz zobaczyć w przyszłości, w naszym narzędziu do śledzenia problemów.
Czytaj dalej
-
Nowości dotyczące produktów
W ciągu prawie 5 lat od wprowadzenia Jetpack Compose zainwestowaliśmy w udostępnienie Ci wszystkich funkcji, wydajności i narzędzi potrzebnych do tworzenia niesamowitych interfejsów na różnych urządzeniach z Androidem.
Nick Butcher • Czas czytania: 2 minuty
-
Nowości dotyczące produktów
Podczas tegorocznej konferencji Google I/O mówiliśmy o naszym rozwijającym się modelu biznesowym, który oferuje większy wybór i nowe sposoby na odkrywanie Twoich aplikacji i treści w Sklepie Play i poza nim. Przedstawiliśmy też zaawansowane narzędzia i statystyki, które pomogą Ci rozwijać firmę przy mniejszym nakładzie pracy.
Paul Feng • Czas czytania: 6 minut
-
Nowości dotyczące produktów
Z przyjemnością informujemy, że Android XR obsługuje już oficjalnie Unreal Engine i Godot. Wprowadzamy też nowe narzędzia, które zwiększą Twoją produktywność i umożliwią korzystanie z nowych funkcji XR: Android XR Engine Hub i Android XR Interaction Framework.
Luke Hopkins • Czas czytania: 4 minuty
Bądź na bieżąco
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.