20 May 2025
At Google I/O 2025, we announced a host of features, performance, stability, libraries, and tools updates for Jetpack Compose, our recommended Android UI toolkit. With Compose you can build excellent apps that work across devices. Compose has matured a lot since it was first announced (at Google I/O 2019!) and we're now seeing 60% of the top 1,000 apps in the Play Store such as MAX and Google Drive use and love it.
Since I/O last year, Compose Bill of Materials (BOM) version 2025.05.01 adds new features such as:
LookaheadScope { Box( Modifier .animateBounds(this@LookaheadScope) .width(if(inRow) 100.dp else 150.dp) .background(..) .border(..) ) }
For more details on these features, read What’s new in the Jetpack Compose April ’25 release and check out these talks from Google I/O:
If you’re looking to try out new Compose functionality, the alpha BOM offers new features that we're working on including:
Please try out the alpha features and provide feedback to help shape the future of Compose.
At Google I/O, we unveiled Material Expressive, Material Design’s latest evolution that helps you make your products even more engaging and easier to use. It's a comprehensive addition of new components, styles, motion and customization options that help you to build beautiful rich UIs. The Material3 library in the latest alpha BOM contains many of the new expressive components for you to try out.
Learn more to start building with Material Expressive.
Developing adaptive apps across form factors including phones, foldables, tablets, desktop, cars and Android XR is now easier with the latest enhancements to the Compose adaptive layouts library. The stable 1.1 release adds support for predictive back gestures for smoother transitions and pane expansion for more flexible two pane layouts on larger screens. Furthermore, the 1.2 (alpha) release adds more flexibility for how panes are displayed, adding strategies for reflowing and levitating.
Learn more about building adaptive android apps with Compose.
With each release of Jetpack Compose, we continue to prioritize performance improvements. The latest stable release includes significant rewrites and improvements to multiple sub-systems including semantics, focus and text optimizations. Best of all these are available to you simply by upgrading your Compose dependency; no code changes required.
We continue to work on further performance improvements, notable changes in the latest alpha BOM include:
Together these improvements eliminate nearly all jank in an internal benchmark.
We've heard from you that upgrading your Compose dependency can be challenging, encountering bugs or behaviour changes that prevent you from staying on the latest version. We've invested significantly in improving the stability of Compose, working closely with the many Google app teams building with Compose to detect and prevent issues before they even make it to a release.
Google apps develop against and release with snapshot builds of Compose; as such, Compose is tested against the hundreds of thousands of Google app tests and any Compose issues are immediately actioned by our team. We have recently invested in increasing the cadence of updating these snapshots and now update them daily from Compose tip-of-tree, which means we’re receiving feedback faster, and are able to resolve issues long before they reach a public release of the library.
Jetpack Compose also relies on @Experimental annotations to mark APIs that are subject to change. We heard your feedback that some APIs have remained experimental for a long time, reducing your confidence in the stability of Compose. We have invested in stabilizing experimental APIs to provide you a more solid API surface, and reduced the number of experimental APIs by 32% in the last year.
We have also heard that it can be hard to debug Compose crashes when your own code does not appear in the stack trace. In the latest alpha BOM, we have added a new opt-in feature to provide more diagnostic information. Note that this does not currently work with minified builds and comes at a performance cost, so we recommend only using this feature in debug builds.
class App : Application() { override fun onCreate() { // Enable only for debug flavor to avoid perf impact in release Composer.setDiagnosticStackTraceEnabled(BuildConfig.DEBUG) } }
We know that to build great apps, you need Compose integration in the libraries that interact with your app's UI.
A core library that powers any Compose app is Navigation. You told us that you often encountered limitations when managing state hoisting and directly manipulating the back stack with the current Compose Navigation solution. We went back to the drawing-board and completely reimagined how a navigation library should integrate with the Compose mental model. We're excited to introduce Navigation 3, a new artifact designed to empower you with greater control and simplify complex navigation flows.
We're also investing in Compose support for CameraX and Media3, making it easier to integrate camera capture and video playback into your UI with Compose idiomatic components.
@Composable private fun VideoPlayer( player: Player?, // from media3 modifier: Modifier = Modifier ) { Box(modifier) { PlayerSurface(player) // from media3-ui-compose player?.let { // custom play-pause button UI val playPauseButtonState = rememberPlayPauseButtonState(it) // from media3-ui-compose MyPlayPauseButton(playPauseButtonState, Modifier.align(BottomEnd).padding(16.dp)) } } }
We continue to improve the Android Studio tools for creating Compose UIs. The latest Narwhal canary includes:
For more information read What's new in Android development tools.
The Compose alpha BOM introduces two new annotations and associated lint checks to help you to write correct and performant Compose code. The @FrequentlyChangingValue annotation and FrequentlyChangedStateReadInComposition lint check warns in situations where function calls or property reads in composition might cause frequent recompositions. For example, frequent recompositions might happen when reading scroll position values or animating values. The @RememberInComposition annotation and RememberInCompositionDetector lint check warns in situations where constructors, functions, and property getters are called directly inside composition (e.g. the TextFieldState constructor) without being remembered.
We continue to invest in providing the features, performance, stability, libraries and tools that you need to build excellent apps. We value your input so please share feedback on our latest updates or what you'd like to see next.
Explore this announcement and all Google I/O 2025 updates on io.google starting May 22.