CINXE.COM
Compose Runtime | Jetpack | Android Developers
<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="721724668570-nbkv1cfusk7kk4eni4pjvepaus73b13t.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award"> <meta property="og:site_name" content="Android Developers"> <meta property="og:type" content="website"><meta name="theme-color" content="#34a853"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/android/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400,500,600,700|Google+Sans+Text:400,400italic,500,500italic,600,600italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/css/app.css"> <link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/css/dark-theme.css" disabled> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/favicon.svg"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/touchicon-180.png"><link rel="canonical" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime"><link rel="search" type="application/opensearchdescription+xml" title="Android Developers" href="https://developer.android.com/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime" /><link rel="alternate" hreflang="x-default" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime" /><link rel="alternate" hreflang="ar" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=ar" /><link rel="alternate" hreflang="bn" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=fa" /><link rel="alternate" hreflang="fr" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=fr" /><link rel="alternate" hreflang="de" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=de" /><link rel="alternate" hreflang="he" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=he" /><link rel="alternate" hreflang="hi" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=hi" /><link rel="alternate" hreflang="id" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=id" /><link rel="alternate" hreflang="it" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=it" /><link rel="alternate" hreflang="ja" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=ja" /><link rel="alternate" hreflang="ko" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=ko" /><link rel="alternate" hreflang="pl" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=pl" /><link rel="alternate" hreflang="pt-BR" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=pt-br" /><link rel="alternate" hreflang="ru" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=ru" /><link rel="alternate" hreflang="es-419" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=es-419" /><link rel="alternate" hreflang="th" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=th" /><link rel="alternate" hreflang="tr" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=tr" /><link rel="alternate" hreflang="vi" href="https://developer.android.com/jetpack/androidx/releases/compose-runtime?hl=vi" /><title>Compose Runtime | Jetpack | Android Developers</title> <meta property="og:title" content="Compose Runtime | Jetpack | Android Developers"><meta property="og:url" content="https://developer.android.com/jetpack/androidx/releases/compose-runtime"><meta property="og:image" content="https://developer.android.com/static/images/social/android-developers.png"> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="675"><meta property="og:locale" content="en"><meta name="twitter:card" content="summary_large_image"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Compose Runtime" } </script><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Get started", "item": "https://developer.android.com/get-started/overview" },{ "@type": "ListItem", "position": 2, "name": "Jetpack", "item": "https://developer.android.com/jetpack" },{ "@type": "ListItem", "position": 3, "name": "Compose Runtime", "item": "https://developer.android.com/jetpack/androidx/releases/compose-runtime" }] } </script> <link rel="stylesheet" href="/extras.css"></head> <body class="" template="page" theme="android-theme" type="article" appearance layout="docs" display-toc pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner nocontent"> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="androidDevelopers" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-dark-theme.svg" media="(prefers-color-scheme: dark)" class="devsite-dark-theme" alt="Android Developers"> <img src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup.svg" class="devsite-site-logo" alt="Android Developers"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> <devsite-tabs class="upper-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Upper tabs"> <tab class="devsite-dropdown devsite-dropdown-full devsite-active "> <a href="https://developer.android.com/jetpack" track-metadata-eventdetail="https://developer.android.com/jetpack" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-type="nav" track-metadata-position="nav - essentials" track-metadata-module="primary nav" aria-label="Essentials, selected" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" > Essentials </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Essentials" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack" track-metadata-position="nav - essentials" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown android-dropdown-primary android-dropdown-studio"> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Gemini in Android Studio</li> <li class="devsite-nav-description">Your AI development companion for Android development. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/gemini-in-android" track-type="nav" track-metadata-eventdetail="https://developer.android.com/gemini-in-android" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="gemini in android studio" tooltip class="button button-primary" > <div class="devsite-nav-item-title"> Learn more </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="gemini in android studio" tooltip class="button button-white" > <div class="devsite-nav-item-title"> Get Android Studio </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-launch"> <li class="devsite-nav-title" role="heading" tooltip>Get started</li> <li class="devsite-nav-description">Start by creating your first app. Go deeper with our training courses or explore app development on your own. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/get-started/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/get-started/overview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Hello world </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/courses" track-type="nav" track-metadata-eventdetail="https://developer.android.com/courses" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Training courses </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/get-started/codelabs" track-type="nav" track-metadata-eventdetail="https://developer.android.com/get-started/codelabs" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Tutorials </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/kotlin" track-type="nav" track-metadata-eventdetail="https://developer.android.com/kotlin" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Kotlin for Android </div> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/console/about/guides/monetize/" track-type="nav" track-metadata-eventdetail="https://play.google.com/console/about/guides/monetize/" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Monetization with Play ↗️ </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-multiple-screens"> <li class="devsite-nav-title" role="heading" tooltip>Extend by device</li> <li class="devsite-nav-description">Build apps that give your users seamless experiences from phones to tablets, watches, and more. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/adaptive-apps" track-type="nav" track-metadata-eventdetail="https://developer.android.com/adaptive-apps" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Adaptive apps </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/wear" track-type="nav" track-metadata-eventdetail="https://developer.android.com/wear" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/cars" track-type="nav" track-metadata-eventdetail="https://developer.android.com/cars" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Android for Cars </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/tv" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/chrome-os" track-type="nav" track-metadata-eventdetail="https://developer.android.com/chrome-os" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> ChromeOS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/multi-device-development" track-type="nav" track-metadata-eventdetail="https://developer.android.com/multi-device-development" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Cross-device SDK </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-platform"> <li class="devsite-nav-title" role="heading" tooltip>Build by category</li> <li class="devsite-nav-description">Learn to build for your use case by following Google's prescriptive and opinionated guidance. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/games" track-type="nav" track-metadata-eventdetail="https://developer.android.com/games" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Games </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/media" track-type="nav" track-metadata-eventdetail="https://developer.android.com/media" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Camera & Media </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/social-and-messaging" track-type="nav" track-metadata-eventdetail="https://developer.android.com/social-and-messaging" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Social & messaging </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/health-and-fitness" track-type="nav" track-metadata-eventdetail="https://developer.android.com/health-and-fitness" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Health & Fitness </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/productivity" track-type="nav" track-metadata-eventdetail="https://developer.android.com/productivity" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Productivity </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/work/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/work/overview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Enterprise apps </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-stars"> <li class="devsite-nav-title" role="heading" tooltip>Get the latest</li> <li class="devsite-nav-description">Stay in touch with the latest releases throughout the year, join our preview programs, and give us your feedback. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/latest-updates" track-type="nav" track-metadata-eventdetail="https://developer.android.com/latest-updates" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Latest updates </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/latest-updates/experimental" track-type="nav" track-metadata-eventdetail="https://developer.android.com/latest-updates/experimental" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Experimental updates </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio/preview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio/preview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Android Studio preview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/versions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/versions" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Jetpack & Compose libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/wearables/versions/4" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/wearables/versions/4" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Wear OS preview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design-for-safety/privacy-sandbox" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design-for-safety/privacy-sandbox" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Privacy Sandbox </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-dropdown-full "> <a href="https://developer.android.com/design" track-metadata-eventdetail="https://developer.android.com/design" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-type="nav" track-metadata-position="nav - design & plan" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" > Design & Plan </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Design & Plan" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design" track-metadata-position="nav - design & plan" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-layout"> <li class="devsite-nav-title" role="heading" tooltip>UI Design</li> <li class="devsite-nav-description">Design a beautiful user interface using Android best practices.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Design for Android </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/mobile" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/mobile" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Mobile </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/large-screens" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/large-screens" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Large screens (e.g., tablets) </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/widget" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/widget" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Widgets </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/wear" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/wear" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/tv" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-design"> <li class="devsite-nav-title" role="heading" tooltip>Architecture</li> <li class="devsite-nav-description">Design robust, testable, and maintainable app logic and services.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/architecture/intro" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/architecture/intro" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Introduction </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/libraries/view-binding" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/libraries/view-binding" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/navigation/navigation-principles" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/navigation/navigation-principles" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Navigation </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/modularization" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/modularization" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Modularization </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/testing/fundamentals" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/testing/fundamentals" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Testing </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-vitals"> <li class="devsite-nav-title" role="heading" tooltip>Quality</li> <li class="devsite-nav-description">Plan for app quality and align with Play store guidelines.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/core-value" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/core-value" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Core value </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/user-experience" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/user-experience" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> User experience </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/technical" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/technical" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Technical quality </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/privacy-and-security" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/privacy-and-security" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Security </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-security-2"> <li class="devsite-nav-title" role="heading" tooltip>Security</li> <li class="devsite-nav-description">Safeguard users against threats and ensure a secure Android experience.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/security" track-type="nav" track-metadata-eventdetail="https://developer.android.com/security" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/privacy-and-security/about" track-type="nav" track-metadata-eventdetail="https://developer.android.com/privacy-and-security/about" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Privacy </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/identity" track-type="nav" track-metadata-eventdetail="https://developer.android.com/identity" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Identity </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/security/fraud-prevention" track-type="nav" track-metadata-eventdetail="https://developer.android.com/security/fraud-prevention" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Fraud prevention </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-earth"> <li class="devsite-nav-title" role="heading" tooltip>Build for Billions</li> <li class="devsite-nav-description">Create the best experience for entry-level devices</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/build-for-billions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/build-for-billions" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/docs/quality-guidelines/build-for-billions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/docs/quality-guidelines/build-for-billions" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> About new markets </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/androidgo" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/androidgo" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> Android (Go edition) </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-dropdown-full "> <a href="https://developer.android.com/develop" track-metadata-eventdetail="https://developer.android.com/develop" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-type="nav" track-metadata-position="nav - develop" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > Develop </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Develop" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop" track-metadata-position="nav - develop" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown android-dropdown-primary android-dropdown-ai"> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Build AI experiences</li> <li class="devsite-nav-description">Build AI-powered Android apps with Gemini APIs and more. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/ai" track-type="nav" track-metadata-eventdetail="https://developer.android.com/ai" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="build ai experiences" tooltip class="button button-primary" > <div class="devsite-nav-item-title"> Get started </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-flag"> <li class="devsite-nav-title" role="heading" tooltip>Core areas</li> <li class="devsite-nav-description">Get the samples and docs for the features you need.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/samples" track-type="nav" track-metadata-eventdetail="https://developer.android.com/samples" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Samples </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quick-guides" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quick-guides" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Try Quick Guidesᵇᵉᵗᵃ </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/ui" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/ui" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> User interfaces </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/permissions/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/permissions/overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Permissions </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/background-work" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/background-work" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Background work </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/data" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/data" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Data and files </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop#core-areas" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop#core-areas" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> All core areas ⤵️ </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-tools-2"> <li class="devsite-nav-title" role="heading" tooltip>Tools and workflow</li> <li class="devsite-nav-description">Use the IDE to write and build your app, or create your own pipeline.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio/write" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio/write" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Write and debug code </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/build/gradle-build-overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/build/gradle-build-overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Build projects </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/testing" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/testing" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Test your app </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/performance/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/performance/overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Performance </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/tools" track-type="nav" track-metadata-eventdetail="https://developer.android.com/tools" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Command-line tools </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/reference/tools/gradle-api" track-type="nav" track-metadata-eventdetail="https://developer.android.com/reference/tools/gradle-api" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Gradle plugin API </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-multiple-screens"> <li class="devsite-nav-title" role="heading" tooltip>Device tech</li> <li class="devsite-nav-description">Write code for form factors. Connect devices and share data.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/large-screens/get-started-with-large-screens" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/large-screens/get-started-with-large-screens" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Large screens (e.g., tablets) </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/wearables" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/wearables" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/health-and-fitness/guides" track-type="nav" track-metadata-eventdetail="https://developer.android.com/health-and-fitness/guides" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android Health </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/connectivity/cross-device-sdk/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/connectivity/cross-device-sdk/overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Cross-device SDK </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/cars" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/cars" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android for Cars </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/tv" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/chrome-os/intro" track-type="nav" track-metadata-eventdetail="https://developer.android.com/chrome-os/intro" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> ChromeOS </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-core-library"> <li class="devsite-nav-title" role="heading" tooltip>Libraries</li> <li class="devsite-nav-description">Browse API reference documentation with all the details.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/reference/packages" track-type="nav" track-metadata-eventdetail="https://developer.android.com/reference/packages" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Android platform </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/explorer" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/explorer" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Jetpack libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/releases/compose" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/releases/compose" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Compose libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/android/reference/packages" track-type="nav" track-metadata-eventdetail="https://developers.google.com/android/reference/packages" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Google Play services ↗️ </div> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/sdks" track-type="nav" track-metadata-eventdetail="https://play.google.com/sdks" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Google Play SDK index ↗️ </div> </a> </li> </ul> </div> </div> </div> </tab> <tab > <a href="https://developer.android.com/distribute" track-metadata-eventdetail="https://developer.android.com/distribute" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - google play" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Google Play" track-name="google play" > Google Play </a> </tab> <tab > <a href="https://developer.android.com/community" track-metadata-eventdetail="https://developer.android.com/community" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - community" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Community" track-name="community" > Community </a> </tab> </nav> </devsite-tabs> </div> <devsite-search enable-signin enable-search enable-suggestions enable-query-completion project-name="Jetpack" tenant-name="Android Developers" > <form class="devsite-search-form" action="https://developer.android.com/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-appearance-selector></devsite-appearance-selector> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <a class="devsite-header-link devsite-top-button button gc-analytics-event" href="https://developer.android.com/studio" data-category="Site-Wide Custom Events" data-label="Site header link" > Android Studio </a> <devsite-user enable-profiles id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section "> <div class="devsite-header-background"> <div class="devsite-product-id-row" > <div class="devsite-product-description-row"> <ul class="devsite-breadcrumb-list" aria-label="Lower header breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developer.android.com/get-started/overview" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Get started" > Get started </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/jetpack" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="Jetpack" > Jetpack </a> </li> </ul> </div> </div> <div class="devsite-doc-set-nav-row"> <devsite-tabs class="lower-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Lower tabs"> <tab > <a href="https://developer.android.com/jetpack" track-metadata-eventdetail="https://developer.android.com/jetpack" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - overview" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" > Overview </a> </tab> <tab > <a href="https://developer.android.com/jetpack/getting-started" track-metadata-eventdetail="https://developer.android.com/jetpack/getting-started" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - guides" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Guides" track-name="guides" > Guides </a> </tab> <tab > <a href="https://developer.android.com/jetpack/samples" track-metadata-eventdetail="https://developer.android.com/jetpack/samples" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - samples" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Samples" track-name="samples" > Samples </a> </tab> <tab class="devsite-active"> <a href="https://developer.android.com/jetpack/androidx/explorer" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/explorer" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - libraries" track-metadata-module="primary nav" aria-label="Libraries, selected" data-category="Site-Wide Custom Events" data-label="Tab: Libraries" track-name="libraries" > Libraries </a> </tab> </nav> </devsite-tabs> </div> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars > <div class="devsite-book-nav-filter" > <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="androidDevelopers" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-dark-theme.svg" media="(prefers-color-scheme: dark)" class="devsite-dark-theme" alt="Android Developers"> <img src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup.svg" class="devsite-site-logo" alt="Android Developers"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <a href="/jetpack" class="devsite-nav-title gc-analytics-event devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Essentials" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Essentials </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" > <span class="devsite-nav-text" tooltip menu="Essentials"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Essentials"> </span> </span> </li> </ul> <ul class="devsite-nav-responsive-tabs"> <li class="devsite-nav-item"> <a href="/jetpack" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/getting-started" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Guides" track-name="guides" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Guides" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Guides </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/samples" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Samples" track-name="samples" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Samples" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Samples </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/explorer" class="devsite-nav-title gc-analytics-event devsite-nav-has-children devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Libraries" track-name="libraries" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Libraries" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip menu="_book"> Libraries </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="_book"> </span> </a> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/design" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Design & Plan" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Design & Plan </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" > <span class="devsite-nav-text" tooltip menu="Design & Plan"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Design & Plan"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/develop" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Develop" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Develop </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > <span class="devsite-nav-text" tooltip menu="Develop"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Develop"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/distribute" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Google Play" track-name="google play" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play </span> </a> </li> <li class="devsite-nav-item"> <a href="/community" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Community" track-name="community" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Community" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Community </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Studio" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Studio </span> </a> </li> </ul> </div> <div class="devsite-mobile-nav-bottom"> <ul class="devsite-nav-list" menu="_book"> <li class="devsite-nav-item"><a href="/jetpack/androidx/explorer" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/explorer" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/explorer" ><span class="devsite-nav-text" tooltip>Explore the libraries</span></a></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Library Releases</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/jetpack/androidx/versions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/all-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/all-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/all-channel" ><span class="devsite-nav-text" tooltip>All Channels</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/stable-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/stable-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/stable-channel" ><span class="devsite-nav-text" tooltip>Stable Channel</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/rc-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/rc-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/rc-channel" ><span class="devsite-nav-text" tooltip>RC Channel</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/beta-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/beta-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/beta-channel" ><span class="devsite-nav-text" tooltip>Beta Channel</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/alpha-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/alpha-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/alpha-channel" ><span class="devsite-nav-text" tooltip>Alpha Channel</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Release Notes</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/activity" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/activity" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/activity" ><span class="devsite-nav-text" tooltip>androidx.activity</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/ads" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/ads" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/ads" ><span class="devsite-nav-text" tooltip>androidx.ads</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/annotation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/annotation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/annotation" ><span class="devsite-nav-text" tooltip>androidx.annotation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/appcompat" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/appcompat" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/appcompat" ><span class="devsite-nav-text" tooltip>androidx.appcompat</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/appsearch" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/appsearch" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/appsearch" ><span class="devsite-nav-text" tooltip>androidx.appsearch</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/arch-core" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/arch-core" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/arch-core" ><span class="devsite-nav-text" tooltip>androidx.arch.core</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/asynclayoutinflater" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/asynclayoutinflater" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/asynclayoutinflater" ><span class="devsite-nav-text" tooltip>androidx.asynclayoutinflater</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/autofill" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/autofill" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/autofill" ><span class="devsite-nav-text" tooltip>androidx.autofill</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/benchmark" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/benchmark" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/benchmark" ><span class="devsite-nav-text" tooltip>androidx.benchmark</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/biometric" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/biometric" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/biometric" ><span class="devsite-nav-text" tooltip>androidx.biometric</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/bluetooth" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/bluetooth" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/bluetooth" ><span class="devsite-nav-text" tooltip>androidx.bluetooth</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/browser" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/browser" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/browser" ><span class="devsite-nav-text" tooltip>androidx.browser</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/camera" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/camera" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/camera" ><span class="devsite-nav-text" tooltip>androidx.camera</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/camera-viewfinder" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/camera-viewfinder" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/camera-viewfinder" ><span class="devsite-nav-text" tooltip>androidx.camera.viewfinder</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/car" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/car" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/car" ><span class="devsite-nav-text" tooltip>androidx.car</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/car-app" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/car-app" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/car-app" ><span class="devsite-nav-text" tooltip>androidx.car.app</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/cardview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/cardview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/cardview" ><span class="devsite-nav-text" tooltip>androidx.cardview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/collection" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/collection" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/collection" ><span class="devsite-nav-text" tooltip>androidx.collection</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose" ><span class="devsite-nav-text" tooltip>androidx.compose</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-animation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-animation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-animation" ><span class="devsite-nav-text" tooltip>androidx.compose.animation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-compiler" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-compiler" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-compiler" ><span class="devsite-nav-text" tooltip>androidx.compose.compiler</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-foundation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-foundation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-foundation" ><span class="devsite-nav-text" tooltip>androidx.compose.foundation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-material" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-material" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-material" ><span class="devsite-nav-text" tooltip>androidx.compose.material</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-material3" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-material3" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-material3" ><span class="devsite-nav-text" tooltip>androidx.compose.material3</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-material3-adaptive" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-material3-adaptive" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-material3-adaptive" ><span class="devsite-nav-text" tooltip>androidx.compose.material3.adaptive</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-runtime" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-runtime" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-runtime" ><span class="devsite-nav-text" tooltip>androidx.compose.runtime</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-ui" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-ui" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-ui" ><span class="devsite-nav-text" tooltip>androidx.compose.ui</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/concurrent" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/concurrent" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/concurrent" ><span class="devsite-nav-text" tooltip>androidx.concurrent</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/constraintlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/constraintlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/constraintlayout" ><span class="devsite-nav-text" tooltip>androidx.constraintlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/contentpager" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/contentpager" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/contentpager" ><span class="devsite-nav-text" tooltip>androidx.contentpager</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/coordinatorlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/coordinatorlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/coordinatorlayout" ><span class="devsite-nav-text" tooltip>androidx.coordinatorlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/core" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/core" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/core" ><span class="devsite-nav-text" tooltip>androidx.core</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/core-uwb" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/core-uwb" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/core-uwb" ><span class="devsite-nav-text" tooltip>androidx.core.uwb</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/credentials" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/credentials" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/credentials" ><span class="devsite-nav-text" tooltip>androidx.credentials</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/credentials/registry" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/credentials/registry" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/credentials/registry" ><span class="devsite-nav-text" tooltip>androidx.credentials.registry</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/cursoradapter" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/cursoradapter" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/cursoradapter" ><span class="devsite-nav-text" tooltip>androidx.cursoradapter</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/customview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/customview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/customview" ><span class="devsite-nav-text" tooltip>androidx.customview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/databinding" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/databinding" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/databinding" ><span class="devsite-nav-text" tooltip>androidx.databinding</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/datastore" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/datastore" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/datastore" ><span class="devsite-nav-text" tooltip>androidx.datastore</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/documentfile" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/documentfile" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/documentfile" ><span class="devsite-nav-text" tooltip>androidx.documentfile</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/draganddrop" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/draganddrop" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/draganddrop" ><span class="devsite-nav-text" tooltip>androidx.draganddrop</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/drawerlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/drawerlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/drawerlayout" ><span class="devsite-nav-text" tooltip>androidx.drawerlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/dynamicanimation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/dynamicanimation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/dynamicanimation" ><span class="devsite-nav-text" tooltip>androidx.dynamicanimation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/emoji" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/emoji" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/emoji" ><span class="devsite-nav-text" tooltip>androidx.emoji</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/emoji2" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/emoji2" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/emoji2" ><span class="devsite-nav-text" tooltip>androidx.emoji2</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/enterprise" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/enterprise" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/enterprise" ><span class="devsite-nav-text" tooltip>androidx.enterprise</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/exifinterface" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/exifinterface" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/exifinterface" ><span class="devsite-nav-text" tooltip>androidx.exifinterface</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/fragment" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/fragment" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/fragment" ><span class="devsite-nav-text" tooltip>androidx.fragment</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/games" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/games" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/games" ><span class="devsite-nav-text" tooltip>androidx.games</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/glance" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/glance" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/glance" ><span class="devsite-nav-text" tooltip>androidx.glance</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/graphics" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/graphics" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/graphics" ><span class="devsite-nav-text" tooltip>androidx.graphics</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/gridlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/gridlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/gridlayout" ><span class="devsite-nav-text" tooltip>androidx.gridlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/health" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/health" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/health" ><span class="devsite-nav-text" tooltip>androidx.health</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/health-connect" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/health-connect" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/health-connect" ><span class="devsite-nav-text" tooltip>androidx.health.connect</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/heifwriter" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/heifwriter" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/heifwriter" ><span class="devsite-nav-text" tooltip>androidx.heifwriter</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/hilt" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/hilt" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/hilt" ><span class="devsite-nav-text" tooltip>androidx.hilt</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/ink" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/ink" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/ink" ><span class="devsite-nav-text" tooltip>androidx.ink</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/input" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/input" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/input" ><span class="devsite-nav-text" tooltip>androidx.input</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/interpolator" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/interpolator" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/interpolator" ><span class="devsite-nav-text" tooltip>androidx.interpolator</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/javascriptengine" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/javascriptengine" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/javascriptengine" ><span class="devsite-nav-text" tooltip>androidx.javascriptengine</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/leanback" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/leanback" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/leanback" ><span class="devsite-nav-text" tooltip>androidx.leanback</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/legacy" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/legacy" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/legacy" ><span class="devsite-nav-text" tooltip>androidx.legacy</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/lifecycle" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/lifecycle" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/lifecycle" ><span class="devsite-nav-text" tooltip>androidx.lifecycle</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/lint" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/lint" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/lint" ><span class="devsite-nav-text" tooltip>androidx.lint</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/loader" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/loader" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/loader" ><span class="devsite-nav-text" tooltip>androidx.loader</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/localbroadcastmanager" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/localbroadcastmanager" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/localbroadcastmanager" ><span class="devsite-nav-text" tooltip>androidx.localbroadcastmanager</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/media" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/media" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/media" ><span class="devsite-nav-text" tooltip>androidx.media</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/media2" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/media2" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/media2" ><span class="devsite-nav-text" tooltip>androidx.media2</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/media3" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/media3" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/media3" ><span class="devsite-nav-text" tooltip>androidx.media3</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/mediarouter" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/mediarouter" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/mediarouter" ><span class="devsite-nav-text" tooltip>androidx.mediarouter</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/multidex" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/multidex" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/multidex" ><span class="devsite-nav-text" tooltip>androidx.multidex</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/metrics" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/metrics" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/metrics" ><span class="devsite-nav-text" tooltip>androidx.metrics</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/navigation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/navigation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/navigation" ><span class="devsite-nav-text" tooltip>androidx.navigation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/paging" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/paging" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/paging" ><span class="devsite-nav-text" tooltip>androidx.paging</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/palette" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/palette" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/palette" ><span class="devsite-nav-text" tooltip>androidx.palette</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/pdf" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/pdf" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/pdf" ><span class="devsite-nav-text" tooltip>androidx.pdf</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/percentlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/percentlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/percentlayout" ><span class="devsite-nav-text" tooltip>androidx.percentlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/preference" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/preference" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/preference" ><span class="devsite-nav-text" tooltip>androidx.preference</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/print" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/print" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/print" ><span class="devsite-nav-text" tooltip>androidx.print</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-activity" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-activity" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-activity" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.activity</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-ads" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-ads" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-ads" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.ads</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-plugins" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-plugins" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-plugins" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.plugins</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-sdkruntime" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-sdkruntime" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-sdkruntime" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.sdkruntime</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-tools" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-tools" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-tools" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.tools</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-ui" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-ui" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-ui" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.ui</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/profileinstaller" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/profileinstaller" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/profileinstaller" ><span class="devsite-nav-text" tooltip>androidx.profileinstaller</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/recommendation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/recommendation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/recommendation" ><span class="devsite-nav-text" tooltip>androidx.recommendation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/recyclerview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/recyclerview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/recyclerview" ><span class="devsite-nav-text" tooltip>androidx.recyclerview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/remotecallback" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/remotecallback" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/remotecallback" ><span class="devsite-nav-text" tooltip>androidx.remotecallback</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/resourceinspection" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/resourceinspection" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/resourceinspection" ><span class="devsite-nav-text" tooltip>androidx.resourceinspection</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/room" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/room" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/room" ><span class="devsite-nav-text" tooltip>androidx.room</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/savedstate" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/savedstate" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/savedstate" ><span class="devsite-nav-text" tooltip>androidx.savedstate</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/security" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/security" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/security" ><span class="devsite-nav-text" tooltip>androidx.security</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/sharetarget" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/sharetarget" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/sharetarget" ><span class="devsite-nav-text" tooltip>androidx.sharetarget</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/slice" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/slice" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/slice" ><span class="devsite-nav-text" tooltip>androidx.slice</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/slidingpanelayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/slidingpanelayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/slidingpanelayout" ><span class="devsite-nav-text" tooltip>androidx.slidingpanelayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/sqlite" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/sqlite" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/sqlite" ><span class="devsite-nav-text" tooltip>androidx.sqlite</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/startup" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/startup" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/startup" ><span class="devsite-nav-text" tooltip>androidx.startup</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/swiperefreshlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/swiperefreshlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/swiperefreshlayout" ><span class="devsite-nav-text" tooltip>androidx.swiperefreshlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/test" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/test" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/test" ><span class="devsite-nav-text" tooltip>androidx.test</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/test-uiautomator" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/test-uiautomator" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/test-uiautomator" ><span class="devsite-nav-text" tooltip>androidx.test.uiautomator</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/textclassifier" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/textclassifier" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/textclassifier" ><span class="devsite-nav-text" tooltip>androidx.textclassifier</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/tracing" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/tracing" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/tracing" ><span class="devsite-nav-text" tooltip>androidx.tracing</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/transition" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/transition" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/transition" ><span class="devsite-nav-text" tooltip>androidx.transition</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/tv" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/tv" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/tv" ><span class="devsite-nav-text" tooltip>androidx.tv</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/tvprovider" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/tvprovider" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/tvprovider" ><span class="devsite-nav-text" tooltip>androidx.tvprovider</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/vectordrawable" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/vectordrawable" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/vectordrawable" ><span class="devsite-nav-text" tooltip>androidx.vectordrawable</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/versionedparcelable" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/versionedparcelable" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/versionedparcelable" ><span class="devsite-nav-text" tooltip>androidx.versionedparcelable</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/viewpager" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/viewpager" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/viewpager" ><span class="devsite-nav-text" tooltip>androidx.viewpager</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/viewpager2" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/viewpager2" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/viewpager2" ><span class="devsite-nav-text" tooltip>androidx.viewpager2</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear" ><span class="devsite-nav-text" tooltip>androidx.wear</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-compose" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-compose" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-compose" ><span class="devsite-nav-text" tooltip>androidx.wear.compose</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-protolayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-protolayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-protolayout" ><span class="devsite-nav-text" tooltip>androidx.wear.protolayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-tiles" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-tiles" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-tiles" ><span class="devsite-nav-text" tooltip>androidx.wear.tiles</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-watchface" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-watchface" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-watchface" ><span class="devsite-nav-text" tooltip>androidx.wear.watchface</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/webkit" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/webkit" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/webkit" ><span class="devsite-nav-text" tooltip>androidx.webkit</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/window" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/window" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/window" ><span class="devsite-nav-text" tooltip>androidx.window</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/window-extensions-core" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/window-extensions-core" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/window-extensions-core" ><span class="devsite-nav-text" tooltip>androidx.window.extensions.core</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/work" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/work" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/work" ><span class="devsite-nav-text" tooltip>androidx.work</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/jetifier" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/jetifier" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/jetifier" ><span class="devsite-nav-text" tooltip>tools.build.jetifier</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Release Note Archive</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive/test" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive/test" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive/test" ><span class="devsite-nav-text" tooltip>Test</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive/arch" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive/arch" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive/arch" ><span class="devsite-nav-text" tooltip>Architecture Components</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive/androidx" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive/androidx" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive/androidx" ><span class="devsite-nav-text" tooltip>AndroidX</span></a></li></ul></div></li> <li class="devsite-nav-item"><a href="/jetpack/androidx/compose-roadmap" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/compose-roadmap" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/compose-roadmap" ><span class="devsite-nav-text" tooltip>Jetpack Compose Roadmap</span></a></li> <li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-kotlin" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-kotlin" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-kotlin" ><span class="devsite-nav-text" tooltip>Jetpack Compose Kotlin Compatibility</span></a></li> </ul> <ul class="devsite-nav-list" menu="Essentials" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Gemini in Android Studio </span> </span> </li> <li class="devsite-nav-item"> <a href="/gemini-in-android" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Learn more" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Learn more </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Get Android Studio" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Get Android Studio </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Get started </span> </span> </li> <li class="devsite-nav-item"> <a href="/get-started/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Hello world" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Hello world </span> </a> </li> <li class="devsite-nav-item"> <a href="/courses" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Training courses" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Training courses </span> </a> </li> <li class="devsite-nav-item"> <a href="/get-started/codelabs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Tutorials" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Tutorials </span> </a> </li> <li class="devsite-nav-item"> <a href="/kotlin" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Kotlin for Android" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Kotlin for Android </span> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/console/about/guides/monetize/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Monetization with Play ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Monetization with Play ↗️ </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Extend by device </span> </span> </li> <li class="devsite-nav-item"> <a href="/adaptive-apps" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Adaptive apps" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Adaptive apps </span> </a> </li> <li class="devsite-nav-item"> <a href="/wear" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/cars" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android for Cars" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android for Cars </span> </a> </li> <li class="devsite-nav-item"> <a href="/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item"> <a href="/chrome-os" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: ChromeOS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > ChromeOS </span> </a> </li> <li class="devsite-nav-item"> <a href="/multi-device-development" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cross-device SDK" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cross-device SDK </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build by category </span> </span> </li> <li class="devsite-nav-item"> <a href="/games" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Games" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Games </span> </a> </li> <li class="devsite-nav-item"> <a href="/media" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Camera & Media" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Camera & Media </span> </a> </li> <li class="devsite-nav-item"> <a href="/social-and-messaging" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Social & messaging" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Social & messaging </span> </a> </li> <li class="devsite-nav-item"> <a href="/health-and-fitness" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Health & Fitness" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Health & Fitness </span> </a> </li> <li class="devsite-nav-item"> <a href="/productivity" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Productivity" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Productivity </span> </a> </li> <li class="devsite-nav-item"> <a href="/work/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Enterprise apps" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Enterprise apps </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Get the latest </span> </span> </li> <li class="devsite-nav-item"> <a href="/latest-updates" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Latest updates" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Latest updates </span> </a> </li> <li class="devsite-nav-item"> <a href="/latest-updates/experimental" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Experimental updates" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Experimental updates </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio/preview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Studio preview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Studio preview </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/versions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Jetpack & Compose libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Jetpack & Compose libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/wearables/versions/4" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS preview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS preview </span> </a> </li> <li class="devsite-nav-item"> <a href="/design-for-safety/privacy-sandbox" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Privacy Sandbox" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Privacy Sandbox </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Design & Plan" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > UI Design </span> </span> </li> <li class="devsite-nav-item"> <a href="/design/ui" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Design for Android" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Design for Android </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/mobile" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Mobile" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Mobile </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/large-screens" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Large screens (e.g., tablets)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Large screens (e.g., tablets) </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/widget" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Widgets" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Widgets </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/wear" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Architecture </span> </span> </li> <li class="devsite-nav-item"> <a href="/topic/architecture/intro" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Introduction" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Introduction </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/libraries/view-binding" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/navigation/navigation-principles" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Navigation" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Navigation </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/modularization" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Modularization" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Modularization </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/testing/fundamentals" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Testing" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Testing </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Quality </span> </span> </li> <li class="devsite-nav-item"> <a href="/quality" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/core-value" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Core value" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Core value </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/user-experience" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: User experience" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > User experience </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/technical" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Technical quality" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Technical quality </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/privacy-and-security" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Security" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Security </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Security </span> </span> </li> <li class="devsite-nav-item"> <a href="/security" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/privacy-and-security/about" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Privacy" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Privacy </span> </a> </li> <li class="devsite-nav-item"> <a href="/identity" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Identity" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Identity </span> </a> </li> <li class="devsite-nav-item"> <a href="/security/fraud-prevention" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Fraud prevention" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Fraud prevention </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build for Billions </span> </span> </li> <li class="devsite-nav-item"> <a href="/build-for-billions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/quality-guidelines/build-for-billions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: About new markets" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > About new markets </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/androidgo" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android (Go edition)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android (Go edition) </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Develop" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build AI experiences </span> </span> </li> <li class="devsite-nav-item"> <a href="/ai" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Get started" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Get started </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Core areas </span> </span> </li> <li class="devsite-nav-item"> <a href="/samples" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Samples" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Samples </span> </a> </li> <li class="devsite-nav-item"> <a href="/quick-guides" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Try Quick Guidesᵇᵉᵗᵃ" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Try Quick Guidesᵇᵉᵗᵃ </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/ui" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: User interfaces" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > User interfaces </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/permissions/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Permissions" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Permissions </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/background-work" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Background work" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Background work </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/data" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Data and files" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Data and files </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop#core-areas" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: All core areas ⤵️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > All core areas ⤵️ </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Tools and workflow </span> </span> </li> <li class="devsite-nav-item"> <a href="/studio/write" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Write and debug code" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Write and debug code </span> </a> </li> <li class="devsite-nav-item"> <a href="/build/gradle-build-overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Build projects" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Build projects </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/testing" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Test your app" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Test your app </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/performance/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Performance" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Performance </span> </a> </li> <li class="devsite-nav-item"> <a href="/tools" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Command-line tools" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Command-line tools </span> </a> </li> <li class="devsite-nav-item"> <a href="/reference/tools/gradle-api" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Gradle plugin API" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Gradle plugin API </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Device tech </span> </span> </li> <li class="devsite-nav-item"> <a href="/guide/topics/large-screens/get-started-with-large-screens" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Large screens (e.g., tablets)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Large screens (e.g., tablets) </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/wearables" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/health-and-fitness/guides" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Health" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Health </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/connectivity/cross-device-sdk/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cross-device SDK" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cross-device SDK </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/cars" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android for Cars" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android for Cars </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item"> <a href="/chrome-os/intro" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: ChromeOS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > ChromeOS </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Libraries </span> </span> </li> <li class="devsite-nav-item"> <a href="/reference/packages" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android platform" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android platform </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/explorer" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Jetpack libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Jetpack libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/releases/compose" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Compose libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Compose libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/android/reference/packages" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play services ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play services ↗️ </span> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/sdks" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play SDK index ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play SDK index ↗️ </span> </a> </li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" class="devsite-main-content" has-book-nav has-sidebar > <div class="devsite-sidebar"> <div class="devsite-sidebar-content"> <devsite-toc class="devsite-nav" role="navigation" aria-label="On this page" depth="2" scrollbars ></devsite-toc> <devsite-recommendations-sidebar class="nocontent devsite-nav"> </devsite-recommendations-sidebar> </div> </div> <devsite-content> <article class="devsite-article"> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" aria-label="Breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developer.android.com/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Android Developers" > Android Developers </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/get-started/overview" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="Get started" > Get started </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/jetpack" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="3" track-type="globalNav" track-name="breadcrumb" track-metadata-position="3" track-metadata-eventdetail="Jetpack" > Jetpack </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/jetpack/androidx/explorer" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="4" track-type="globalNav" track-name="breadcrumb" track-metadata-position="4" track-metadata-eventdetail="" > Libraries </a> </li> </ul> <devsite-thumb-rating position="header"> </devsite-thumb-rating> </div> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded > </devsite-toc> <devsite-recommendations-dropdown class="nocontent"></devsite-recommendations-dropdown> <div class="devsite-article-body clearfix devsite-no-page-title"> <h1 class="devsite-page-title" style="width:50%" id="compose-runtime" data-text="Compose Runtime" tabindex="-1">Compose Runtime</h1> <div style="align:right; text-align:right; padding-bottom:21px; margin-top:-45px; border-bottom:1px solid black;"> <a href="/jetpack/compose/tutorial">User Guide</a> <a href="https://github.com/android/compose-samples">Code Sample</a> </div> <div style="float:left; font-size:medium; margin-bottom:5px; margin-top:10px" class="nocontent"> <div style="text-align:left; font-size:90%; padding-right:30px; margin-right:10px; margin-bottom:10px;"> API Reference<br> <a href="/reference/kotlin/androidx/compose/runtime/package-summary">androidx.compose.runtime</a><br> <a href="/reference/kotlin/androidx/compose/runtime/rxjava2/package-summary">androidx.compose.runtime.rxjava2</a><br> <a href="/reference/kotlin/androidx/compose/runtime/rxjava3/package-summary">androidx.compose.runtime.rxjava3</a><br> <a href="/reference/kotlin/androidx/compose/runtime/saveable/package-summary">androidx.compose.runtime.saveable</a><br> <a href="/reference/kotlin/androidx/compose/runtime/snapshots/package-summary">androidx.compose.runtime.snapshots</a><br> (<em>See the API reference docs for all compose packages</em>) </div> </div> <div style="text-align:left; padding-left:10px; margin-left:10px; margin-top:15px; margin-bottom:10px;"> Fundamental building blocks of Compose's programming model and state management, and core runtime for the Compose Compiler Plugin to target. </div> <div style="clear:both"></div> <table style="width:100%"> <tr> <th style="width:15%">Latest Update</th> <th style="width:15%">Stable Release</th> <th style="width:15%">Release Candidate</th> <th style="width:15%">Beta Release</th> <th style="width:15%">Alpha Release</th></tr> <tr> <td>November 13, 2024</td> <td><a href="/jetpack/androidx/releases/compose-runtime#1.7.5">1.7.5</a></td> <td>-</td> <td>-</td> <td><a href="/jetpack/androidx/releases/compose-runtime#1.8.0-alpha06">1.8.0-alpha06</a></td> </tr> </table> <h2 id="structure" data-text="Structure" tabindex="-1">Structure</h2> <p>Compose is combination of 7 Maven Group Ids within <code translate="no" dir="ltr">androidx</code>. Each Group contains a targeted subset of functionality, each with its own set of release notes.</p> <p>This table explains the groups and links to each set of release notes.</p> <table> <thead> <tr><th>Group</th><th>Description</th></tr> </thead> <tbody class="list"> <tr><td><a href="/jetpack/androidx/releases/compose-animation">compose.animation</a></td><td>Build animations in their Jetpack Compose applications to enrich the user experience.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-compiler">compose.compiler</a></td><td>Transform @Composable functions and enable optimizations with a Kotlin compiler plugin.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-foundation">compose.foundation</a></td><td>Write Jetpack Compose applications with ready to use building blocks and extend foundation to build your own design system pieces.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-material">compose.material</a></td><td>Build Jetpack Compose UIs with ready to use Material Design Components. This is the higher level entry point of Compose, designed to provide components that match those described at www.material.io.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-material3">compose.material3</a></td><td>Build Jetpack Compose UIs with Material Design 3 Components, the next evolution of Material Design. Material 3 includes updated theming and components and Material You personalization features like dynamic color, and is designed to be cohesive with the new Android 12 visual style and system UI.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-runtime">compose.runtime</a></td><td>Fundamental building blocks of Compose's programming model and state management, and core runtime for the Compose Compiler Plugin to target.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-ui">compose.ui</a></td><td>Fundamental components of compose UI needed to interact with the device, including layout, drawing, and input.</td></tr> </tbody> </table> <h2 id="declaring_dependencies" data-text="Declaring dependencies" tabindex="-1">Declaring dependencies</h2> <p>To add a dependency on Compose, you must add the Google Maven repository to your project. Read <a href="/studio/build/dependencies#google-maven">Google's Maven repository</a> for more information.</p> <p>Add the dependencies for the artifacts you need in the <code translate="no" dir="ltr">build.gradle</code> file for your app or module:</p> <div> <div class="ds-selector-tabs"><section><h3 id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">dependencies</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">implementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"androidx.compose.runtime:runtime:1.7.5"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">implementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"androidx.compose.runtime:runtime-livedata:1.7.5"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">implementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"androidx.compose.runtime:runtime-rxjava2:1.7.5"</span> <span class="devsite-syntax-o">}</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildFeatures</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">compose</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">true</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">composeOptions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">kotlinCompilerExtensionVersion</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"1.5.15"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">kotlinOptions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">jvmTarget</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"1.8"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section><section><h3 id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">dependencies</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">implementation</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"androidx.compose.runtime:runtime:1.7.5"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">implementation</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"androidx.compose.runtime:runtime-livedata:1.7.5"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">implementation</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"androidx.compose.runtime:runtime-rxjava2:1.7.5"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildFeatures</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">compose</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">true</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">composeOptions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">kotlinCompilerExtensionVersion</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"1.5.15"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">kotlinOptions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">jvmTarget</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"1.8"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section></div> </div> <p>For more information about dependencies, see <a href="/studio/build/dependencies">Add build dependencies</a>.</p> <h2 id="feedback" data-text="Feedback" tabindex="-1">Feedback</h2> <p>Your feedback helps make Jetpack better. Let us know if you discover new issues or have ideas for improving this library. Please take a look at the <a href="https://issuetracker.google.com/issues?q=componentid:610764%20status:open">existing issues</a> in this library before you create a new one. You can add your vote to an existing issue by clicking the star button.</p> <p><a href="https://issuetracker.google.com/issues/new?component=610764&template=1424126" class="button dac-button dac-outline-button">Create a new issue</a></p> <p>See the <a href="https://developers.google.com/issue-tracker">Issue Tracker documentation</a> for more information.</p> <h2 id="runtime_tracing_version_17_2" data-text="Runtime Tracing Version 1.7" tabindex="-1">Runtime Tracing Version 1.7</h2> <h3 id="1.7.0-rc01" data-text="Version 1.7.0-rc01" tabindex="-1">Version 1.7.0-rc01</h3> <p>September 18, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-tracing:1.7.0-rc01</code> is released. Version 1.7.0-rc01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/b5166f9a1e9c047162d1215884c3e2cd41a4a74a..baa5cf7b949ae30f236d40b11ba88f9b0c8cffb9/compose/runtime/runtime-tracing">these commits</a>.</p> <h2 id="runtime_tracing_version_10_2" data-text="Runtime Tracing Version 1.0" tabindex="-1">Runtime Tracing Version 1.0</h2> <h3 id="runtime-tracing-1.0.0-beta01" data-text="Version 1.0.0-beta01" tabindex="-1">Version 1.0.0-beta01</h3> <p>November 29, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-tracing:1.0.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1f80a6f0c1cb96288c04124001fa2c9bd29617d6..b5166f9a1e9c047162d1215884c3e2cd41a4a74a/compose/runtime/runtime-tracing">Version 1.0.0-beta01 contains these commits.</a></p> <h3 id="runtime-tracing-1.0.0-alpha05" data-text="Version 1.0.0-alpha05" tabindex="-1">Version 1.0.0-alpha05</h3> <p>November 15, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-tracing:1.0.0-alpha05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/216f103fa4a5c7247f7bafc8bb3014616c265f0c..1f80a6f0c1cb96288c04124001fa2c9bd29617d6/compose/runtime/runtime-tracing">Version 1.0.0-alpha05 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Pinned dependencies to lowest supported stable versions (i.e. compose-runtime and tracing-perfetto) - fixing an issue where compose-runtime-tracing would bring in a newer version of compose-runtime into the app.</li> </ul> <h3 id="runtime-tracing-1.0.0-alpha04" data-text="Version 1.0.0-alpha04" tabindex="-1">Version 1.0.0-alpha04</h3> <p>August 23, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-tracing:1.0.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/87533b4ff06971ed59028936cd9b6da988cd4522..216f103fa4a5c7247f7bafc8bb3014616c265f0c/compose/runtime/runtime-tracing">Version 1.0.0-alpha04 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Compatible with latest versions of Benchmark and Tracing Perfetto, enabling support for Composition Tracing at app startup (cold start) e.g. in AndroidX Benchmark and Android Studio (starting from Hedgehog Beta 2).</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Renamed <code translate="no" dir="ltr">androidx.tracing.perfetto.Trace</code> to <code translate="no" dir="ltr">androidx.tracing.perfetto.PerfettoSdkTrace</code>. (<a href="https://android-review.googlesource.com/#/q/I44af824893288c17c792369058132cca3ac61f1b">I44af8</a>)</li> <li>Making Tracing Perfetto SDK APIs consistent with <code translate="no" dir="ltr">android.os.Trace</code>. (<a href="https://android-review.googlesource.com/#/q/I73ba07ca6cc4bd2b6519553c395fe9075a49fe75">I73ba0</a>, <a href="https://issuetracker.google.com/issues/282199917">b/282199917</a>)</li> <li>Prerequisites for tracing at app startup. (<a href="https://android-review.googlesource.com/#/q/Iad890a61eab26611469704a7451c6fdc611622e5">Iad890</a>)</li> <li>Merged experimental and public API files (<a href="https://android-review.googlesource.com/#/q/I0f2e1b547f5c460e72edae3d84f3ae7cfc27cf30">I0f2e1</a>, <a href="https://issuetracker.google.com/issues/278769092">b/278769092</a>)</li> </ul> <h3 id="runtime-tracing-1.0.0-alpha02" data-text="Version 1.0.0-alpha02" tabindex="-1">Version 1.0.0-alpha02</h3> <p>February 8, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-tracing:1.0.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/cce7b70f6a5ebf955cf748a73c18b63228b22c74..f7337eab774a6ce3b17367d5f31708564b66e677/compose/runtime/runtime-tracing">Version 1.0.0-alpha02 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>No functional changes. Multiple performance optimisations in downstream dependencies <code translate="no" dir="ltr">androidx.tracing:tracing-perfetto*</code>.</li> </ul> <h3 id="runtime-tracing-1.0.0-alpha01" data-text="Version 1.0.0-alpha01" tabindex="-1">Version 1.0.0-alpha01</h3> <p>September 7, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-tracing:1.0.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/cce7b70f6a5ebf955cf748a73c18b63228b22c74/compose/runtime/runtime-tracing">Version 1.0.0-alpha01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li><code translate="no" dir="ltr">androidx.compose.runtime:runtime-tracing</code> is a library which - in the presence of tooling supporting it (coming soon) - allows for extended tracing in a Compose app. This initial release is 1.0.0-alpha01.</li> </ul> <h2 id="version_18_2" data-text="Version 1.8" tabindex="-1">Version 1.8</h2> <h3 id="1.8.0-alpha06" data-text="Version 1.8.0-alpha06" tabindex="-1">Version 1.8.0-alpha06</h3> <p>November 13, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.8.0-alpha06</code> is released. Version 1.8.0-alpha06 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/ccd90a76bd7c4acf4f4f01eca76350e383bc441e..6f09cf2ae979e48fdb19485f757a033e4a34bb82/compose/runtime">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Changes to the <code translate="no" dir="ltr">PausableComposition</code> API. These breaking changes with respect to previous releases of 1.8.0-alpha (since 1.8.0-alpha02) but, as these are new APIs in 1.8.0, backwards compatibility is not maintained as the APIs are still in alpha. (<a href="https://android-review.googlesource.com/#/q/I39819fd1a6509973a0008cd4fdec8a892829a301">I39819</a>)</li> <li>Adds tooling APIs to observe the creation of new compositions within a Recomposer (<a href="https://android-review.googlesource.com/#/q/Iaeb7e218aa949ebf1c061b311a3c4383cf5c2728">Iaeb7e</a>)</li> <li>Added <code translate="no" dir="ltr">snapshotId</code>, of type <code translate="no" dir="ltr">Long</code>, to <code translate="no" dir="ltr">Snapshot</code> and deprecated <code translate="no" dir="ltr">id</code>. The ID of a snapshot changed from a <code translate="no" dir="ltr">Int</code> to a <code translate="no" dir="ltr">Long</code> to avoid the snapshot ID from overflowing on systems with very high frame rates and long running animations. The type was made expect/actual to allow this type to be <code translate="no" dir="ltr">Int</code>, or other type, on platforms that don't have a native <code translate="no" dir="ltr">Long</code> type. Platforms that do not have a native <code translate="no" dir="ltr">Long</code>, such as JavaScript, should avoid high frame rates (over 1000 FPS) which would cause an overflow for <code translate="no" dir="ltr">Int</code> approximate every 24 days. (<a href="https://android-review.googlesource.com/#/q/I38ac3d43d3af7f691c957017eaf6895f5ae6ebb9">I38ac3</a>, <a href="https://issuetracker.google.com/issues/374821679">b/374821679</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed <code translate="no" dir="ltr">providesDefault</code> for a single <code translate="no" dir="ltr">provides</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/3318540">aosp/3318540</a> <a href="https://issuetracker.google.com/issues/374263387">b/374263387</a>)</li> <li>Optimize <code translate="no" dir="ltr">ChangeList</code>. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/3318538">3318538</a>)</li> </ul> <h3 id="1.8.0-alpha05" data-text="Version 1.8.0-alpha05" tabindex="-1">Version 1.8.0-alpha05</h3> <p>October 30, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.8.0-alpha05</code> is released. Version 1.8.0-alpha05 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/b8a68b0896897fa158508d73a31998a26161d9a7..ccd90a76bd7c4acf4f4f01eca76350e383bc441e/compose/runtime">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix stack overflow adding <code translate="no" dir="ltr">Int.MAX_VALUE</code> to <code translate="no" dir="ltr">SnapshotIdSet</code>. (<a href="https://issuetracker.google.com/issues/370536104">b/370536104</a>, <a href="https://android-review.googlesource.com/#/q/Ic4179f629065874e23c597dbbf6575e751c16e34">Ic4179f6</a>)</li> <li>Runtime micro-optimizations (<a href="https://android-review.googlesource.com/#/q/I50c60a20e43c5c816ed5f6f23d37c2470fa2ec88">I50c60</a>)</li> <li>Allow R8 to remove debugging runtimeCheck calls (<a href="https://android-review.googlesource.com/#/q/I8c441aa22f729e05651486265af9a2c0d9ee75b8">I8c44</a>)</li> <li>Make <code translate="no" dir="ltr">compoundKeyOf</code> iterative instead of recursive (<a href="https://android-review.googlesource.com/#/q/I5817f443e766f85b874ccbdd11db16d20313f6df">I5817f</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Implement stacks with collection lists (<a href="https://android-review.googlesource.com/#/q/I7d47c0a2850a5a166d045ccc6e8392b029ef7956">I7d47c</a>)</li> </ul> <h3 id="1.8.0-alpha04" data-text="Version 1.8.0-alpha04" tabindex="-1">Version 1.8.0-alpha04</h3> <p>October 16, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.8.0-alpha04</code> is released. Version 1.8.0-alpha04 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/b6ae8d0a0e8cd803f7b84f30101eda1af4f1d6b6..b8a68b0896897fa158508d73a31998a26161d9a7/compose/runtime">these commits</a>.</p> <p><strong>Performance Improvements</strong></p> <ul> <li>Provide snapshot id for state records in constructor (<a href="https://android-review.googlesource.com/#/q/Iefb93e7ec256bac69e41dd37c15b6cfc61b51896">85c00f</a>)</li> <li>Refactor <code translate="no" dir="ltr">SnapshotState***</code> to avoid class verification errors (<a href="https://android-review.googlesource.com/#/q/I61ad02d55b18bc1f4a636ef28a630df5614777c1">6ee4a6</a>)</li> <li>Fix R8 rules to prevent throw inlining (<a href="https://android-review.googlesource.com/#/q/I3d041cfcd9bd13c94c29a47b3f6d258f15537ba8">5beb92</a>)</li> <li>Micro-optimize Operations (<a href="https://android-review.googlesource.com/#/q/I1b87da4dbad1e5954672f5eb437e9c2798f232a8">d73c5c</a>)</li> <li>Optimize <code translate="no" dir="ltr">SynchronizedObject</code> allocations on JVM (<a href="https://android-review.googlesource.com/#/q/I68cc15dce5682f4fd6873d6da52a2070dc42ec64">2b043f</a>)</li> </ul> <h3 id="1.8.0-alpha03" data-text="Version 1.8.0-alpha03" tabindex="-1">Version 1.8.0-alpha03</h3> <p>October 2, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.8.0-alpha03</code> is released. Version 1.8.0-alpha03 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/baa5cf7b949ae30f236d40b11ba88f9b0c8cffb9..b6ae8d0a0e8cd803f7b84f30101eda1af4f1d6b6/compose/runtime">these commits</a>.</p> <p><strong>Performance Improvements</strong></p> <ul> <li>Lazily create child context for <code translate="no" dir="ltr">rememberCoroutineScope</code> (<a href="https://android-review.googlesource.com/#/q/I6be8777ee40a52d1ca0d9f28f6c8ba687a6d5263">f61464</a>) <ul> <li><code translate="no" dir="ltr">rememberCoroutineScope</code> is typically used to launch coroutines in response to events that happen post-composition. In some scenarios these events may never occur, leading to added costs of Job creation and cancellation without any benefit.</li> <li>Make the scope returned by <code translate="no" dir="ltr">rememberCoroutineScope</code> create its <code translate="no" dir="ltr">coroutineContext</code> lazily when accessed, avoiding job creation and cancellation entirely if the scope is never used.</li> </ul></li> </ul> <h3 id="1.8.0-alpha02" data-text="Version 1.8.0-alpha02" tabindex="-1">Version 1.8.0-alpha02</h3> <p>September 18, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.8.0-alpha02</code> is released. Version 1.8.0-alpha02 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/80f82d37cb9b40250ee9eb15d9cbe9e93849355e..0431b84980e97d6bafdfda7c9038bc4d9529564f/compose/runtime">these commits</a>.</p> <p><strong>New Features</strong></p> <ul> <li>Added <code translate="no" dir="ltr">PausableComposition</code> which allows creating a subcomposition that can be paused during composition and and applied asynchronously to the composition. Compiler support is required for pausing which is currently in development. (<a href="https://android-review.googlesource.com/#/q/I3394b7ebd90932ca451c7d55df7f286329de7656">I3394b</a>)</li> </ul> <h3 id="1.8.0-alpha01" data-text="Version 1.8.0-alpha01" tabindex="-1">Version 1.8.0-alpha01</h3> <p>September 4, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.8.0-alpha01</code> is released. Version 1.8.0-alpha01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/6a69101fd0edc8d02aa316df1f43e0552fd2d7c4..80f82d37cb9b40250ee9eb15d9cbe9e93849355e/compose/runtime">these commits</a>.</p> <h2 id="version_17_2" data-text="Version 1.7" tabindex="-1">Version 1.7</h2> <h3 id="1.7.5" data-text="Version 1.7.5" tabindex="-1">Version 1.7.5</h3> <p>October 30, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.5</code> is released. Version 1.7.5 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/6b0ae0e41147a8a917cab35b4a6487af4fce6ead..4cbf03b378a865660d8209d0229c2bb1928c6e33/compose/runtime">these commits</a>.</p> <h3 id="1.7.4" data-text="Version 1.7.4" tabindex="-1">Version 1.7.4</h3> <p>October 16, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.4</code> is released. Version 1.7.4 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/00e91ed140ce2c4677f56fc06692b182b8a07fcf..6b0ae0e41147a8a917cab35b4a6487af4fce6ead/compose/runtime">these commits</a>.</p> <h3 id="1.7.3" data-text="Version 1.7.3" tabindex="-1">Version 1.7.3</h3> <p>October 2, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.3</code> is released. Version 1.7.3 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/baa5cf7b949ae30f236d40b11ba88f9b0c8cffb9..00e91ed140ce2c4677f56fc06692b182b8a07fcf/compose/runtime">these commits</a>.</p> <h3 id="1.7.2" data-text="Version 1.7.2" tabindex="-1">Version 1.7.2</h3> <p>September 18, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.2</code> is released. Version 1.7.2 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/1efd0b233a17f707cd918993df1fa12e0bf9ae83..baa5cf7b949ae30f236d40b11ba88f9b0c8cffb9/compose/runtime">these commits</a>.</p> <h3 id="1.7.1" data-text="Version 1.7.1" tabindex="-1">Version 1.7.1</h3> <p>September 10, 2024</p> <ul> <li>No changes to Android artifacts. <code translate="no" dir="ltr">-desktop</code> artifacts were removed and <code translate="no" dir="ltr">-jvmStubs</code> and <code translate="no" dir="ltr">-linuxx64Stubs</code> artifacts were added. None of these targets are meant to be used, they are placeholders to help Jetbrains Compose efforts.</li> </ul> <h3 id="1.7.0" data-text="Version 1.7.0" tabindex="-1">Version 1.7.0</h3> <p>September 4, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0</code> is released. Version 1.7.0 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/d8995e2377dd4baad64b39becb6d480cadd05c86..38ffb9c315c3f894412184bda180c1b58b2a8556/compose/runtime">these commits</a>.</p> <p><strong>Important changes since 1.6.0</strong></p> <ul> <li>Added the ability to provide a composition local that is computed based on the values of other composition locals either by default, using <code translate="no" dir="ltr">compositionLocalWithComputedDefault()</code> or by supplying a lambda to use to compute the value by using <code translate="no" dir="ltr">providesComputed</code> instead of <code translate="no" dir="ltr">provides</code>.</li> <li>The value of a composition local can be obtained by using the <code translate="no" dir="ltr">currentValue</code> property of the composition local accessible from within the lambda computing the value. This is used instead of <code translate="no" dir="ltr">current</code> which is only accessible in <code translate="no" dir="ltr">@Composable</code> functions. (<a href="https://android-review.googlesource.com/#/q/Iadbc05f5ce04aeb1b67b53cff265b9017958947a">Iadbc0</a>)</li> <li>Newly created state objects are immediately accessible from other snapshots, including the global snapshot, with their initial state. Any subsequent modifications are not visible until the snapshot in which the object was created is applied.</li> <li>The initial state of <code translate="no" dir="ltr">mutableStateOf()</code>, as well as their primitive versions, is the value passed in as a parameter to <code translate="no" dir="ltr">mutableStateOf()</code>. The initial state of <code translate="no" dir="ltr">mutableStateListOf()</code> and <code translate="no" dir="ltr">mutableStateMapOf()</code> is empty.</li> <li>Added <code translate="no" dir="ltr">Snapshot.isInSnapshot</code> and <code translate="no" dir="ltr">Snapshot.PreexistingSnapshotId</code> that are used to enable a state object to support being immediately accessible from the global snapshot upon its creation.</li> <li>Custom state objects can support being immediately accessible by following the pattern of changes made to the built-in snapshot objects. (<a href="https://android-review.googlesource.com/#/q/I84a17f3cb84c7335a93b759b9eff908c487e83a8">I84a17</a>)</li> <li>Enable <code translate="no" dir="ltr">nonSkippingGroupOptimization</code> for compose libraries. This causes the generated code for all non-restartable composable functions in androidx to be more efficient. In the future we plan to enable this by default. I(<a href="https://android-review.googlesource.com/#/q/I486ef31e83f76763ffb3d3ca6ff78f04e7b0e465">acbc08</a>)</li> <li>Invalidate composable lambdas in subcompositions on the same frame. (<a href="https://android-review.googlesource.com/#/q/I56bfb6fa98f05744587461158f933877aa8f64d4">98301c</a>)</li> <li>Call <code translate="no" dir="ltr">onRelease</code> callback in the same order as <code translate="no" dir="ltr">onForgotten</code>. (<a href="https://android-review.googlesource.com/#/q/I0429d56ae6d02406fbc6f062d1c1ca040030ab09">2cd790</a>)</li> <li>Enable strong skipping mode (<a href="https://android-review.googlesource.com/#/q/I5e6a1ebb48f214f82a3f188b0810e0b6f7dba03e">ed1766</a>)</li> <li>Make <code translate="no" dir="ltr">currentCompoundHashKey</code> unique in more cases (<a href="https://android-review.googlesource.com/#/q/I65507c0d4f5ac5d92db2619b284b1f3266c04e2f">d4a872</a>)</li> </ul> <h3 id="1.7.0-rc01" data-text="Version 1.7.0-rc01" tabindex="-1">Version 1.7.0-rc01</h3> <p>August 21, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-rc01</code> is released. Version 1.7.0-rc01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/98bc1cf10201a973793b72d2ff1ae728070e47e4..d8995e2377dd4baad64b39becb6d480cadd05c86/compose/runtime">these commits</a>.</p> <h3 id="1.7.0-beta07" data-text="Version 1.7.0-beta07" tabindex="-1">Version 1.7.0-beta07</h3> <p>August 7, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-beta07</code> is released. Version 1.7.0-beta07 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/16151cbc8a68e976da6f2b0f624c2e9883c55aa3..98bc1cf10201a973793b72d2ff1ae728070e47e4/compose/runtime">these commits</a>.</p> <h3 id="1.7.0-beta06" data-text="Version 1.7.0-beta06" tabindex="-1">Version 1.7.0-beta06</h3> <p>July 24, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-beta06</code> is released. Version 1.7.0-beta06 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/8346df8de9f86a546fc9c316113bd4a3cc82ede9..16151cbc8a68e976da6f2b0f624c2e9883c55aa3/compose/runtime">these commits</a>.</p> <h3 id="1.7.0-beta05" data-text="Version 1.7.0-beta05" tabindex="-1">Version 1.7.0-beta05</h3> <p>July 10, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-beta05</code> is released. Version 1.7.0-beta05 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/487d2b07dba29c903cfd87a8dc7f99483084ebb6..8346df8de9f86a546fc9c316113bd4a3cc82ede9/compose/runtime">these commits</a>.</p> <h3 id="1.7.0-beta04" data-text="Version 1.7.0-beta04" tabindex="-1">Version 1.7.0-beta04</h3> <p>June 26, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-beta04</code> is released. Version 1.7.0-beta04 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/c29f7383c14ede0af9cb64be9f3eee63714bc73c..487d2b07dba29c903cfd87a8dc7f99483084ebb6/compose/runtime">these commits</a>.</p> <h3 id="1.7.0-beta03" data-text="Version 1.7.0-beta03" tabindex="-1">Version 1.7.0-beta03</h3> <p>June 12, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-beta03</code> is released. Version 1.7.0-beta03 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/1a123f646cfea1599f9efead6da546b0c26063fa..c29f7383c14ede0af9cb64be9f3eee63714bc73c/compose/runtime">these commits</a>.</p> <h3 id="1.7.0-beta02" data-text="Version 1.7.0-beta02" tabindex="-1">Version 1.7.0-beta02</h3> <p>May 29, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-beta02</code> is released. Version 1.7.0-beta02 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/6a69101fd0edc8d02aa316df1f43e0552fd2d7c4..1a123f646cfea1599f9efead6da546b0c26063fa/compose/runtime">these commits</a>.</p> <h3 id="1.7.0-beta01" data-text="Version 1.7.0-beta01" tabindex="-1">Version 1.7.0-beta01</h3> <p>May 14, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-beta01</code> is released. Version 1.7.0-beta01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/06bfcd36801b67b9fe9b9bcae0d16a55e7d40fd7..6a69101fd0edc8d02aa316df1f43e0552fd2d7c4/compose/runtime">these commits</a>.</p> <h3 id="1.7.0-alpha08" data-text="Version 1.7.0-alpha08" tabindex="-1">Version 1.7.0-alpha08</h3> <p>May 1, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-alpha08</code> is released. Version 1.7.0-alpha08 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/67004410fdbff19f90caa4cc43965ab21dca1943..06bfcd36801b67b9fe9b9bcae0d16a55e7d40fd7/compose/runtime">these commits</a>.</p> <h3 id="1.7.0-alpha07" data-text="Version 1.7.0-alpha07" tabindex="-1">Version 1.7.0-alpha07</h3> <p>April 17, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-alpha07</code> is released. Version 1.7.0-alpha07 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/02b55f664eba38e42e362e1af3913be1df552d55..67004410fdbff19f90caa4cc43965ab21dca1943/compose/runtime">these commits</a>.</p> <p><strong>New Features</strong></p> <ul> <li>Added the ability to provide a composition local that is computed based on the values of other composition locals either by default, using <code translate="no" dir="ltr">compositionLocalWithComputedDefault()</code> or by supplying a lambda to use to compute the value by using <code translate="no" dir="ltr">providesComputed</code> instead of <code translate="no" dir="ltr">provides</code>.</li> <li>The value of a composition local can be obtained by using the <code translate="no" dir="ltr">currentValue</code> property of the composition local accessible from within the lambda computing the value. This is used instead of <code translate="no" dir="ltr">current</code> which is only accessible in <code translate="no" dir="ltr">@Composable</code> functions. (<a href="https://android-review.googlesource.com/#/q/Iadbc05f5ce04aeb1b67b53cff265b9017958947a">Iadbc0</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Newly created state objects are immediately accessible from other snapshots, including the global snapshot, with their initial state. Any subsequent modifications are not visible until the snapshot in which the object was created is applied.</li> <li>The initial state of <code translate="no" dir="ltr">mutableStateOf()</code>, as well as their primitive versions, is the value passed in as a parameter to <code translate="no" dir="ltr">mutableStateOf()</code>. The initial state of <code translate="no" dir="ltr">mutableStateListOf()</code> and <code translate="no" dir="ltr">mutableStateMapOf()</code> is empty.</li> <li>Added <code translate="no" dir="ltr">Snapshot.isInSnapshot</code> and <code translate="no" dir="ltr">Snapshot.PreexistingSnapshotId</code> that are used to enable a state object to support being immediately accessible from the global snapshot upon its creation.</li> <li>Custom state objects can support being immediately accessible by following the pattern of changes made to the built-in snapshot objects. (<a href="https://android-review.googlesource.com/#/q/I84a17f3cb84c7335a93b759b9eff908c487e83a8">I84a17</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed merging of <code translate="no" dir="ltr">readObserver</code> in nested snapshots. This caused nested derived states to under-invalidate when used inside a <code translate="no" dir="ltr">snapshotFlow</code>. (<a href="https://android-review.googlesource.com/#/q/Idf1380c80ff9d651a930391c833ef3e403765afa">Idf138</a>)</li> </ul> <h3 id="1.7.0-alpha06" data-text="Version 1.7.0-alpha06" tabindex="-1">Version 1.7.0-alpha06</h3> <p>April 3, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-alpha06</code> is released. Version 1.7.0-alpha06 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/a57d7d17753695012b58c9ce7ad55a8d39157e62..02b55f664eba38e42e362e1af3913be1df552d55/compose/runtime">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix provide single values handling <code translate="no" dir="ltr">providesDefault</code> (<a href="https://android-review.googlesource.com/#/q/Ie91e0e0106aedafb03850a9a1bdf560bc0960d55">538f45</a>)</li> <li>Avoid a deadlock in the Recomposer accessing the frame clock (<a href="https://android-review.googlesource.com/#/q/Iff3f93b195b92adcc58210ae4a7f633bac390bb3">07e5c6</a>)</li> </ul> <h3 id="1.7.0-alpha05" data-text="Version 1.7.0-alpha05" tabindex="-1">Version 1.7.0-alpha05</h3> <p>March 20, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-alpha05</code> is released. Version 1.7.0-alpha05 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/638a8d3a474af45f6ad5fdc3d6d1836ea42d1778..a57d7d17753695012b58c9ce7ad55a8d39157e62/compose/runtime">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Clear late changes on deactivated composition (<a href="https://android-review.googlesource.com/#/q/I30694ea01cb64cd675c5542346b43cea67133bc9">5950bc</a>)</li> </ul> <h3 id="1.7.0-alpha04" data-text="Version 1.7.0-alpha04" tabindex="-1">Version 1.7.0-alpha04</h3> <p>March 6, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-alpha04</code> is released. Version 1.7.0-alpha04 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/e1b82c49c59d8e976ce558aba5586f6c61bc9054..638a8d3a474af45f6ad5fdc3d6d1836ea42d1778/compose/runtime">these commits</a>.</p> <p><strong>Performance Improvements</strong></p> <ul> <li>Call <code translate="no" dir="ltr">Snapshot.current</code> once per derived state evaluation (<a href="https://android-review.googlesource.com/#/q/I56b506c51222ff15588e80e3090d3bc8731fcc99">ee7daf</a>)</li> <li>Read <code translate="no" dir="ltr">currentRecord</code> once per observation in composition (<a href="https://android-review.googlesource.com/#/q/Ie9b7e0b9d296802c38b0a1c91ab2cc9650aa71ea">b882b2</a>)</li> <li>Remove accidental iterator allocation in <code translate="no" dir="ltr">snapshotFlow</code> (<a href="https://android-review.googlesource.com/#/q/I45c7948014ee647de0532dd5727682d5a4fcc427">231e56</a>)</li> <li>Enable <code translate="no" dir="ltr">nonSkippingGroupOptimization</code> for compose libraries. This causes the generated code for all non-restartable composable functions in androidx to be more efficient. In the future we plan to enable this by default. I(<a href="https://android-review.googlesource.com/#/q/I486ef31e83f76763ffb3d3ca6ff78f04e7b0e465">acbc08</a>)</li> </ul> <h3 id="1.7.0-alpha03" data-text="Version 1.7.0-alpha03" tabindex="-1">Version 1.7.0-alpha03</h3> <p>February 21, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/ca2a8cf8da3a3502fccc593974f8085653e38261..e1b82c49c59d8e976ce558aba5586f6c61bc9054/compose/runtime">Version 1.7.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Introduce a replace groups to improve detecting changes (<a href="https://android-review.googlesource.com/#/q/Iad90f02440e8f7c258ff493afa6cad1c6369be7a">0941b5</a>)</li> </ul> <p><strong>Performance Improvements</strong></p> <ul> <li>Improve memory allocation when detecting changes (<a href="https://android-review.googlesource.com/#/q/Ib4ce21c0506bc85d1ccb4902df0a97e4dfcea3d0">53e7fd</a>)</li> <li>Fix a memory leak in the composer (<a href="https://android-review.googlesource.com/#/q/I6e69e17eff3332df140495ed6dbcfe561957f703">0e097d</a>)</li> <li>Use <code translate="no" dir="ltr">ScopeMap</code> to pass invalidations when recomposing (<a href="https://android-review.googlesource.com/#/q/I35e2a7829b358c1c5fc24d4b64f934af22fce89f">e19a7e</a>)</li> <li>Optimize invalidations map to only keep derived states (<a href="https://android-review.googlesource.com/#/q/Iaa123305fa8e04484ef130f3bcbcafe0ac7eff02">f11c44</a>)</li> <li>Replace <code translate="no" dir="ltr">IdentityArraySet</code> usages with <code translate="no" dir="ltr">ScatterSet</code> (<a href="https://android-review.googlesource.com/#/q/I6309be8c13581d67af664cfd5fa4298650c5ec8e">db572e</a>)</li> <li>Optimize <code translate="no" dir="ltr">removeScope</code> in <code translate="no" dir="ltr">ScopeMap</code> (<a href="https://android-review.googlesource.com/#/q/If6cd7a2d1054ab2a6ab834f7a8ee37e0bcb2ee02">bb0530</a>)</li> </ul> <h3 id="1.7.0-alpha02" data-text="Version 1.7.0-alpha02" tabindex="-1">Version 1.7.0-alpha02</h3> <p>February 7, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2b3fea6e026942389e9db59a4d68f2bb32c94e8f..ca2a8cf8da3a3502fccc593974f8085653e38261/compose/runtime">Version 1.7.0-alpha02 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Invalidate composable lambdas in subcompositions on the same frame. (<a href="https://android-review.googlesource.com/#/q/I56bfb6fa98f05744587461158f933877aa8f64d4">98301c</a>)</li> <li>Call <code translate="no" dir="ltr">onRelease</code> callback in the same order as <code translate="no" dir="ltr">onForgotten</code>. (<a href="https://android-review.googlesource.com/#/q/I0429d56ae6d02406fbc6f062d1c1ca040030ab09">2cd790</a>)</li> <li>Filter changed states that are not observed in <code translate="no" dir="ltr">snapshotFlow</code>. (<a href="https://android-review.googlesource.com/#/q/I5dee9640ea65854d17678f3672ad5efcd0b34b72">796b80</a>)</li> </ul> <p><strong>Performance Improvements</strong></p> <ul> <li>Modify snapshot observer in place when it is already transparent. (<a href="https://android-review.googlesource.com/#/q/I164e559b46fbafec67f10e06d851b664fe159503">f60f30</a>)</li> <li>Optimize <code translate="no" dir="ltr">SnapshotIdSet.lowest()</code>. (<a href="https://android-review.googlesource.com/#/q/I418ec6b87b76ab85f4ff41b87cb2ba2a03b587b6">7ae149</a>)</li> <li>Use an allocation-free <code translate="no" dir="ltr">fold()</code> in <code translate="no" dir="ltr">SnapshotIdSet</code>. (<a href="https://android-review.googlesource.com/#/q/Ia0c807844305f6505867b007a2e9268f2bdf0b0d">532b7d</a>)</li> <li>Remove iterator allocation (<a href="https://android-review.googlesource.com/#/q/I7cbac6de6c91c1f272afcf086d977fbeae5cc0e7">83f96b</a>)</li> </ul> <h3 id="1.7.0-alpha01" data-text="Version 1.7.0-alpha01" tabindex="-1">Version 1.7.0-alpha01</h3> <p>January 24, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.7.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2b3fea6e026942389e9db59a4d68f2bb32c94e8f/compose/runtime">Version 1.7.0-alpha01 contains these commits.</a></p> <p><strong>Performance Optimizations</strong></p> <ul> <li>Add the ability to create slots after a child group has been added (<a href="https://android-review.googlesource.com/#/q/I570eb93a9e588c5197853b53396102b10a777b0f">b5960c</a>)</li> <li>Optimize recording modifications of snapshot states (<a href="https://android-review.googlesource.com/#/q/Id3f888de859e9ca4aa185879d766567e3bc87162">28c3fe</a>)</li> <li>Enable strong skipping mode (<a href="https://android-review.googlesource.com/#/q/I5e6a1ebb48f214f82a3f188b0810e0b6f7dba03e">ed1766</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Account for default parameter meta in intrinsic remember (<a href="https://android-review.googlesource.com/#/q/I02d6b381ad96a3b5869c94180c32afe2984f8e89">096665</a>)</li> <li>Make <code translate="no" dir="ltr">currentCompoundHashKey</code> unique in more cases (<a href="https://android-review.googlesource.com/#/q/I65507c0d4f5ac5d92db2619b284b1f3266c04e2f">d4a872</a>)</li> <li>Realize groups when exiting inline function call (<a href="https://android-review.googlesource.com/#/q/I8a3906eadb951657c350e5ecf5b7597c4611e881">2a90fc</a>)</li> </ul> <h2 id="version_16_2" data-text="Version 1.6" tabindex="-1">Version 1.6</h2> <h3 id="1.6.8" data-text="Version 1.6.8" tabindex="-1">Version 1.6.8</h3> <p>June 12, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.8</code> is released. Version 1.6.8 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/9a13a0e3b1197d66bfc19b9051576bc705f2c337..9dbbab668fd22cd643de4651197354a828aaa7b9/compose/runtime">these commits</a>.</p> <h3 id="1.6.7" data-text="Version 1.6.7" tabindex="-1">Version 1.6.7</h3> <p>May 1, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.7</code> is released. Version 1.6.7 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/a886cfe86852600d131eb7fa1ec8b7d0a8fc1e6b..9a13a0e3b1197d66bfc19b9051576bc705f2c337/compose/runtime">these commits</a>.</p> <h3 id="1.6.6" data-text="Version 1.6.6" tabindex="-1">Version 1.6.6</h3> <p>April 17, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.6</code> is released. No changes since the last release.</p> <h3 id="1.6.5" data-text="Version 1.6.5" tabindex="-1">Version 1.6.5</h3> <p>April 3, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.5</code> is released. Version 1.6.5 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/1cbb6ee3e46f538bb2dc7ef6ce8e9c4b3cbc4dc3..917ada96acf0ac343128c3f4af9bd67a4b80b99c/compose/runtime">these commits</a>.</p> <h3 id="1.6.4" data-text="Version 1.6.4" tabindex="-1">Version 1.6.4</h3> <p>March 20, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.4</code> is released. Version 1.6.4 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/22b329dfa8888198eb3024650d236b3afe6c0907..1cbb6ee3e46f538bb2dc7ef6ce8e9c4b3cbc4dc3/compose/runtime">these commits</a>.</p> <h3 id="1.6.3" data-text="Version 1.6.3" tabindex="-1">Version 1.6.3</h3> <p>March 6, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.3</code> is released. Version 1.6.3 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/af119e2e31de85654fb7b2e5a2c7e724231131fd..22b329dfa8888198eb3024650d236b3afe6c0907/compose/runtime">these commits</a>.</p> <h3 id="1.6.2" data-text="Version 1.6.2" tabindex="-1">Version 1.6.2</h3> <p>February 21, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.2</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f639ccf09a84fa5af4a9016fa239539aeed40b94..af119e2e31de85654fb7b2e5a2c7e724231131fd/compose/runtime">Version 1.6.2 contains these commits.</a></p> <h3 id="1.6.1" data-text="Version 1.6.1" tabindex="-1">Version 1.6.1</h3> <p>February 7, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4c61c4d68d2bf0ccc61e316bc2a03754bb6979cf..f639ccf09a84fa5af4a9016fa239539aeed40b94/compose/runtime">Version 1.6.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Call <code translate="no" dir="ltr">onRelease</code> callback in the same order as <code translate="no" dir="ltr">onForgotten</code>. (<a href="https://android-review.googlesource.com/#/q/I0429d56ae6d02406fbc6f062d1c1ca040030ab09">2cd790</a>)</li> <li>Filter changed states that are not observed in <code translate="no" dir="ltr">snapshotFlow</code>. (<a href="https://android-review.googlesource.com/#/q/I5dee9640ea65854d17678f3672ad5efcd0b34b72">796b80</a>)</li> </ul> <h3 id="1.6.0" data-text="Version 1.6.0" tabindex="-1">Version 1.6.0</h3> <p>January 24, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/296c44d6ba03d2167bdea85d53e8387d7b1644f9..4c61c4d68d2bf0ccc61e316bc2a03754bb6979cf/compose/runtime">Version 1.6.0 contains these commits.</a></p> <p><strong>Important changes since 1.5.0</strong></p> <p><strong>New Features</strong></p> <ul> <li>Re-throw exceptions that are swallowed during recomposition loop (<a href="https://android-review.googlesource.com/#/q/I93d0b31d3d4a4b0298db5d604572761fad143464">4dff9a</a>)</li> </ul> <p><strong>Performance Optimizations</strong></p> <ul> <li>Optimize recording modifications of snapshot states (<a href="https://android-review.googlesource.com/#/q/Id3f888de859e9ca4aa185879d766567e3bc87162">28c3fe</a>)</li> <li>Optimize <code translate="no" dir="ltr">rememberSaveable</code> (<a href="https://android-review.googlesource.com/#/q/Idb32853a52d502222acdd0c156bf9f8ed30cc352">f01d79</a>)</li> <li>Defer re-reading derived states until changes are recorded (<a href="https://android-review.googlesource.com/#/q/I561cb932a478d3797a1ff8e2e59147ae505d47c1">f38099</a>)</li> <li>Improve providing composition local values (<a href="https://android-review.googlesource.com/#/q/I5486fae04c873dac4947848e536446a97b6e13f9">a337ea</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix slot table memory leak (<a href="https://android-review.googlesource.com/#/q/I21097e85475bc01da5297ca31161d04ecdc7547f">73fcfe</a>)</li> <li>Skip recomposition of subcompositions that will be removed. (<a href="https://android-review.googlesource.com/#/q/Ieeb9919897a9f9b4274ddc77e66608a673cd1112">Ieeb99</a>, <a href="https://issuetracker.google.com/issues/254645321">b/254645321</a>)</li> <li>Only trigger <code translate="no" dir="ltr">RememberObserver</code> lifecycles when it is stored in remember calculation. (<a href="https://android-review.googlesource.com/#/q/I9ef6f7f45b623079f0f394c7ba4943554fc29263">f6b4dc</a>)</li> <li>Restrict <code translate="no" dir="ltr">$dirty</code> capture to inline lambdas. (<a href="https://android-review.googlesource.com/#/q/I67f435f73ba8c5e3c96bdd21e94827364a9b5a84">acfca0</a>)</li> <li>Fix moveable content sometimes receiving the wrong composition locals. (<a href="https://android-review.googlesource.com/#/q/I99bccb7c7ef6b60ea07512c1c4d25399f9dec58f">035cd6</a>)</li> </ul> <h3 id="1.6.0-rc01" data-text="Version 1.6.0-rc01" tabindex="-1">Version 1.6.0-rc01</h3> <p>January 10, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/fc038a4bc84de9ab20493d6efa8d26f4a70214ae..6dc685be02316455881d22b69d0bb8adbe768c4f/compose/runtime">Version 1.6.0-rc01 contains these commits.</a></p> <h3 id="1.6.0-beta03" data-text="Version 1.6.0-beta03" tabindex="-1">Version 1.6.0-beta03</h3> <p>December 13, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-beta03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/15c82aaef0f1fd0307d6c00061859e5b6c4384c6..fc038a4bc84de9ab20493d6efa8d26f4a70214ae/compose/runtime">Version 1.6.0-beta03 contains these commits.</a></p> <h3 id="1.6.0-beta02" data-text="Version 1.6.0-beta02" tabindex="-1">Version 1.6.0-beta02</h3> <p>November 29, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1f80a6f0c1cb96288c04124001fa2c9bd29617d6..15c82aaef0f1fd0307d6c00061859e5b6c4384c6/compose/runtime">Version 1.6.0-beta02 contains these commits.</a></p> <h3 id="1.6.0-beta01" data-text="Version 1.6.0-beta01" tabindex="-1">Version 1.6.0-beta01</h3> <p>November 15, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/465c5c5b7a0d79793bddb26a695f67aba8ea2f7e..1f80a6f0c1cb96288c04124001fa2c9bd29617d6/compose">Version 1.6.0-beta01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Propagate Certain stability values in annotation. <a href="https://android-review.googlesource.com/#/q/Ib39a8b8d9a598a252ea7489686f264dab27b802a">(274a4c)</a></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Use referential policy for composition local scope state in context. <a href="https://android-review.googlesource.com/#/q/I315f1c664890023342196659c5ff6eba2b70d553">(83361c)</a></li> <li>Restrict $dirty capture to inline lambdas. <a href="https://android-review.googlesource.com/#/q/I67f435f73ba8c5e3c96bdd21e94827364a9b5a84">(acfca0)</a></li> <li>Fix moveable content sometimes receiving the wrong composition locals. <a href="https://android-review.googlesource.com/#/q/I99bccb7c7ef6b60ea07512c1c4d25399f9dec58f">(035cd6)</a></li> <li>Use faster non-allocating hashmaps in <code translate="no" dir="ltr">RecomposeScopeImpl</code>. <a href="https://android-review.googlesource.com/#/q/I7b4b55329003827c0555082a27d7d88d871efecd">(d79494)</a></li> <li>Use <code translate="no" dir="ltr">ObjectIntMap</code> in <code translate="no" dir="ltr">DerivedState</code>. <a href="https://android-review.googlesource.com/#/q/Ib10a28f4e870ddcc123716c1cfd2d0962c7ee945">(21862e)</a></li> <li>Use <code translate="no" dir="ltr">IntRef</code> for int <code translate="no" dir="ltr">SnapshotThreadLocal</code> in <code translate="no" dir="ltr">DerivedState</code>. <a href="https://android-review.googlesource.com/#/q/I30b27c826147e51017d11e61a166912dfb7cf497">(04eaf4)</a></li> </ul> <h3 id="1.6.0-alpha08" data-text="Version 1.6.0-alpha08" tabindex="-1">Version 1.6.0-alpha08</h3> <p>October 18, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-alpha08</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1f7407d4293384a1b91bc142880e3525048b3443..465c5c5b7a0d79793bddb26a695f67aba8ea2f7e/compose/runtime">Version 1.6.0-alpha08 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Only trigger <code translate="no" dir="ltr">RememberObserver</code> lifecycles when it is stored in remember calculation. (<a href="https://android-review.googlesource.com/#/q/I9ef6f7f45b623079f0f394c7ba4943554fc29263">f6b4dc</a>)</li> <li>Improve allocations in invalidations list sorting. (<a href="https://android-review.googlesource.com/#/q/Icfbd9eeafefc5a1c5467503bb3f0030904fffd69">954d63</a>)</li> <li>Use new non-allocating maps in <code translate="no" dir="ltr">SnapshotStateObserver</code>. (<a href="https://android-review.googlesource.com/#/q/Ie107e8ec8be2550f56ca86943cf292232f90b7eb">4303ce</a>)</li> <li>Clear invalidations when composition is deactivated. (<a href="https://android-review.googlesource.com/#/q/I533e2012ba44c8918639a069a21e133bed349d51">e001be</a>)</li> </ul> <h3 id="1.6.0-alpha07" data-text="Version 1.6.0-alpha07" tabindex="-1">Version 1.6.0-alpha07</h3> <p>October 4, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-alpha07</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1f7407d4293384a1b91bc142880e3525048b3443/compose/runtime">Version 1.6.0-alpha07 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">SnapshotStateList</code> is now marked as <code translate="no" dir="ltr">RandomAccess</code> to enable the direct indexing version of list helpers to be used. (<a href="https://android-review.googlesource.com/#/q/I5210ca5c0f490619381ecf93ac0b1ccb03071e36">I5210c</a>, <a href="https://issuetracker.google.com/issues/219554654">b/219554654</a>)</li> </ul> <h3 id="1.6.0-alpha06" data-text="Version 1.6.0-alpha06" tabindex="-1">Version 1.6.0-alpha06</h3> <p>September 20, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-alpha06</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9ce75ea1baa2af10dda8f787f69c40c6654bcac1..91bb8c1f81dcb031bda00fcd8e55f1e890b56f06/compose/runtime">Version 1.6.0-alpha06 contains these commits.</a></p> <h3 id="1.6.0-alpha05" data-text="Version 1.6.0-alpha05" tabindex="-1">Version 1.6.0-alpha05</h3> <p>September 6, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-alpha05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/216f103fa4a5c7247f7bafc8bb3014616c265f0c..9ce75ea1baa2af10dda8f787f69c40c6654bcac1/compose/runtime">Version 1.6.0-alpha05 contains these commits.</a></p> <h3 id="1.6.0-alpha04" data-text="Version 1.6.0-alpha04" tabindex="-1">Version 1.6.0-alpha04</h3> <p>August 23, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5d7dd999525725bd038a00ca4e89e0fef624a6da..216f103fa4a5c7247f7bafc8bb3014616c265f0c/compose/runtime">Version 1.6.0-alpha04 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Re-throw exceptions that are swallowed during recomposition loop (<a href="https://android-review.googlesource.com/#/q/I93d0b31d3d4a4b0298db5d604572761fad143464">4dff9a</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Added a method to deactivate <code translate="no" dir="ltr">ReusableComposition</code>, removing observations but keeping nodes in place. The deactivated composition can be activated again by calling <code translate="no" dir="ltr">setContent</code>. (<a href="https://android-review.googlesource.com/#/q/Ib7f318c47b9e4cad19da5702ddd0ea69fc4fa827">Ib7f31</a>)</li> <li>Add <code translate="no" dir="ltr">ReusableComposition</code> interface for managing lifecycle and reuse of subcompositions. (<a href="https://android-review.googlesource.com/#/q/I812d1fa36791857a04471882d5edabea1400c15e">I812d1</a>, <a href="https://issuetracker.google.com/issues/252846775">b/252846775</a>)</li> </ul> <h3 id="1.6.0-alpha03" data-text="Version 1.6.0-alpha03" tabindex="-1">Version 1.6.0-alpha03</h3> <p>August 9, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4aed940027a19667e67d155563fc5fa8b7279313..5d7dd999525725bd038a00ca4e89e0fef624a6da/compose/runtime">Version 1.6.0-alpha03 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix new <code translate="no" dir="ltr">CompositionLocalProvider</code> optimization (<a href="https://android-review.googlesource.com/#/q/I883c3ba691e41821944a3020eaa1089130cf11a3">3118e88</a>)</li> <li>Correct how movable content nodes are disassembled. (<a href="https://android-review.googlesource.com/#/q/I5a12f4174c5ec7cf9809dfae9ac61bfa8f454f4b">5e3d59b</a>)</li> </ul> <h3 id="1.6.0-alpha02" data-text="Version 1.6.0-alpha02" tabindex="-1">Version 1.6.0-alpha02</h3> <p>July 26, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/3b5b931546a48163444a9eddc533489fcddd7494..4aed940027a19667e67d155563fc5fa8b7279313/compose/runtime">Version 1.6.0-alpha02 contains these commits.</a></p> <p><strong>New Features & Performance Enhancements</strong></p> <ul> <li>Optimize <code translate="no" dir="ltr">rememberSaveable</code> (<a href="https://android-review.googlesource.com/#/q/Idb32853a52d502222acdd0c156bf9f8ed30cc352">f01d79</a>)</li> <li>Defer re-reading derived states until changes are recorded (<a href="https://android-review.googlesource.com/#/q/I561cb932a478d3797a1ff8e2e59147ae505d47c1">f38099</a>)</li> <li>Improve providing composition local values (<a href="https://android-review.googlesource.com/#/q/I5486fae04c873dac4947848e536446a97b6e13f9">a337ea</a>)</li> <li><code translate="no" dir="ltr">SideEffect</code> is marked as <code translate="no" dir="ltr">@ExplicitGroupsComposable</code> to avoid generating a group. (<a href="https://android-review.googlesource.com/#/q/I7481512ddcdfa2db575828225e2b81363bdf01ac">I74815</a>)</li> <li>Avoid comparing composition local maps on reuse (<a href="https://android-review.googlesource.com/#/q/I098d5478ae8dadc9c5f0aa50f74ab99f3274a15d">782071</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Added a special case overload for <code translate="no" dir="ltr">CompositionLocalProviders</code> that avoids overhead used to make providing multiple values faster but is overhead when providing a single value. (<a href="https://android-review.googlesource.com/#/q/I6d640d97b96c26d9120c396063d84c73d947b852">I6d640</a>, <a href="https://issuetracker.google.com/issues/288169379">b/288169379</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix slot table memory leak (<a href="https://android-review.googlesource.com/#/q/I21097e85475bc01da5297ca31161d04ecdc7547f">73fcfe</a>)</li> <li>Fix how we restore <code translate="no" dir="ltr">rememberSaveable</code> when <code translate="no" dir="ltr">stateSaver</code> returns null (<a href="https://android-review.googlesource.com/#/q/Ie51f499a7e2996cf509dbb340131f6b5a40fcf9c">90748c</a>)</li> </ul> <h3 id="1.6.0-alpha01" data-text="Version 1.6.0-alpha01" tabindex="-1">Version 1.6.0-alpha01</h3> <p>June 21, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.6.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9eb2d144f9209cb9c4205ad1f981eb7ddf29b96e..3b5b931546a48163444a9eddc533489fcddd7494/compose/runtime">Version 1.6.0-alpha01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Skip recomposition of subcompositions that will be removed. (<a href="https://android-review.googlesource.com/#/q/Ieeb9919897a9f9b4274ddc77e66608a673cd1112">Ieeb99</a>, <a href="https://issuetracker.google.com/issues/254645321">b/254645321</a>)</li> <li>Reduced allocations when applying snapshots. (<a href="https://android-review.googlesource.com/#/q/I65c09492518269d6605a4731effd164d93be023a">I65c09</a>)</li> <li>Avoid calculating <code translate="no" dir="ltr">readableHash</code> in <code translate="no" dir="ltr">DerivedState</code> if snapshot wasn't modified (<a href="https://android-review.googlesource.com/#/q/Iadb225542a94e5df2a59021696ad151eefa930c8">68c565</a>)</li> </ul> <h2 id="version_15_2" data-text="Version 1.5" tabindex="-1">Version 1.5</h2> <h3 id="1.5.4" data-text="Version 1.5.4" tabindex="-1">Version 1.5.4</h3> <p>October 18, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.4</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4ed495b997a532cc4cbe39abdbaa98b8fc6f3764..b6d5e6e62e40f6938bdbcfef1d6c8a79e25006f8/compose/runtime">Version 1.5.4 contains these commits.</a></p> <h3 id="1.5.3" data-text="Version 1.5.3" tabindex="-1">Version 1.5.3</h3> <p>October 4, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.3</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2bc777611812ef8ef7329a332fbaf8348af05ec7..4ed495b997a532cc4cbe39abdbaa98b8fc6f3764/compose/runtime">Version 1.5.3 contains these commits.</a></p> <h3 id="1.5.2" data-text="Version 1.5.2" tabindex="-1">Version 1.5.2</h3> <p>September 27, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.2</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/0a2cac855f7723e1e485c20ac68d34dc8bb68d1e..2bc777611812ef8ef7329a332fbaf8348af05ec7/compose/runtime">Version 1.5.2 contains these commits.</a></p> <h3 id="1.5.1" data-text="Version 1.5.1" tabindex="-1">Version 1.5.1</h3> <p>September 6, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/65e3f15108d25a7e1c5c841c0855b21eca194070..824a15c9a34e9d13a5f58f4066029f0a784186b6/compose/runtime">Version 1.5.1 contains these commits.</a></p> <h3 id="1.5.0" data-text="Version 1.5.0" tabindex="-1">Version 1.5.0</h3> <p>August 9, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/e423b92ad8e8707ff4031626131f05e33979eac8..65e3f15108d25a7e1c5c841c0855b21eca194070/compose/runtime">Version 1.5.0 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Removed allocations in recomposition, color animations, and <code translate="no" dir="ltr">AndroidComposeView</code>. (<a href="https://android-review.googlesource.com/#/q/Ib2bfaf0af40bc0970424f86141ae24607a2b1223">Ib2bfa</a>)</li> <li>Added a <code translate="no" dir="ltr">@StateFactoryMarker</code> annotation, to mark functions that create states and must be wrapped in a <code translate="no" dir="ltr">remember</code> call. (<a href="https://android-review.googlesource.com/#/q/I64550a0cb1647096260f00b75e7d35897878c617">I64550</a>)</li> <li>Add primitive versions of State and <code translate="no" dir="ltr">MutableState</code> (<a href="https://android-review.googlesource.com/#/q/I48e438d0af15226217b77b2ba9a970c3219580bf">fb3d89</a>)</li> <li>Added <code translate="no" dir="ltr">Snapshot.isApplyObserverNotificationPending</code> (<a href="https://android-review.googlesource.com/#/q/I672a5c268230bfa1603341dd3327733faca5ca2a">I672a5</a>)</li> <li>Added primitive versions of the <code translate="no" dir="ltr">State</code> API, allowing Int, Long, Float, and Double values to be tracked in <code translate="no" dir="ltr">State</code> objects without incurring penalties for autoboxing. Use the new factory methods <code translate="no" dir="ltr">mutableIntState(Int)</code>, <code translate="no" dir="ltr">mutableFloatStateOf(Float)</code>, etc in order to use these. (<a href="https://android-review.googlesource.com/#/q/I48e438d0af15226217b77b2ba9a970c3219580bf">I48e43</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Skip recomposition of subcompositions that will be removed. (<a href="https://android-review.googlesource.com/#/q/Ieeb9919897a9f9b4274ddc77e66608a673cd1112">Ieeb99</a>, <a href="https://issuetracker.google.com/issues/254645321">b/254645321</a>)</li> <li>Don't retain snapshot reference in <code translate="no" dir="ltr">ComposerImpl</code> (<a href="https://android-review.googlesource.com/q/commit:6f0e3949772ada45e2c376ce67a55380820206f7">0206f7</a>)</li> <li>Don’t apply composition twice (<a href="https://android-review.googlesource.com/#/q/Ie64c91900541e39b0397e9c4141be92007291353">f5791b</a>)</li> <li>Ensure invalidation for non-initialized derived state values (<a href="https://android-review.googlesource.com/#/q/I73d7888ac05f4adaa2128e01088288b7cf369fbd">aa2a92</a>)</li> <li>Call <code translate="no" dir="ltr">onEndChanges</code> during composition dispose. (<a href="https://android-review.googlesource.com/#/q/I03ddce4062cbf7fb97f0447484ac46b0aedeab35">62cc8c</a>)</li> <li>Fix moving content into a sub-composition (<a href="https://android-review.googlesource.com/#/q/Ic75f8dcaddc8c784f35f1884d662be04f084b455">4beb41</a>)</li> <li>Fix potential deadlocks (<a href="https://android-review.googlesource.com/#/q/Ie8b87caecabc88f6a6dd610805d964aed3489b85">c1a425</a> and <a href="https://android-review.googlesource.com/#/q/I5cd5b2b3388758fef0826af619c680edce07d349">8edce0</a>)</li> <li>The recomposer created for an Android window will now only block calls to <code translate="no" dir="ltr">withFrameNanos</code> instead of all composition when it receives an ON_STOP notification. This means windows associated with stopped activites will continue to recompose for data changes but the animations, or any other caller of <code translate="no" dir="ltr">withFrameNanos</code>, will block. (<a href="https://android-review.googlesource.com/#/q/Id9e7fe262710544a48c2e4fc5fcbf1d27bfaa1ba">Id9e7f</a>, <a href="https://issuetracker.google.com/issues/240975572">b/240975572</a>)</li> <li>Execute deactivation callbacks for <code translate="no" dir="ltr">LayoutNode</code> before disposing effects <a href="https://android.googlesource.com/platform/frameworks/support/+/dfbea3ec8e88bf2a9a77c1bca0b02a8e2b8b0fa4">3784073</a></li> <li>Fix changed flags for restarted lambdas <a href="https://android.googlesource.com/platform/frameworks/support/+/9d9677ac37d963a7472698f23b63bd97e68a03e9">ea81df9</a></li> <li>Fix live edit regression for Composable with nodes <a href="https://android.googlesource.com/platform/frameworks/support/+/2fc2bea6dbe7430e8add3d87e611cdeceadb309f">73fd4d8</a></li> <li>ON_STOP should pause the frame clock broadcasts instead of composition <a href="https://android.googlesource.com/platform/frameworks/support/+/66fef38b1d11e0c48b11137e6c3d007909f4a2d1">ae276f1</a></li> <li>Invalidate <code translate="no" dir="ltr">SnapshotStateObserver</code> scopes for unchanged derived states <a href="https://android.googlesource.com/platform/frameworks/support/+/c5d22e7f422942f83a8649e0dec0a5546141c52d">84d9b1c</a></li> <li>Fix potential dead-lock when disposing compositions <a href="https://android.googlesource.com/platform/frameworks/support/+/59526cdd95681694b310ae874ec2b1ad198edce0">28761fc</a></li> <li>Fix moving content into a sub-composition <a href="https://android.googlesource.com/platform/frameworks/support/+/803754d2519a47c1aec0b1a0f1b058f1024beb41">92d4156</a></li> <li>Fix changed flags for restarted lambdas (<a href="https://android-review.googlesource.com/#/q/I203ec51beb7fc8c09eb536fa435ea2f8203f046c">8a03e9</a>)</li> <li>Execute deactivation callbacks for <code translate="no" dir="ltr">LayoutNode</code> before disposing effects (<a href="https://android-review.googlesource.com/#/q/I5957617e9f15af8d581b5cf304f5312bba310169">8b0fa4</a>)</li> <li>Fix <code translate="no" dir="ltr">endToMarker()</code> when ending node groups. (<a href="https://android-review.googlesource.com/#/q/Ibe7063cf22f4bff6eda5bde05c37c1e665c09167">d71d980</a>)</li> <li>Use current <code translate="no" dir="ltr">SlotWriter</code> group for check on deactivation (<a href="https://android-review.googlesource.com/#/q/Ief210ba5d2e20734277d58ae6b5916db2c92e8db">a0b518b</a>)</li> <li>Remove the <code translate="no" dir="ltr">fill</code> in <code translate="no" dir="ltr">SlotTable.moveSlotGapTo()</code> and move it to close (<a href="https://android-review.googlesource.com/#/q/Iccc23740ba06a0aa952a5f6f52999de247ce62c5">81f9935</a>)</li> <li>Fix missing invalidations while movable content is moving (<a href="https://android-review.googlesource.com/#/q/Ic487b8f797a2862effc07d2ef020d8461717940e">1d7c024</a>)</li> <li>Fix immediate invalidations for moved movable content (<a href="https://android-review.googlesource.com/#/q/I4d23a4f5745782ae65c1e0186579842d73bdbddb">8676618</a>)</li> </ul> <p><strong>Performance Improvements</strong></p> <ul> <li>Avoid calculating <code translate="no" dir="ltr">readableHash</code> in <code translate="no" dir="ltr">DerivedState</code> if snapshot wasn't modified. (<a href="https://android-review.googlesource.com/#/q/Iadb225542a94e5df2a59021696ad151eefa930c8">307102</a>)</li> <li>Reduced allocations (<a href="https://android-review.googlesource.com/#/q/I65c09492518269d6605a4731effd164d93be023a">I65c09</a>, <a href="https://android-review.googlesource.com/q/commit:55a39a86b2af2221eee79db32036cb649bd7ea77">d7ea77</a>, <a href="https://android-review.googlesource.com/#/q/Ifc5a47a41da8c75409d987c84f672f6cc8a82682">727974</a>, and <a href="https://android-review.googlesource.com/#/q/Ib2bfaf0af40bc0970424f86141ae24607a2b1223">445808</a> )</li> <li>Quick cancellation of compose <code translate="no" dir="ltr">CoroutineScopes</code> (<a href="https://android-review.googlesource.com/#/q/I2fbb777cbdab880f062584ae86ce69e89e9a9cf0">a55362</a> and <a href="https://android-review.googlesource.com/#/q/I8fbb9904408dff4dd694f24d8a5effb7d16ed2c4">bd382f</a>)</li> <li>Overwrite records of state objects with inaccessible state records (<a href="https://android-review.googlesource.com/#/q/I9e793b3285b5102392cea30f72ed1583e798b810">c986960</a>)</li> <li>Use composer of the correct scope when realizing groups (<a href="https://android-review.googlesource.com/#/q/I0cc3c7be151edb7cbbe4114fffbde8736f7ec428">9a5e5b6</a>)</li> <li>Use <code translate="no" dir="ltr">IdentityArraySet</code> to store snapshot invalidations (<a href="https://android-review.googlesource.com/#/q/I476e3c43cabd165ad8edce928aa3b46c06952779">7f60cca</a>)</li> <li>Reduce allocations for snapshot observations (<a href="https://android-review.googlesource.com/#/q/I72da3303b1b7ea0d02324cf85f10023cdc97b564">5bc535f</a>)</li> </ul> <h3 id="1.5.0-rc01" data-text="Version 1.5.0-rc01" tabindex="-1">Version 1.5.0-rc01</h3> <p>July 26, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/81e6706c269471032b283755131d2aa4e8821a89..e423b92ad8e8707ff4031626131f05e33979eac8/compose">Version 1.5.0-rc01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li><p>Defer re-reading derived states until changes are recorded (<a href="https://android-review.googlesource.com/q/commit:14aa10be879adb028eb48b60af6de11bfdf38099">f38099</a>)</p></li> <li><p>An optional inspection to recommend migrating <code translate="no" dir="ltr">mutableStateOf()</code> calls to their corresponding specialized types for primitives is available. Its lint ID is <code translate="no" dir="ltr">AutoboxingStateCreation</code>. Previously, this inspection was enabled by default for all projects. To see this warning in Android Studio's editor and your project's lint outputs, change its severity from informational to warning (or higher) by declaring <code translate="no" dir="ltr">warning "AutoboxingStateCreation"</code> inside your module's build.gradle or build.gradle.kts configuration as shown (<a href="https://android-review.googlesource.com/#/q/I34f7ea540f782ae95630f7f94cab93d842dfdd0f">I34f7e</a>):</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><code translate="no" dir="ltr"><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">lint</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">warning</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"AutoboxingStateCreation"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> </code></pre></devsite-code></li> </ul> <h3 id="1.5.0-beta03" data-text="Version 1.5.0-beta03" tabindex="-1">Version 1.5.0-beta03</h3> <p>June 28, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.0-beta03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9eb2d144f9209cb9c4205ad1f981eb7ddf29b96e..24dc7b0781cb908b2385ec207ca1b3a72cb90093/compose/runtime">Version 1.5.0-beta03 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Skip recomposition of subcompositions that will be removed. (<a href="https://android-review.googlesource.com/#/q/Ieeb9919897a9f9b4274ddc77e66608a673cd1112">Ieeb99</a>, <a href="https://issuetracker.google.com/issues/254645321">b/254645321</a>)</li> </ul> <h3 id="1.5.0-beta02" data-text="Version 1.5.0-beta02" tabindex="-1">Version 1.5.0-beta02</h3> <p>June 7, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/d26ca4055c940126ae1663ad0d54aafd23205ea4..df792c9ff86d87f538bab5d7f9dd9f56e2437b15/compose/runtime">Version 1.5.0-beta02 contains these commits.</a></p> <p><strong>Performance Improvements</strong></p> <ul> <li>Avoid calculating <code translate="no" dir="ltr">readableHash</code> in <code translate="no" dir="ltr">DerivedState</code> if snapshot wasn't modified. (<a href="https://android-review.googlesource.com/#/q/Iadb225542a94e5df2a59021696ad151eefa930c8">307102</a>)</li> </ul> <h3 id="1.5.0-beta01" data-text="Version 1.5.0-beta01" tabindex="-1">Version 1.5.0-beta01</h3> <p>May 24, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6f3ac2bd197d5e61ab2708125b57d6ae4003ad68..d26ca4055c940126ae1663ad0d54aafd23205ea4/compose/runtime">Version 1.5.0-beta01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Removed allocations in recomposition, color animations, and <code translate="no" dir="ltr">AndroidComposeView</code> (<a href="https://android-review.googlesource.com/#/q/Ib2bfaf0af40bc0970424f86141ae24607a2b1223">Ib2bfa</a>)</li> <li>Added a <code translate="no" dir="ltr">@StateFactoryMarker</code> annotation, to mark functions that create states and must be wrapped in a <code translate="no" dir="ltr">remember</code> call. (<a href="https://android-review.googlesource.com/#/q/I64550a0cb1647096260f00b75e7d35897878c617">I64550</a>)</li> <li>Add primitive versions of State and <code translate="no" dir="ltr">MutableState</code> (<a href="https://android-review.googlesource.com/#/q/I48e438d0af15226217b77b2ba9a970c3219580bf">fb3d89</a>)</li> <li>Added <code translate="no" dir="ltr">Snapshot.isApplyObserverNotificationPending</code> (<a href="https://android-review.googlesource.com/#/q/I672a5c268230bfa1603341dd3327733faca5ca2a">I672a5</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Reduced allocations (<a href="https://android-review.googlesource.com/#/q/I65c09492518269d6605a4731effd164d93be023a">I65c09</a>, <a href="https://android-review.googlesource.com/q/commit:55a39a86b2af2221eee79db32036cb649bd7ea77">d7ea77</a>, <a href="https://android-review.googlesource.com/#/q/Ifc5a47a41da8c75409d987c84f672f6cc8a82682">727974</a>, and <a href="https://android-review.googlesource.com/#/q/Ib2bfaf0af40bc0970424f86141ae24607a2b1223">445808</a> )</li> <li>Don't retain snapshot reference in <code translate="no" dir="ltr">ComposerImpl</code> (<a href="https://android-review.googlesource.com/q/commit:6f0e3949772ada45e2c376ce67a55380820206f7">0206f7</a>)</li> <li>Quick cancellation of compose <code translate="no" dir="ltr">CoroutineScopes</code> (<a href="https://android-review.googlesource.com/#/q/I2fbb777cbdab880f062584ae86ce69e89e9a9cf0">a55362</a> and <a href="https://android-review.googlesource.com/#/q/I8fbb9904408dff4dd694f24d8a5effb7d16ed2c4">bd382f</a>)</li> <li>Don’t apply composition twice (<a href="https://android-review.googlesource.com/#/q/Ie64c91900541e39b0397e9c4141be92007291353">f5791b</a>)</li> <li>Ensure invalidation for non-initialized derived state values (<a href="https://android-review.googlesource.com/#/q/I73d7888ac05f4adaa2128e01088288b7cf369fbd">aa2a92</a>)</li> <li>Call <code translate="no" dir="ltr">onEndChanges</code> during composition dispose. (<a href="https://android-review.googlesource.com/#/q/I03ddce4062cbf7fb97f0447484ac46b0aedeab35">62cc8c</a>)</li> <li>Fix moving content into a sub-composition (<a href="https://android-review.googlesource.com/#/q/Ic75f8dcaddc8c784f35f1884d662be04f084b455">4beb41</a>)</li> <li>Fix potential deadlocks (<a href="https://android-review.googlesource.com/#/q/Ie8b87caecabc88f6a6dd610805d964aed3489b85%5D%20and%20%5B8edce0%5D(https://android-review.googlesource.com/#/q/I5cd5b2b3388758fef0826af619c680edce07d349)">c1a425</a></li> <li>ON_STOP should pause the frame clock broadcasts instead of composition (<a href="https://android-review.googlesource.com/#/q/Id9e7fe262710544a48c2e4fc5fcbf1d27bfaa1ba">f4a2d1</a>)</li> <li>Fix changed flags for restarted lambdas (<a href="https://android-review.googlesource.com/#/q/I203ec51beb7fc8c09eb536fa435ea2f8203f046c">8a03e9</a>)</li> <li>Execute deactivation callbacks for <code translate="no" dir="ltr">LayoutNode</code> before disposing effects (<a href="https://android-review.googlesource.com/#/q/I5957617e9f15af8d581b5cf304f5312bba310169">8b0fa4</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Added <code translate="no" dir="ltr">Snapshot.isApplyObserverNotificationPending</code> (<a href="https://android-review.googlesource.com/#/q/I672a5c268230bfa1603341dd3327733faca5ca2a">I672a5</a>)</li> </ul> <h3 id="1.5.0-alpha04" data-text="Version 1.5.0-alpha04" tabindex="-1">Version 1.5.0-alpha04</h3> <p>May 10, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/01bd392d5702480f8bfe61a8f8bbbea64cf362a0..6f3ac2bd197d5e61ab2708125b57d6ae4003ad68/compose/runtime">Version 1.5.0-alpha04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added primitive versions of the <code translate="no" dir="ltr">State</code> API, allowing Int, Long, Float, and Double values to be tracked in <code translate="no" dir="ltr">State</code> objects without incurring penalties for autoboxing. Use the new factory methods <code translate="no" dir="ltr">mutableIntState(Int)</code>, <code translate="no" dir="ltr">mutableFloatStateOf(Float)</code>, etc in order to use these. (<a href="https://android-review.googlesource.com/#/q/I48e438d0af15226217b77b2ba9a970c3219580bf">I48e43</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><p>Call <code translate="no" dir="ltr">onEndChanges</code> during composition dispose. Focus nodes removed during <code translate="no" dir="ltr">Composition.dispose</code> are subscribing to <code translate="no" dir="ltr">onEndChanges</code> to reset focus.(<a href="https://android-review.googlesource.com/#/q/I03ddce4062cbf7fb97f0447484ac46b0aedeab35">03d4a47</a>)</p></li> <li><p>Ensure invalidation for non-initialized derived state values. Each derived state is associated with a list of its dependencies in <code translate="no" dir="ltr">SnapshotStateObserver</code>, used to invalidate scopes associated with derived state whenever dependency changes. The dependency change is registered on snapshot advance, which can happen after derived state read (due to the call to <code translate="no" dir="ltr">Snapshot.notifyObjectsInitialized()</code>).</p> <p>Previous derived state observation logic in <code translate="no" dir="ltr">SnapshotStateObserver</code> was cleaning up old dependencies, then reading new value. This resulted in a race condition with invalidation happening in a cleaned up state, where dependency invalidation wasn't registered.</p> <p>This change reorders derived state read and dependency cleanup, ensuring that invalidation always happens in a valid state. (<a href="https://android-review.googlesource.com/#/q/I73d7888ac05f4adaa2128e01088288b7cf369fbd">c472be6</a>)</p></li> </ul> <h3 id="1.5.0-alpha03" data-text="Version 1.5.0-alpha03" tabindex="-1">Version 1.5.0-alpha03</h3> <p>April 19, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/a200cb82769634cecdb118ec4f0bfdf0b086e597..01bd392d5702480f8bfe61a8f8bbbea64cf362a0/compose/runtime">Version 1.5.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>The recomposer created for an Android window will now only block calls to <code translate="no" dir="ltr">withFrameNanos</code> instead of all composition when it receives an ON_STOP notification. This means windows associated with stopped activites will continue to recompose for data changes but the animations, or any other caller of <code translate="no" dir="ltr">withFrameNanos</code>, will block. (<a href="https://android-review.googlesource.com/#/q/Id9e7fe262710544a48c2e4fc5fcbf1d27bfaa1ba">Id9e7f</a>, <a href="https://issuetracker.google.com/issues/240975572">b/240975572</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix potential deadlock in snapshot list and map <a href="https://android.googlesource.com/platform/frameworks/support/+/5e7f64d97283fb2be1db3f0d5c6dcd1a55c1a425">5c1a425</a></li> <li>Execute deactivation callbacks for <code translate="no" dir="ltr">LayoutNode</code> before disposing effects <a href="https://android.googlesource.com/platform/frameworks/support/+/dfbea3ec8e88bf2a9a77c1bca0b02a8e2b8b0fa4">3784073</a></li> <li>Fix changed flags for restarted lambdas <a href="https://android.googlesource.com/platform/frameworks/support/+/9d9677ac37d963a7472698f23b63bd97e68a03e9">ea81df9</a></li> <li>Fix live edit regression for Composable with nodes <a href="https://android.googlesource.com/platform/frameworks/support/+/2fc2bea6dbe7430e8add3d87e611cdeceadb309f">73fd4d8</a></li> <li>ON_STOP should pause the frame clock broadcasts instead of composition <a href="https://android.googlesource.com/platform/frameworks/support/+/66fef38b1d11e0c48b11137e6c3d007909f4a2d1">ae276f1</a></li> <li>Invalidate <code translate="no" dir="ltr">SnapshotStateObserver</code> scopes for unchanged derived states <a href="https://android.googlesource.com/platform/frameworks/support/+/c5d22e7f422942f83a8649e0dec0a5546141c52d">84d9b1c</a></li> <li>Fix potential dead-lock when disposing compositions <a href="https://android.googlesource.com/platform/frameworks/support/+/59526cdd95681694b310ae874ec2b1ad198edce0">28761fc</a></li> <li>Fix moving content into a sub-composition <a href="https://android.googlesource.com/platform/frameworks/support/+/803754d2519a47c1aec0b1a0f1b058f1024beb41">92d4156</a></li> </ul> <h3 id="1.5.0-alpha02" data-text="Version 1.5.0-alpha02" tabindex="-1">Version 1.5.0-alpha02</h3> <p>April 5, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5e7d256f82fbafb6d059ab7b18fddd87c7531553..a200cb82769634cecdb118ec4f0bfdf0b086e597/compose/runtime">Version 1.5.0-alpha02 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Kotlin’s <code translate="no" dir="ltr">getValue</code> operator can now be composable (<a href="https://android-review.googlesource.com/#/q/Ib40ff82e608811673f64d80d2accd5121e8a4b7c">f174f6e</a>)</li> </ul> <p><strong>Bug Fixes, Performance Improvements</strong></p> <ul> <li>Overwrite records of state objects with inaccessible state records (<a href="https://android-review.googlesource.com/#/q/I9e793b3285b5102392cea30f72ed1583e798b810">c986960</a>)</li> <li>Use composer of the correct scope when realizing groups (<a href="https://android-review.googlesource.com/#/q/I0cc3c7be151edb7cbbe4114fffbde8736f7ec428">9a5e5b6</a>)</li> <li>Fix <code translate="no" dir="ltr">endToMarker()</code> when ending node groups. (<a href="https://android-review.googlesource.com/#/q/Ibe7063cf22f4bff6eda5bde05c37c1e665c09167">d71d980</a>)</li> <li>Use current <code translate="no" dir="ltr">SlotWriter</code> group for check on deactivation (<a href="https://android-review.googlesource.com/#/q/Ief210ba5d2e20734277d58ae6b5916db2c92e8db">a0b518b</a>)</li> <li>Use <code translate="no" dir="ltr">IdentityArraySet</code> to store snapshot invalidations (<a href="https://android-review.googlesource.com/#/q/I476e3c43cabd165ad8edce928aa3b46c06952779">7f60cca</a>)</li> <li>Remove the <code translate="no" dir="ltr">fill</code> in <code translate="no" dir="ltr">SlotTable.moveSlotGapTo()</code> and move it to close (<a href="https://android-review.googlesource.com/#/q/Iccc23740ba06a0aa952a5f6f52999de247ce62c5">81f9935</a>)</li> <li>Fix missing invalidations while movable content is moving (<a href="https://android-review.googlesource.com/#/q/Ic487b8f797a2862effc07d2ef020d8461717940e">1d7c024</a>)</li> <li>Fix immediate invalidations for moved movable content (<a href="https://android-review.googlesource.com/#/q/I4d23a4f5745782ae65c1e0186579842d73bdbddb">8676618</a>)</li> <li>Reduce allocations for snapshot observations (<a href="https://android-review.googlesource.com/#/q/I72da3303b1b7ea0d02324cf85f10023cdc97b564">5bc535f</a>)</li> </ul> <h3 id="1.5.0-alpha01" data-text="Version 1.5.0-alpha01" tabindex="-1">Version 1.5.0-alpha01</h3> <p>March 22, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.5.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/ce5f1f96b304c7952d07c5bb472112c4b0ee2312..5e7d256f82fbafb6d059ab7b18fddd87c7531553/compose/runtime">Version 1.5.0-alpha01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Adds <code translate="no" dir="ltr">Modifier.Node#coroutineScope</code> to allow <code translate="no" dir="ltr">Modifier.Nodes</code> to launch coroutines (<a href="https://android-review.googlesource.com/#/q/I76ef9c67fb270c8d6ba4f7ccfd5379fdf7d2db69">I76ef9</a>)</li> <li>Allow <code translate="no" dir="ltr">Modifier.Nodes</code> to read <code translate="no" dir="ltr">CompositionLocals</code> by implementing the <code translate="no" dir="ltr">CompositionLocalConsumerModifierNode</code> interface. (<a href="https://android-review.googlesource.com/#/q/Ib44df147ceaad520c9102c416440d20fadadc403">Ib44df</a>)</li> </ul> <h2 id="version_14_2" data-text="Version 1.4" tabindex="-1">Version 1.4</h2> <h3 id="1.4.3" data-text="Version 1.4.3" tabindex="-1">Version 1.4.3</h3> <p>May 3, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.4.3</code> is released with no changes.</p> <h3 id="1.4.2" data-text="Version 1.4.2" tabindex="-1">Version 1.4.2</h3> <p>April 19, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.4.2</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5dcb085369a3574f1b09eaaf2a58ee0ea01c22d5..0872f930da585f7fbf6e17c74b1dc42045e8b2c6/compose/runtime">Version 1.4.2 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li><p>Fix potential deadlock in snapshot list and map <a href="https://android.googlesource.com/platform/frameworks/support/+/2eb65706778b66e205a414e96365b9e267f5c3ce">2eb6570</a></p></li> <li><p>Adding content to a <code translate="no" dir="ltr">SnapshotStateList</code> or <code translate="no" dir="ltr">SnapshotStateMap</code> can encounter a deadlock if the modification is concurrent with a direct write to the state record. This was made significantly more likely to be encountered with the changes introduced by <a href="https://android-review.googlesource.com/#/q/I9e793b3285b5102392cea30f72ed1583e798b810">93fcae828b</a> that uses direct writes to release unused records.</p></li> <li><p>The locks are now ordered in that a snapshot lock is never attempted to be taken when a map or list lock is held.</p></li> </ul> <h3 id="1.4.1" data-text="Version 1.4.1" tabindex="-1">Version 1.4.1</h3> <p>April 5, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.4.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/c13b30cf6683e0a43585416f30b55e07bf2b560e..5dcb085369a3574f1b09eaaf2a58ee0ea01c22d5/compose/runtime">Version 1.4.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix <code translate="no" dir="ltr">endToMarker()</code> when ending node groups. <a href="https://android-review.googlesource.com/#/q/Ibe7063cf22f4bff6eda5bde05c37c1e665c09167">d71d980</a></li> </ul> <h3 id="1.4.0" data-text="Version 1.4.0" tabindex="-1">Version 1.4.0</h3> <p>March 22, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.4.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/548c8ac2570ae6cf15798fea1380491f7d93796b..c5b142d6ab0494c996b2378d5008ac1cd6da75f3/compose/runtime">Version 1.4.0 contains these commits.</a></p> <p><strong>Important changes since 1.3.0</strong></p> <ul> <li>Use initialized value from <code translate="no" dir="ltr">LiveData</code> for first composition <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2433877">3680e25</a></li> <li>Add <code translate="no" dir="ltr">ComposeNodeLifecycleCallback</code> to observe lifecycle of compose nodes. <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2392879">8b6a258</a></li> <li>Add <code translate="no" dir="ltr">parameterTypes</code> property to <code translate="no" dir="ltr">ComposableMethod</code> <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2285054">7b6c7ad</a></li> </ul> <p><strong>Bug Fixes & Performance Improvements</strong></p> <ul> <li>Clear both scope indexes in <code translate="no" dir="ltr">SnapshotStateObserver</code> <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2450646">29f4a3e</a></li> <li>Add groups needed in the body of unskippable lambdas <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2418924">7d06752</a></li> <li>Improve memory reference characteristics of Snapshot state <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2366970">93fcae8</a></li> <li>Remove boxing in composition local lookups <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2393022">0875717</a></li> <li>Use correct key for non-reusable nodes groups <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2375738">6388d8d</a></li> <li>Protect <code translate="no" dir="ltr">SnapshotStateObserver</code> from recursive and concurrent applies <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2360799">98cb6ba</a></li> <li>Added a check-index-bounds check in the <code translate="no" dir="ltr">IdentityArraySet</code> "get" method <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2325197">35a77d3</a></li> <li>Update compose module to use <code translate="no" dir="ltr">ViewTreeLifecycleOwner</code> extensions <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2321999">21c2122</a></li> <li>Send apply notifications after Recomposer finishes frame. <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2296013">98f2641</a></li> <li>Fix index out of bounds crash when cancelling the Recomposer <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2305731">8f8656f</a></li> <li>Always force recompose if parent providers of Composition have changed <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2292300">9526fcc</a></li> <li>Recomposer tolerance for cancelled Jobs <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2267995">a55f7ed</a></li> <li>Improve handling invalidations for large number of composers <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2258823">9b7ed67</a></li> <li>Fix generating closing groups for non-local returns <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2174652">b6f590c</a></li> </ul> <h3 id="1.4.0-rc01" data-text="Version 1.4.0-rc01" tabindex="-1">Version 1.4.0-rc01</h3> <p>March 8, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.4.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/87533b4ff06971ed59028936cd9b6da988cd4522..6022301db806601f282c53b8cbb5a981923a1589/compose/runtime">Version 1.4.0-rc01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/29f4a3ef8c36a1af7ea4f1d35e669e1d19fe4b23">Clear both scope indexes in <code translate="no" dir="ltr">SnapshotStateObserver</code></a></li> </ul> <h3 id="1.4.0-beta02" data-text="Version 1.4.0-beta02" tabindex="-1">Version 1.4.0-beta02</h3> <p>February 22, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime:1.4.0-beta02</code> and <code translate="no" dir="ltr">androidx.compose.runtime:runtime-saveable:1.4.0-beta02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f7337eab774a6ce3b17367d5f31708564b66e677..87533b4ff06971ed59028936cd9b6da988cd4522/compose/runtime">Version 1.4.0-beta02 contains these commits.</a></p> <h3 id="1.4.0-beta01" data-text="Version 1.4.0-beta01" tabindex="-1">Version 1.4.0-beta01</h3> <p>February 8, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.4.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/e5dad1e7d1c225f89f7c2d5a39a7a0de8d637d7b..f7337eab774a6ce3b17367d5f31708564b66e677/compose/runtime">Version 1.4.0-beta01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">ComposeNodeLifecycleCallback</code> was added which allows to observe lifecycle of Compose nodes (<a href="https://android-review.googlesource.com/#/q/I3731b3face6bf8c4a9646dff7c22055a1a999620">I3731b</a>)</li> <li>Added <code translate="no" dir="ltr">@TestOnly</code> to <code translate="no" dir="ltr">Composer.disableSourceInformation()</code> as this function is only safe to call in a test. (<a href="https://android-review.googlesource.com/#/q/I896c84a91e1ec01f0107c52def0900196e2cde45">I896c8</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Remove boxing in composition local lookups (<a href="https://android-review.googlesource.com/#/q/I178a48a0643f8ed5d498014cf43c9063b146c66c">62f66a</a>)</li> <li>Improve memory reference characteristics of Snapshot state (<a href="https://android-review.googlesource.com/#/q/I04ff2e1b8766615590908bafb79fda135744c506">dfb451</a>)</li> </ul> <h3 id="1.4.0-alpha05" data-text="Version 1.4.0-alpha05" tabindex="-1">Version 1.4.0-alpha05</h3> <p>January 25, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime:1.4.0-alpha05</code> and <code translate="no" dir="ltr">androidx.compose.runtime:runtime-saveable:1.4.0-alpha05</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/adf1c279a86ab3886e1666c08e2c3efba783367b..e5dad1e7d1c225f89f7c2d5a39a7a0de8d637d7b/compose/runtime">Version 1.4.0-alpha05 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>More type/nullability of inline/deprecated-hidden functions (<a href="https://android-review.googlesource.com/#/q/I24f91d55dabdd4f7ee05b8a679a4e928acc95d6d">I24f91</a>)</li> </ul> <h3 id="1.4.0-alpha04" data-text="Version 1.4.0-alpha04" tabindex="-1">Version 1.4.0-alpha04</h3> <p>January 11, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.4.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/047e199bdcb8a5cd744cc7a2f986631bfb350ec7..adf1c279a86ab3886e1666c08e2c3efba783367b/compose/runtime">Version 1.4.0-alpha04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">TestMonotonicFrameClock</code> now uses correct experimental annotation. (<a href="https://android-review.googlesource.com/#/q/I95c9efb389cad81cb9182ff83910f53c7a99c239">I95c9e</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Protect <code translate="no" dir="ltr">SnapshotStateObserver</code> from recursive and concurrent applies (<a href="https://android-review.googlesource.com/#/q/I5556dd8624dd008bfc49431dc8de02c8e0578e68">d902fb</a>)</li> </ul> <h3 id="1.4.0-alpha03" data-text="Version 1.4.0-alpha03" tabindex="-1">Version 1.4.0-alpha03</h3> <p>December 7, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.4.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/a1e318590b217ecfce1b2de17eed2f18b6a680bb..047e199bdcb8a5cd744cc7a2f986631bfb350ec7/compose/runtime">Version 1.4.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>adding a new public method to <code translate="no" dir="ltr">ComposableMethod</code> class analogous to <code translate="no" dir="ltr">java.lang.reflect.Method#getParameterTypes()</code> (<a href="https://android-review.googlesource.com/#/q/Iab0c3375bb20c9831512f1aa3c63eab8f2a46209">Iab0c3</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Snapshot apply notifications are now sent after the <code translate="no" dir="ltr">Recomposer</code> finishes applying changes. (<a href="https://android-review.googlesource.com/#/q/Iad6c0dcd163a5a8f9c5aec426da3d4f701ca509f">Iad6c0</a>, <a href="https://issuetracker.google.com/issues/222093277">b/222093277</a>)</li> </ul> <h3 id="1.4.0-alpha02" data-text="Version 1.4.0-alpha02" tabindex="-1">Version 1.4.0-alpha02</h3> <p>November 9, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.4.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/548c8ac2570ae6cf15798fea1380491f7d93796b..a1e318590b217ecfce1b2de17eed2f18b6a680bb/compose/runtime">Version 1.4.0-alpha02 contains these commits.</a></p> <h3 id="1.4.0-alpha01" data-text="Version 1.4.0-alpha01" tabindex="-1">Version 1.4.0-alpha01</h3> <p>October 24, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.4.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/e6ab75d133443eb5c1d92f910f625741041fc591..548c8ac2570ae6cf15798fea1380491f7d93796b/compose/runtime">Version 1.4.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">SnapshotStateList</code> and <code translate="no" dir="ltr">SnapshotStateMap</code> now have explicit implementaions of <code translate="no" dir="ltr">toList()</code> and <code translate="no" dir="ltr">toMap()</code>, respectfully. These methods return their current content without peforming a copy as they return the internal immutable data used to store their content. This value can be used, for example, to produce a flow of values using <code translate="no" dir="ltr">snapshotFlow</code> without requiring copying of the data. (<a href="https://android-review.googlesource.com/#/q/Ica2bd64be73862b8497bf756c5b0537987d691e5">Ica2bd</a>)</li> </ul> <h2 id="version_13_2" data-text="Version 1.3" tabindex="-1">Version 1.3</h2> <h3 id="1.3.3" data-text="Version 1.3.3" tabindex="-1">Version 1.3.3</h3> <p>January 11, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.3</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8476d588d4975cb86be01bf4e356c5605ad89d48..59e93356f8f2bfb40b6f56dc086c8b821bbebda6/compose/runtime">Version 1.3.3 contains these commits.</a></p> <ul> <li>No changes since 1.3.2</li> </ul> <h3 id="1.3.2" data-text="Version 1.3.2" tabindex="-1">Version 1.3.2</h3> <p>December 7, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.2</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/d29f2a87e3c1d5cb6dfde828400d67b6f161be63..8476d588d4975cb86be01bf4e356c5605ad89d48/compose/runtime">Version 1.3.2 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Updated to support androidx.compose.ui 1.3.2</li> </ul> <h3 id="1.3.1" data-text="Version 1.3.1" tabindex="-1">Version 1.3.1</h3> <p>November 9, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b5cb4dae1f526ce2408f450b50ade8708684b2be..d29f2a87e3c1d5cb6dfde828400d67b6f161be63/compose/runtime">Version 1.3.1 contains these commits.</a></p> <h3 id="1.3.0" data-text="Version 1.3.0" tabindex="-1">Version 1.3.0</h3> <p>October 24, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/3c2d5397fb8ef697bb04bfc7e98721e2dc0aa255..b5cb4dae1f526ce2408f450b50ade8708684b2be/compose/runtime">Version 1.3.0 contains these commits.</a></p> <p><strong>Important changes since 1.2.0</strong></p> <p><strong>Exception Handling / Live Edit Support</strong></p> <ul> <li>In order to better support live edit, APIs were added to enable handling of exceptions during composition</li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/2819ab44af5776f76d8ac1e29d33e50a0b929a61">Composition error handling for hot reload</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/ae943d2f8299b58a3054f70b83d2bdd8d6e6913d">Handle live edit errors on save/restore</a></li> </ul> <p><strong>Composition Tracing</strong></p> <ul> <li>Runtime tracing APIs were added in order to support new composition tracing tooling</li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/24ece7949cc87f232664336a0fb7f26839378aa5">Generate composable trace event start/end calls</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/96e00fb1786ae4bc4a515d22d13f995ece7ed2b5">Re-added ComposerKt.traceEventStart(Int, String)</a> </li> </ul> <p><strong>Composable Reflection APIs</strong></p> <ul> <li>A new <code translate="no" dir="ltr">ComposableMethod</code> API was added to allow for more reliable reflection-based invocations of composable APIs.</li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/5d0660b9e8113873c8887ce74bb989aa1c212191">Move invokeComposable to compose runtime</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/eb253ee20bd005b0b419e2157d96c06a96e92916">Rework API to invoke composable method</a></li> </ul> <p><strong>Runtime Fixes</strong></p> <ul> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/bc7b810e4bcb1702e46b562682b6c96830cab649">Fix faulty range test for slot table checking for markers</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/07b6f4372eb02255568de41924515ec50d0acd94">Allow movable content to move into and out of SubcomposeLayout</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/63e59df34fcb10d627a3aea2d22013888ee76993">Fix moving content to new content of a subcomposition</a></li> </ul> <p><strong>Snapshot System</strong></p> <ul> <li>The snapshot system got various improvements around memory management, performance, and correctness.</li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/486f60a81dd4accb2a52106005f002fac4ddddff">Optimize scope removal in SnapshotStateObserver</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/e82b3518094e5451dd4697f31a412c10075b28c5">Dispose nested snapshots created from transparent snapshots</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/c5ff609874b5f7c19f7dfadcadcb7651d4ee14cd">Fixed race condition when reading state from the global snapshot</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/0f8c4cc72262771896665eb83887ec4f7ea5a225">Support DerivedState in SnapshotStateObserver</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/4945dfa31180f343697de5810b99ec80a48dc386">Prevent removing derived state from composition when it is read in other scopes</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/fbe8655d6c56990f4de613176939a52f2bc9fa9a">Use IdentityArrayMap instead of HashMap inside DerivedState</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/ae918365742eadb840fe89c72ec8b14b9dacf8a1">Update derived state observers to use mutable vector</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/62ef19d62c33659c190b4018d8ffb67d929bcc61">Update SnapshotStateObserver state cleanup</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/4088aca726bb99f5c007ef61209fddacdb8817ad">Replace SnapshotStateObserver.invalidated with ArraySet</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/c5ff609874b5f7c19f7dfadcadcb7651d4ee14cd">Fixed race condition when reading state from the global snapshot</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/bfd2a904f9e78db21b23b8c5420260f95fb16129">Fix use of stale record in DerivedState hash calculation</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/2abd2315fd690a61c868684c93018ed79ad949d1">Fix race condition when advancing the global snapshot</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/05812da909010aa9c73251849aac4b970a5a9209">Speed up scope observations cleanup in SnapshotStateObserver</a></li> </ul> <h3 id="1.3.0-rc01" data-text="Version 1.3.0-rc01" tabindex="-1">Version 1.3.0-rc01</h3> <p>October 5, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/bdce26bd7556b92d2d4d2af3de881dd8e2c51459..e6ab75d133443eb5c1d92f910f625741041fc591/compose/runtime">Version 1.3.0-rc01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed <code translate="no" dir="ltr">ArrayIndexOutOfBoundsException</code> coming from the slot table (<a href="https://issuetracker.google.com/issues/249076084">b/249076084</a>)</li> </ul> <h3 id="1.3.0-beta03" data-text="Version 1.3.0-beta03" tabindex="-1">Version 1.3.0-beta03</h3> <p>September 21, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.0-beta03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/cce7b70f6a5ebf955cf748a73c18b63228b22c74..bdce26bd7556b92d2d4d2af3de881dd8e2c51459/compose/runtime">Version 1.3.0-beta03 contains these commits.</a></p> <p><strong>Behavior Breaking Change</strong></p> <ul> <li>The parameter to <code translate="no" dir="ltr">remember</code> and <code translate="no" dir="ltr">rememberCoroutineScope</code> where changed to be <code translate="no" dir="ltr">crossinline</code>. This will report an error for early returns instead of allowing an early return which will cause a later internal error to be reported.</li> <li>This change can potentially lead to new compiler errors to be reported requiring non-local returns to be removed from the lambdas passed to these functions. (<a href="https://android-review.googlesource.com/#/q/Ibea62b31341fb386f47d495ce6bb1708fbfa6c0a">Ibea62</a>)</li> </ul> <h3 id="1.3.0-beta02" data-text="Version 1.3.0-beta02" tabindex="-1">Version 1.3.0-beta02</h3> <p>September 7, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/d9910e143f859716fd850a1f0036147622d6089b..cce7b70f6a5ebf955cf748a73c18b63228b22c74/compose/runtime">Version 1.3.0-beta02 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Updated API (<a href="https://android-review.googlesource.com/#/q/I64ca0ae49dffb777379fc90d6be8e05a3f89378a">I64ca0</a>)</li> </ul> <h3 id="1.3.0-beta01" data-text="Version 1.3.0-beta01" tabindex="-1">Version 1.3.0-beta01</h3> <p>August 24, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/bea814b246f89ff7244e3c6b0648f0b57e47897c..d9910e143f859716fd850a1f0036147622d6089b/compose/runtime">Version 1.3.0-beta01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>A <code translate="no" dir="ltr">find</code> method was added to <code translate="no" dir="ltr">CompositionData</code> to allow developer tools using this API to quickly find a sub-group of composition using its identity. (<a href="https://android-review.googlesource.com/#/q/I5794ff3ee6a036d3e425b21d092dba3caaeed4bb">I5794f</a>)</li> </ul> <h3 id="1.3.0-alpha03" data-text="Version 1.3.0-alpha03" tabindex="-1">Version 1.3.0-alpha03</h3> <p>August 10, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/a7f0710ad21f556f0dde9bf7bdab6d2135170fd4..bea814b246f89ff7244e3c6b0648f0b57e47897c/compose/runtime">Version 1.3.0-alpha03 contains these commits.</a></p> <h3 id="1.3.0-alpha02" data-text="Version 1.3.0-alpha02" tabindex="-1">Version 1.3.0-alpha02</h3> <p>July 27, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8094b683499b4098092c01028b55a38b49e357f2..a7f0710ad21f556f0dde9bf7bdab6d2135170fd4/compose/runtime">Version 1.3.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Re-added <code translate="no" dir="ltr">ComposerKt.traceEventStart(Int, String)</code> for backwards compatibility (<a href="https://android-review.googlesource.com/#/q/I6e6de7e8a7c9eb0fa8eee7a6adf1b4234f76811d">I6e6de</a>)</li> </ul> <h3 id="1.3.0-alpha01" data-text="Version 1.3.0-alpha01" tabindex="-1">Version 1.3.0-alpha01</h3> <p>June 29, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.3.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8328bd32e5ca96bc5a53d6369130e856cd2ca80b..8094b683499b4098092c01028b55a38b49e357f2/compose/runtime">Version 1.3.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Moving utility functionality to runtime (<a href="https://android-review.googlesource.com/#/q/I4f729ac5919a71218d89e8892ab9d96b8c76aa96">I4f729</a>)</li> </ul> <h2 id="version_12_2" data-text="Version 1.2" tabindex="-1">Version 1.2</h2> <h3 id="1.2.1" data-text="Version 1.2.1" tabindex="-1">Version 1.2.1</h3> <p>August 10, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1e0793130863c72dc4a2d02bc975128f3ef0158b..3c2d5397fb8ef697bb04bfc7e98721e2dc0aa255/compose/runtime">Version 1.2.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed memory leak: dispose of nested snapshots created from transparent snapshots <a href="https://issuetracker.google.com/239603305">b/239603305</a></li> </ul> <h3 id="1.2.0" data-text="Version 1.2.0" tabindex="-1">Version 1.2.0</h3> <p>July 27, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/564504df2d2c03ea9d48f868e09764418772a8a7..1e0793130863c72dc4a2d02bc975128f3ef0158b/compose/runtime">Version 1.2.0 contains these commits.</a></p> <p><strong>Important changes since <code translate="no" dir="ltr">1.1.0</code></strong></p> <ul> <li><p>Compose Runtime had a handful of features introduced in 1.2.0, along with many stabilizing bug fixes. The most significant new feature was the <a href="https://android.googlesource.com/platform/frameworks/support/+/f66e3a1be22d3490e8ff10474510bb8abf73c9f9">introduction of the <code translate="no" dir="ltr">movableContentOf</code>API</a>, which can be used to enable complex UX such as shared element transitions. The <code translate="no" dir="ltr">movableContentOf</code> API converts a composable lambda into a lambda that moves it state, and corresponding nodes, to any new location it is called. When the previous call leaves the composition the state is temporarily preserved and if a new call to the lambda enters the composition then the state, and associated Nodes, are moved to the location of the new call. If no new call is added the state is removed permanently and remember observers are notified.</p></li> <li><p>If a <code translate="no" dir="ltr">movableContentOf</code> lambda is called multiple times in the same composition, new state and nodes are created for each call and, as calls leave the composition and new calls enter, the state is moved from the first leaving calls to the entering calls in the order they are called. All state not claimed by new calls is removed permanently.</p></li> <li><p>In addition to this and a few other new features, much time was spent stabilizing the runtime and Snapshot state system. Various memory leaks were removed and code paths optimized.</p></li> <li><p>A summarized list of the changes can be found below:</p></li> </ul> <p><strong>New Features in <code translate="no" dir="ltr">1.2</code></strong></p> <ul> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/2ff1b5569536ab54fcc9442320f24ee2b58cf02e">Add experimental snapshot unsafeEnter/Leave</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/30abde422d8213dea266b1ddff7b4bbc39c74024">Add Snapshot.asContextElement experimental API</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/53805a49b7369999a2eb0f0230a8bbd99e86bbf8">Introduce Snapshot.withoutReadObservation</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/f66e3a1be22d3490e8ff10474510bb8abf73c9f9">Allow state to move within a composition</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/8176d9bb38dc25d1d6c4cc247bb57c3e5e6e4308">Tracing of Recompositions in Compose</a></li> </ul> <p><strong>Performance in <code translate="no" dir="ltr">1.2</code></strong></p> <ul> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/45982f6e6be5ac74204d6b426a6eb56c5889efbb">Improve composition local performance</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/2dfe4b4afed725fda5bf42f6a790d1d43a443db6">Baseline profiles for compose should be derived using benchmarks</a></li> </ul> <p><strong>Bug Fixes in <code translate="no" dir="ltr">1.2</code></strong></p> <ul> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/7ff668d1061ec9e732d65ec3bfa9dc3db50fd87a">Remove tracking information from release recompose scopes</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/30bc6b162ba68a8cab14a781c8c27def5d35cbbc">Prevent removing derived state from composition when it is read in other scopes</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/a1ba9c954b9cc2e36bf897e4c649f52442a07a0b">Use more efficient removeScope() in SnapshotStateObserver</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/ad7c95cd58204ef7be4cec4f999d602619c51a8a">Clean up derived state dependencies in composition</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/35585b15a00ec9022b1b9488e2a2edf23f205240">Fix currentCompositeKeyHash changing after inner recomposition inside movable content</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/896a6ccff51ea6186c047e818999d52482bdcfce">Clean up invalidated compositions during disposal</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/8e7c1e6bb6dcc0ce8133d731b6b779de21194fa1">Fix derive state read during recomposition</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/78dc85f30cb72ba38d36bee4f85509a975f19d06">Fix memory leak when observing derived state objects</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/3b830dfc084154218517a6f4e4d53f1d1203a26b">Fixed movableContent composite hash key to be consistent</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/32e4b949a79c50dbd5e935c052112c5cd4f51c54">Fix corner a case where the composer would crash</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/4504c4f219ca8491fc2a7896e0ab1f24d0718cba">Ensure forced invalidation of a group forces recomposition</a></li> <li><a href="https://android.googlesource.com/platform/frameworks/support/+/59b8fa1ec8a2d45dc9df64e05b1c4f2f2d4b58f5">Fix bug when rememberSaveable with input is restored in the wrong order</a></li> </ul> <h3 id="1.2.0-rc03" data-text="Version 1.2.0-rc03" tabindex="-1">Version 1.2.0-rc03</h3> <p>June 29, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-rc03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8328bd32e5ca96bc5a53d6369130e856cd2ca80b..e8af23f4f30713a3f6073d57558e7cde0f3056e9/compose/runtime">Version 1.2.0-rc03 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Derived state observations were previously unconditionally removed from the recompose scope and composition together, which broke other scopes which might be still observing derived state. This change only removes derived state instances if it is no longer observed by other scopes. (<a href="https://issuetracker.google.com/236618362">b/236618362</a>)</li> </ul> <h3 id="1.2.0-rc02" data-text="Version 1.2.0-rc02" tabindex="-1">Version 1.2.0-rc02</h3> <p>June 22, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-rc02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2d8badfd263991345376562fc0f247bc76ca6312..8328bd32e5ca96bc5a53d6369130e856cd2ca80b/compose/runtime">Version 1.2.0-rc02 contains these commits.</a></p> <h3 id="1.2.0-rc01" data-text="Version 1.2.0-rc01" tabindex="-1">Version 1.2.0-rc01</h3> <p>June 15, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5973fd35e79471563d11a6776b6a1816b1e33409..2d8badfd263991345376562fc0f247bc76ca6312/compose/runtime">Version 1.2.0-rc01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Interfaces in compose libraries are now built using jdk8 default interface methods (<a href="https://android-review.googlesource.com/#/q/I5bcf197603f66ec66177c98c01c3fe4868d60997">I5bcf1</a>)</li> </ul> <h3 id="1.2.0-beta03" data-text="Version 1.2.0-beta03" tabindex="-1">Version 1.2.0-beta03</h3> <p>June 1, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-beta03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6266a22ad9adaed6fa88fe98aa8adaa46eb96ccc..7cbb37cc779160b89644d03e042c129d0ce025d2/compose/runtime">Version 1.2.0-beta03 contains these commits.</a></p> <h3 id="1.2.0-beta02" data-text="Version 1.2.0-beta02" tabindex="-1">Version 1.2.0-beta02</h3> <p>May 18, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/eea19c54f6d94f1c234c4305c1329f7f1427867a..6266a22ad9adaed6fa88fe98aa8adaa46eb96ccc/compose/runtime">Version 1.2.0-beta02 contains these commits.</a></p> <h3 id="1.2.0-beta01" data-text="Version 1.2.0-beta01" tabindex="-1">Version 1.2.0-beta01</h3> <p>May 11, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/41a4e31408842caa2b58db5e4ee6ec708464425f..eea19c54f6d94f1c234c4305c1329f7f1427867a/compose/runtime">Version 1.2.0-beta01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>This is the first beta release of 1.2!</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Added experimental <code translate="no" dir="ltr">Snapshot.unsafeEnter/unsafeLeave</code> (<a href="https://android-review.googlesource.com/#/q/I108f3f633fdeed300c1260d62effd2749e38bbb3">I108f3</a>)</li> <li>Added experimental <code translate="no" dir="ltr">Snapshot.asContextElement()</code> API (<a href="https://android-review.googlesource.com/#/q/Iff072daba13e2d202e1895114cf62bb0290d10ea">Iff072</a>)</li> <li>The <code translate="no" dir="ltr">@ComposableTarget</code> annotation and annotations marked by <code translate="no" dir="ltr">@ComposableTargetMarker</code> can now be used at the file scope using the <code translate="no" dir="ltr">@file</code> prefix. Using a target annotation at the file scope will cause the compiler to assume all composable functions in the file are intended to be target the associated applier. For example, using <code translate="no" dir="ltr">@file:UiComposable</code> declares that all <code translate="no" dir="ltr">@Composable</code> functions target the Compose UI applier. A function that needs to target another applier must explicitly supply the target marker annotation for the desired applier. (<a href="https://android-review.googlesource.com/#/q/I40804e71dcc931b788c101a0be90ae1d6fc7eba1">I40804</a>)</li> </ul> <h3 id="1.2.0-alpha08" data-text="Version 1.2.0-alpha08" tabindex="-1">Version 1.2.0-alpha08</h3> <p>April 20, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-alpha08</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/7ca43e00a517eaeeedc0a21f482b17f06e3d2181..41a4e31408842caa2b58db5e4ee6ec708464425f/compose/runtime">Version 1.2.0-alpha08 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">TracingInProgress</code> to the <code translate="no" dir="ltr">CompositionTracer</code> interface. (<a href="https://android-review.googlesource.com/#/q/Ic6f12d84c8622c7a796d44cf3eb04b0e077efc97">Ic6f12</a>)</li> <li>Add <code translate="no" dir="ltr">recomposeScopeIdentity</code> to Composer (<a href="https://android-review.googlesource.com/#/q/I0c8733fc97baaec4990e85f3fcbf8904ca732eaa">I0c873</a>)</li> <li>Restricted tracing APIs (Composer.setTracer) to <code translate="no" dir="ltr">OptIn(InternalComposeTracingApi)</code>. (<a href="https://android-review.googlesource.com/#/q/I9187fb92741e90a78945ebb078686b53d103d19f">I9187f</a>)</li> <li>Added <code translate="no" dir="ltr">ResuableContentHost</code> which allows better control over the lifetime of state created for reusable content. For example, if a sub-composition is temporarily not in use then the content can be deactivated causing all the remembered state in the composition to be forgotten triggering, for example, all disposable effects. (<a href="https://android-review.googlesource.com/#/q/I2c0f297104d425e2bf673debccfe7a1729761593">I2c0f2</a>, <a href="https://issuetracker.google.com/issues/220322704">b/220322704</a>)</li> </ul> <h3 id="1.2.0-alpha07" data-text="Version 1.2.0-alpha07" tabindex="-1">Version 1.2.0-alpha07</h3> <p>April 6, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-alpha07</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5ef5671233460b844828e14a816255dbf7904868..7ca43e00a517eaeeedc0a21f482b17f06e3d2181/compose/runtime">Version 1.2.0-alpha07 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>New function <code translate="no" dir="ltr">Snapshot.withoutReadObservation { ... }</code> was added. It allows users to run the passed lambda without subscribing to the changes of the state values read during this block. You could find it useful in use cases when you want to benefit from the snapshot based thread safe write/reads, but want to be able to read the value without causing unnecessary recomposition or remeasure. (<a href="https://android-review.googlesource.com/#/q/I9f365d653483310cfda02cfa2c582fdcce8cfe33">I9f365</a>, <a href="https://issuetracker.google.com/issues/214054486">b/214054486</a>)</li> </ul> <h3 id="1.2.0-alpha06" data-text="Version 1.2.0-alpha06" tabindex="-1">Version 1.2.0-alpha06</h3> <p>March 23, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-alpha06</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/33cb12e8aba043a05b40470a5ef3be1b35114fd5..5ef5671233460b844828e14a816255dbf7904868/compose/runtime">Version 1.2.0-alpha06 contains these commits.</a></p> <h3 id="1.2.0-alpha05" data-text="Version 1.2.0-alpha05" tabindex="-1">Version 1.2.0-alpha05</h3> <p>March 9, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-alpha05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9b2b3d8efd5f00bd4af903bbaa926f6a712d0bd8..33cb12e8aba043a05b40470a5ef3be1b35114fd5/compose/runtime">Version 1.2.0-alpha05 contains these commits.</a></p> <p><strong>External Contribution</strong></p> <ul> <li>Updated to use Kotlinx coroutines 1.6.0 (<a href="https://android-review.googlesource.com/#/q/I3366d5111b2fb830d619da5402c12ea4c929391a">I3366d</a>)</li> </ul> <h3 id="1.2.0-alpha04" data-text="Version 1.2.0-alpha04" tabindex="-1">Version 1.2.0-alpha04</h3> <p>February 23, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/db2ecbef194afcddfaede22e1d884a8959a9277c..9b2b3d8efd5f00bd4af903bbaa926f6a712d0bd8/compose/runtime">Version 1.2.0-alpha04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><p>Added <code translate="no" dir="ltr">ComposableTarget</code>, <code translate="no" dir="ltr">ComposableTargetMarker</code> and <code translate="no" dir="ltr">ComposableOpenTarget</code> that allows compile time reporting of when a composable function is called targeting an applier it was not designed to use.</p> <p>In most cases the annotations can be inferred by the compose compiler plugin so using these annotation directly should be rare . The cases that cannot be inferred include creating and using a custom applier, abstract composable functions (such as interface methods), fields or global variables that are composable lambdas (local variables and parameters are inferred), or when using <code translate="no" dir="ltr">ComposeNode</code> or a related composable functions.</p> <p>For custom appliers the composable functions that calls <code translate="no" dir="ltr">ComposeNode</code> or <code translate="no" dir="ltr">ReusableComposeNode</code> need to add a <code translate="no" dir="ltr">CompoableTarget</code> annotation for the function and any composable lambda parameter types. It is recommended, however, to create an annotation that is annotated with <code translate="no" dir="ltr">ComposableTargetMarker</code> and then the marked annotation be used instead of <code translate="no" dir="ltr">ComposableTarget</code> directly. A composable annotation marked with <code translate="no" dir="ltr">ComposableTargetMarker</code> is equivalent to a <code translate="no" dir="ltr">ComposbleTarget</code> with the fully qualified name of the attribute class as the applier parameter. For an example of using <code translate="no" dir="ltr">ComposableTargetMarker</code> see <code translate="no" dir="ltr">anroidx.compose.ui.UiComposable</code>. (<a href="https://android-review.googlesource.com/#/q/I38f11b789291db89fc0bb92fc14ac5b3fcba0283">I38f11</a>)</p></li> </ul> <h3 id="1.2.0-alpha03" data-text="Version 1.2.0-alpha03" tabindex="-1">Version 1.2.0-alpha03</h3> <p>February 9, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9dceceb54300ed028a7e8fc7a3454f270337ffde..db2ecbef194afcddfaede22e1d884a8959a9277c/compose/runtime">Version 1.2.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><p>Added <code translate="no" dir="ltr">movableContentOf</code> which converts a composable lambda into a lambda that moves it state, and corresponding nodes, to any new location it is called. When the previous call leaves the composition the state is temporarily preserved and if a new call to the lambda enters the composition then the state, and associated nodes, are moved to the location of the new call. If no new call is added the state is removed permanently and remember observers are notified.</p> <p>If a <code translate="no" dir="ltr">movableContentOf</code> lambda is called multiple times in the same composition, new state and nodes are created for each call and, as calls leave the composition and new calls enter, the state is moved from the first leaving calls to the entering calls in the order they are called. All state not claimed by new calls is removed permanently. (<a href="https://android-review.googlesource.com/#/q/Ib4850095f241617a191ea7815fc947adaf867456">Ib4850</a>)</p></li> <li><p>Added a tracing API to composition to enable tools to provide more detailed tracing of composable functions. The compiler now generates calls to the tracing API which include source information. (<a href="https://android-review.googlesource.com/#/q/Ib0eb5c1ead489ab8104548f53bf30dcf1ba511ea">Ib0eb5</a>)</p> <p>To remove these calls and the associated source information from a release build, add the following Proguard rule:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Text only"><code translate="no" dir="ltr"> -assumenosideeffects public class androidx.compose.runtime.ComposerKt { boolean isTraceInProgress(); void traceEventStart(int,java.lang.String); void traceEventEnd(); } </code></pre></devsite-code></li> <li><p>Add <code translate="no" dir="ltr">InternalComposeScope</code> which gives tools the ability to identify a composable during recompositions. (<a href="https://android-review.googlesource.com/#/q/I07a3f85a74d2a20e02b55c2bfb2ce6f3c63988b2">I07a3f</a>)</p></li> </ul> <h3 id="1.2.0-alpha02" data-text="Version 1.2.0-alpha02" tabindex="-1">Version 1.2.0-alpha02</h3> <p>January 26, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f09f3e0f47cacc65a631115deac08ee8cc132ceb..9dceceb54300ed028a7e8fc7a3454f270337ffde/compose/runtime">Version 1.2.0-alpha02 contains these commits.</a></p> <h3 id="1.2.0-alpha01" data-text="Version 1.2.0-alpha01" tabindex="-1">Version 1.2.0-alpha01</h3> <p>January 12, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.2.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8b1e748d80de10c087ce57eaaa93cd209cccebad..f09f3e0f47cacc65a631115deac08ee8cc132ceb/compose/runtime">Version 1.2.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">identity</code> field to <code translate="no" dir="ltr">CompositionData</code> for generating invariant ids in the Layout Inspector. (<a href="https://android-review.googlesource.com/#/q/Ic116e6682233c31ccc4a81f8cf0cc96cac4a83ca">Ic116e</a>)</li> </ul> <p><strong>Dependency Updates</strong></p> <ul> <li>Now depends on Kotlin <code translate="no" dir="ltr">1.6.10</code>.</li> </ul> <h2 id="version_11_2" data-text="Version 1.1" tabindex="-1">Version 1.1</h2> <h3 id="1.1.1" data-text="Version 1.1.1" tabindex="-1">Version 1.1.1</h3> <p>February 23, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f9e9589a03c4b53f4401cc0cb8f763526fb885c7..564504df2d2c03ea9d48f868e09764418772a8a7/compose/runtime">Version 1.1.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix <code translate="no" dir="ltr">NullPointerException</code> at <code translate="no" dir="ltr">androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList</code> (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1947059">aosp/1947059</a>, <a href="https://issuetracker.google.com/issues/206677462">b/206677462</a>)</li> <li>Fix crash caused by clipboard content while reading from clipboard on Android. (<a href="https://android-review.googlesource.com/#/q/I0602066750e3fce55deceb709f8c04ee9a71dabf">I06020</a>, <a href="https://issuetracker.google.com/issues/197769306">b/197769306</a>)</li> <li>Fixed RTL in <code translate="no" dir="ltr">LazyVerticalGrid</code> (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1931080">aosp/1931080</a>, <a href="https://issuetracker.google.com/issues/207510535">b/207510535</a>)</li> </ul> <h3 id="1.1.0" data-text="Version 1.1.0" tabindex="-1">Version 1.1.0</h3> <p>February 9, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/0310f2e9c177573a16c2d594fffabaada9b446ea..f9e9589a03c4b53f4401cc0cb8f763526fb885c7/compose/runtime">Version 1.1.0 contains these commits.</a></p> <p><strong>Important changes since 1.0.0</strong></p> <ul> <li>Stable support for the Android 12 <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1795727/">Overscroll effect</a></li> <li>Improvements to touch target sizing</li> <li>Note that, with respect to Compose 1.0, Material components will expand their layout space to meet Material <a href="https://material.io/design/usability/accessibility.html">accessibility guidelines</a> for <a href="https://material.io/design/usability/accessibility.html#layout-and-typography">touch target size</a>. For instance, Button touch target will expand to a minimum size of <code translate="no" dir="ltr">48x48dp</code>, even if you set the Button's size to be smaller. This aligns Compose Material to the same behavior of Material Design Components, providing consistent behavior if you mix Views and Compose. This change also ensures that when you create your UI using Compose Material components, minimum requirements for touch target accessibility will be met.</li> <li>Stable support for <a href="/reference/kotlin/androidx/compose/material3/package-summary#navigationrail">Navigation Rail</a></li> <li>Graduates a number of previously experimental APIs to stable</li> <li><a href="/jetpack/androidx/releases/compose-kotlin">Support</a> for newer versions of Kotlin</li> </ul> <h3 id="1.1.0-rc03" data-text="Version 1.1.0-rc03" tabindex="-1">Version 1.1.0-rc03</h3> <p>January 26, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-rc03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8b1e748d80de10c087ce57eaaa93cd209cccebad..0310f2e9c177573a16c2d594fffabaada9b446ea/compose/runtime">Version 1.1.0-rc03 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Updated to support Compose Material <code translate="no" dir="ltr">1.1.0-rc03</code></li> </ul> <h3 id="1.1.0-rc01" data-text="Version 1.1.0-rc01" tabindex="-1">Version 1.1.0-rc01</h3> <p>December 15, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/75784ce6dbac6faa5320e5898e9472f02ab8710c..8b1e748d80de10c087ce57eaaa93cd209cccebad/compose/runtime">Version 1.1.0-rc01 contains these commits.</a></p> <h3 id="1.1.0-beta04" data-text="Version 1.1.0-beta04" tabindex="-1">Version 1.1.0-beta04</h3> <p>December 1, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-beta04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9fee5f6a2093713639af8853adbf898f7b609969..75784ce6dbac6faa5320e5898e9472f02ab8710c/compose/runtime">Version 1.1.0-beta04 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Updated to be compatible with Kotlin <code translate="no" dir="ltr">1.6.0</code></li> </ul> <h3 id="1.1.0-beta03" data-text="Version 1.1.0-beta03" tabindex="-1">Version 1.1.0-beta03</h3> <p>November 17, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-beta03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f07d12061370a603549747200c79b60239706330..cc1240d00b28657ee0c1a937f60430eaf1b03b09/compose/runtime">Version 1.1.0-beta03 contains these commits.</a></p> <h3 id="1.1.0-beta02" data-text="Version 1.1.0-beta02" tabindex="-1">Version 1.1.0-beta02</h3> <p>November 3, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/92af5b17ecee9d3c62f59e98b483e411c390f51b..f07d12061370a603549747200c79b60239706330/compose/runtime">Version 1.1.0-beta02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Snapshot code was split up into multiple files, but all still lives in the same JVM class. (<a href="https://android-review.googlesource.com/#/q/Ic6c98dc9d1e4a85a2ef5acf099bc153b0d5f4146">Ic6c98</a>)</li> </ul> <h3 id="1.1.0-beta01" data-text="Version 1.1.0-beta01" tabindex="-1">Version 1.1.0-beta01</h3> <p>October 27, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/db0888af4fa9a8eaeaf55cc1f120724bc67bdb20..92af5b17ecee9d3c62f59e98b483e411c390f51b/compose/runtime">Version 1.1.0-beta01 contains these commits.</a></p> <h3 id="1.1.0-alpha06" data-text="Version 1.1.0-alpha06" tabindex="-1">Version 1.1.0-alpha06</h3> <p>October 13, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-alpha06</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/da9716386798fc4e39075f54e5bd3317384a63e6..db0888af4fa9a8eaeaf55cc1f120724bc67bdb20/compose/runtime">Version 1.1.0-alpha06 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Removed <code translate="no" dir="ltr">InternalCompilerApi</code> from Composer methods that are required to be called cross-module (<a href="https://android-review.googlesource.com/#/q/I1aa0b78dbfb808d352e3a46de2388797548d34a9">I1aa0b</a>)</li> <li><code translate="no" dir="ltr">Recomposer.state</code> has been deprecated and replaced by <code translate="no" dir="ltr">Recomposer.currentState</code> to change its type to a StateFlow (<a href="https://android-review.googlesource.com/#/q/Ic2ab34c19176704fe2f6cd081607dfb92d86ea3c">Ic2ab3</a>, <a href="https://issuetracker.google.com/issues/197773820">b/197773820</a>)</li> </ul> <h3 id="1.1.0-alpha05" data-text="Version 1.1.0-alpha05" tabindex="-1">Version 1.1.0-alpha05</h3> <p>September 29, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-alpha05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1a3dcfb231517d6104969f17063fcc6c97ba6eeb..da9716386798fc4e39075f54e5bd3317384a63e6/compose/runtime">Version 1.1.0-alpha05 contains these commits.</a></p> <h3 id="1.1.0-alpha04" data-text="Version 1.1.0-alpha04" tabindex="-1">Version 1.1.0-alpha04</h3> <p>September 15, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/bf63d633b292368932b7ea1994e4116f95a94b5c..1a3dcfb231517d6104969f17063fcc6c97ba6eeb/compose/runtime">Version 1.1.0-alpha04 contains these commits.</a></p> <h3 id="1.1.0-alpha03" data-text="Version 1.1.0-alpha03" tabindex="-1">Version 1.1.0-alpha03</h3> <p>September 1, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1e0ab9e58c3c2ebe8152b7507938aef7e9c1acdc..bf63d633b292368932b7ea1994e4116f95a94b5c/compose/runtime">Version 1.1.0-alpha03 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>The Compose Compiler now supports older versions of the Compose Runtime (1.0). Prior to this change, the Compose Compiler was only compatible with the Compose Runtime of the same version or later. After this change, the Compose Compiler is compatible with an older version of the Compose Runtime (1.0). (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1796968">aosp/1796968</a>)</li> <li>Updated Compose <code translate="no" dir="ltr">1.1.0-alpha03</code> to depend on Kotlin <code translate="no" dir="ltr">1.5.30</code>. (<a href="https://android-review.googlesource.com/#/q/I74545c317093029a2a46707b9024ad3385854ecb">I74545</a>)</li> </ul> <h3 id="1.1.0-alpha02" data-text="Version 1.1.0-alpha02" tabindex="-1">Version 1.1.0-alpha02</h3> <p>August 18, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/d725303accfa9be6d5c3d61c7603ed1b9a780cbd..1e0ab9e58c3c2ebe8152b7507938aef7e9c1acdc/compose/runtime">Version 1.1.0-alpha02 contains these commits.</a></p> <h3 id="1.1.0-alpha01" data-text="Version 1.1.0-alpha01" tabindex="-1">Version 1.1.0-alpha01</h3> <p>August 4, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.1.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1a3ba62b97c98d85f6c0ac2fb6483fc9ac60872e..d725303accfa9be6d5c3d61c7603ed1b9a780cbd/compose/runtime">Version 1.1.0-alpha01 contains these commits.</a></p> <h2 id="version_10_2" data-text="Version 1.0" tabindex="-1">Version 1.0</h2> <h3 id="1.0.5" data-text="Version 1.0.5" tabindex="-1">Version 1.0.5</h3> <p>November 3, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.5</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/74486e447dc2667c6a4cc46b2963f40210ceb348..39088e9f5278a15516318bb8979517d532bfdac3/compose/runtime">Version 1.0.5 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a crash tracking derivedStateOf instances. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1792247">aosp/1792247</a>)</li> </ul> <h3 id="1.0.4" data-text="Version 1.0.4" tabindex="-1">Version 1.0.4</h3> <p>October 13, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.4</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4b73eb10b9c34d4659d950c12ff23cf094d4d8c7..74486e447dc2667c6a4cc46b2963f40210ceb348/compose/runtime">Version 1.0.4 contains these commits.</a></p> <p><strong>Dependency Updates</strong></p> <ul> <li>Updated to depend on Kotlin <code translate="no" dir="ltr">1.5.31</code></li> </ul> <h3 id="1.0.3" data-text="Version 1.0.3" tabindex="-1">Version 1.0.3</h3> <p>September 29, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.3</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9c1876203334d14761d2c11e47c8191ef9107989..4b73eb10b9c34d4659d950c12ff23cf094d4d8c7/compose/runtime">Version 1.0.3 contains these commits.</a></p> <p><strong>Dependency Updates</strong></p> <ul> <li>Updated to depend on Kotlin <code translate="no" dir="ltr">1.5.30</code></li> </ul> <h3 id="1.0.2" data-text="Version 1.0.2" tabindex="-1">Version 1.0.2</h3> <p>September 1, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.2</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/c076d3eb651533329571facecfb54dc72e1b0fc4..9c1876203334d14761d2c11e47c8191ef9107989/compose/runtime">Version 1.0.2 contains these commits.</a></p> <p>Updated to support the Compose <code translate="no" dir="ltr">1.0.2</code> release. Compose <code translate="no" dir="ltr">1.0.2</code> is still compatible with Kotlin <code translate="no" dir="ltr">1.5.21</code>.</p> <h3 id="1.0.1" data-text="Version 1.0.1" tabindex="-1">Version 1.0.1</h3> <p>August 4, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/7077236bd50d5bf31068c8ac40302765010a0e56..c076d3eb651533329571facecfb54dc72e1b0fc4/compose/runtime">Version 1.0.1 contains these commits.</a></p> <p><strong>Dependency Updates</strong></p> <ul> <li>Updated to depend on Kotlin <code translate="no" dir="ltr">1.5.21</code>.</li> </ul> <h3 id="1.0.0" data-text="Version 1.0.0" tabindex="-1">Version 1.0.0</h3> <p>July 28, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/abcc318573114e39365e63de4bea7736a81491af..7077236bd50d5bf31068c8ac40302765010a0e56/compose/runtime">Version 1.0.0 contains these commits.</a></p> <p><strong>Major features of 1.0.0</strong></p> <p>This is the first stable release of Compose. Please see the official <a href="https://android-developers.googleblog.com/2021/07/jetpack-compose-announcement.html">Compose Release blog</a> for more details!</p> <p><strong>Known Issues</strong></p> <ul> <li><p>If you are using Android Studio Bumblebee Canary 4 or AGP <code translate="no" dir="ltr">7.1.0-alpha04</code>/<code translate="no" dir="ltr">7.1.0-alpha05</code>, you may hit the following crash:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Text only"><code translate="no" dir="ltr"> java.lang.AbstractMethodError: abstract method "void androidx.lifecycle.DefaultLifecycleObserver.onCreate(androidx.lifecycle.LifecycleOwner)" </code></pre></devsite-code> <p>To fix, temporarily increase your minSdkVersion to 24+ in your <code translate="no" dir="ltr">build.gradle</code> file. This issue will be fixed in the next version of Android Studio Bumblebee and AGP <code translate="no" dir="ltr">7.1</code>. (<a href="https://issuetracker.google.com/issues/194289155">b/194289155</a>)</p></li> </ul> <h3 id="1.0.0-rc02" data-text="Version 1.0.0-rc02" tabindex="-1">Version 1.0.0-rc02</h3> <p>July 14, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-rc02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1a3ba62b97c98d85f6c0ac2fb6483fc9ac60872e..abcc318573114e39365e63de4bea7736a81491af/compose/runtime">Version 1.0.0-rc02 contains these commits.</a></p> <ul> <li>Fixed race conditions in SnapshotStateObserver causing spurratic NullPointerExceptions. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1763445">aosp/1763445</a>, <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1758105">aosp/1758105</a>, <a href="https://issuetracker.google.com/issues/192677711">b/192677711</a>)</li> <li>Fixed issues with runtime snapshots causing <code translate="no" dir="ltr">java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied</code> crashes. (<a href="https://issuetracker.google.com/issues/193006595">b/193006595</a>, <a href="https://issuetracker.google.com/issues/192570897">b/192570897</a>)</li> </ul> <h3 id="1.0.0-rc01" data-text="Version 1.0.0-rc01" tabindex="-1">Version 1.0.0-rc01</h3> <p>July 1, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f434dccf3dc4d4e82d8d965da3746615870537b4..1a3ba62b97c98d85f6c0ac2fb6483fc9ac60872e/compose/runtime">Version 1.0.0-rc01 contains these commits.</a></p> <h3 id="1.0.0-beta09" data-text="Version 1.0.0-beta09" tabindex="-1">Version 1.0.0-beta09</h3> <p>June 16, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-beta09</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/836237c11d7a415f28bb71acab597579be1d5227..f434dccf3dc4d4e82d8d965da3746615870537b4/compose/runtime">Version 1.0.0-beta09 contains these commits.</a></p> <p><strong>Added Profile Rules</strong></p> <p>This release adds profile rules to the following compose modules (<a href="https://android-review.googlesource.com/#/q/I14ed64578d535320a40ed8d486f75715641b2762">I14ed6</a>):</p> <ul> <li>androidx.compose.animation</li> <li>androidx.compose.animation-core</li> <li>androidx.compose.foundation</li> <li>androidx.compose.foundation-layout</li> <li>androidx.compose.material</li> <li>androidx.compose.material-ripple</li> <li>androidx.compose.runtime</li> <li>androidx.compose.ui</li> <li>androidx.compose.ui.geometry</li> <li>androidx.compose.ui.graphics</li> <li>androidx.compose.ui.text</li> <li>androidx.compose.ui.text</li> <li>androidx.compose.ui.unit</li> <li>androidx.compose.ui.util</li> </ul> <h4 id="what_are_profile_rules_2" data-text="What are profile rules?" tabindex="-1">What are profile rules?</h4> <ul> <li><p>Profile rules for a library are specified in a text file <code translate="no" dir="ltr">baseline-prof.txt</code> located in the <code translate="no" dir="ltr">src/main</code> or equivalent directory. The file specifies a rule per line, where a rule in this case is a pattern for matching to methods or classes in the library. The syntax for these rules is a superset of the human-readable ART profile format that is used when using <code translate="no" dir="ltr">adb shell profman --dump-classes-and-methods ...</code>. These rules take one of two forms to target either methods or classes.</p></li> <li><p>A method rule will have the following pattern:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><<span class="devsite-syntax-n">FLAGS><CLASS_DESCRIPTOR></span><span class="devsite-syntax-o">-</span>><<span class="devsite-syntax-n">METHOD_SIGNATURE</span>> </code></pre></devsite-code></li> <li><p>And a class rule will have the following pattern:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><<span class="devsite-syntax-n">CLASS_DESCRIPTOR</span>> </code></pre></devsite-code></li> <li><p>Here <code translate="no" dir="ltr"><FLAGS></code> is one or more of the characters <code translate="no" dir="ltr">H</code>, <code translate="no" dir="ltr">S</code>, and <code translate="no" dir="ltr">P</code> to indicate whether or not this method should be flagged as "Hot", "Startup", or "Post Startup".</p></li> <li><p>The <code translate="no" dir="ltr"><CLASS_DESCRIPTOR></code> is the descriptor for the class that the targeted method belongs to. For example, the class <code translate="no" dir="ltr">androidx.compose.runtime.SlotTable</code> would have a descriptor of <code translate="no" dir="ltr">Landroidx/compose/runtime/SlotTable;</code>.</p></li> <li><p>The <code translate="no" dir="ltr"><METHOD_SIGNATURE></code> is the signature of the method, and includes the name, parameter types, and return types of the method. For example, the method <code translate="no" dir="ltr">fun isPlaced(): Boolean</code> on <code translate="no" dir="ltr">LayoutNode</code> has the signature <code translate="no" dir="ltr">isPlaced()Z</code>.</p></li> <li><p>These patterns can have wildcards (<code translate="no" dir="ltr">**</code>, <code translate="no" dir="ltr">*</code>, and <code translate="no" dir="ltr">?</code>) in order to have a single rule encompass multiple methods or classes.</p></li> </ul> <h4 id="what_do_the_rules_do_2" data-text="What do the rules do?" tabindex="-1">What do the rules do?</h4> <ul> <li><p>A method that has the flag <code translate="no" dir="ltr">H</code> indicates that this method is a "hot" method, and should be compiled ahead of time.</p></li> <li><p>A method that has the flag <code translate="no" dir="ltr">S</code> indicates that it is a method which is called at startup, and should be compiled ahead of time to avoid the cost of compilation and interpreting the method at startup time.</p></li> <li><p>A method that has the flag <code translate="no" dir="ltr">P</code> indicates that it is a method which is called after startup.</p></li> <li><p>A class that is present in this file indicates that it is used during startup and should be pre-allocated in the heap to avoid the cost of class loading.</p></li> </ul> <h4 id="how_does_this_work_2" data-text="How does this work?" tabindex="-1">How does this work?</h4> <ul> <li>Libraries can define these rules which will be packaged in AAR artifacts. When an app is then built which includes these artifacts, these rules are merged together and the merged rules are used to build a compact binary ART profile that is specific to the app. ART can then leverage this profile when the app is installed on devices in order to ahead-of-time compile a specific subset of the application to improve the performance of the application, especially the first run. Note that this will have no effect on debuggable applications.</li> </ul> <h3 id="1.0.0-beta08" data-text="Version 1.0.0-beta08" tabindex="-1">Version 1.0.0-beta08</h3> <p>June 2, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-beta08</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b648147c5fdfc5ecbad57e40e2dc0c69aa23bf12..86ff5b4bb956431ec884586ce0aea0127e189ec4/compose/runtime">Version 1.0.0-beta08 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">State<T></code> is now <code translate="no" dir="ltr">State<out T></code> (<a href="https://android-review.googlesource.com/#/q/I690492799c315e5bf8eaa655cc160f008b6ec299">I69049</a>)</li> <li><code translate="no" dir="ltr">ControlledComposition</code> API change to enable recomposing changes in a recompose single pass. (<a href="https://android-review.googlesource.com/#/q/Iaafd1d5f11e2ee2b499745b9f111f7442563a4ce">Iaafd1</a>, <a href="https://issuetracker.google.com/issues/184173932">b/184173932</a>)</li> </ul> <h3 id="1.0.0-beta07" data-text="Version 1.0.0-beta07" tabindex="-1">Version 1.0.0-beta07</h3> <p>May 18, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-beta07</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4c1927601bfcaaaf049d0fc7a4e5801ff5cf9729..b648147c5fdfc5ecbad57e40e2dc0c69aa23bf12/compose/runtime">Version 1.0.0-beta07 contains these commits.</a></p> <aside class="note"><strong>Note:</strong><span> Libraries dependent on Compose will need to recompile with version <code translate="no" dir="ltr">1.0.0</code>‑<code translate="no" dir="ltr">beta07</code>. Otherwise, libraries may encounter a <code translate="no" dir="ltr">NoSuchMethodError</code>, such as:</br> <code translate="no" dir="ltr">java.lang.NoSuchMethodError: No interface method startReplaceableGroup(ILjava/lang/String;)V in class Landroidx/compose/runtime/Composer; or its super classes</code>. (<a href="https://android-review.googlesource.com/#/q/Ia34e699fdbeaeb86b74e9da27d79d186e6e71757">Ia34e6</a>)</span></aside> <p><strong>API Changes</strong></p> <ul> <li>Added new compose compiler APIs that allow the source information generated by the compiler to be removed during source minification. (<a href="https://android-review.googlesource.com/#/q/Ia34e699fdbeaeb86b74e9da27d79d186e6e71757">Ia34e6</a>)</li> <li><p>Introduces <code translate="no" dir="ltr">ReusableContent</code> which will attempt to reuse the nodes in its content instead of replacing them when the key is changed. When the key is changed the previous values in the slot table for the content is ignored except for the nodes that were generated and the values used to update the nodes.</p> <p>Introduces <code translate="no" dir="ltr">ReusableComposeNode</code> that will reuse the node emitted instead of replacing it as is done for <code translate="no" dir="ltr">ComposeNode</code>. (<a href="https://android-review.googlesource.com/#/q/I1dd86f88d3e96be8aee0a433746f4f3fbc54c3c6">I1dd86</a>)</p></li> <li><p><code translate="no" dir="ltr">@ComposeCompilerApi</code> no longer <code translate="no" dir="ltr">@RequiresOptIn</code> (<a href="https://android-review.googlesource.com/#/q/Iab6901114e02706221c6f1f2050d372b366ee060">Iab690</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>LazyColumn/Row will now keep up to 2 previously visible items active (not disposed) even when they are scrolled out already. This allows the component to reuse the active subcompositions when we will need to compose a new item which improves the scrolling performance. (<a href="https://android-review.googlesource.com/#/q/Ie5555c9a7031dc9bd31f452a0ed9b28d8a337f5f">Ie5555</a>)</li> </ul> <h3 id="1.0.0-beta06" data-text="Version 1.0.0-beta06" tabindex="-1">Version 1.0.0-beta06</h3> <p>May 5, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-beta06</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b04f2c39ebb45a0480dc0dc04d7fb7406646eb5e..4c1927601bfcaaaf049d0fc7a4e5801ff5cf9729/compose/runtime">Version 1.0.0-beta06 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">@ComposeCompilerApi</code> no longer <code translate="no" dir="ltr">@RequiresOptIn</code> (<a href="https://android-review.googlesource.com/#/q/Iab6901114e02706221c6f1f2050d372b366ee060">Iab690</a>)</li> </ul> <h3 id="1.0.0-beta05" data-text="Version 1.0.0-beta05" tabindex="-1">Version 1.0.0-beta05</h3> <p>April 21, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-beta05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/0e6e72e136ada934db74265667417524ba0ba04f..b04f2c39ebb45a0480dc0dc04d7fb7406646eb5e/compose/runtime">Version 1.0.0-beta05 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Removed<code translate="no" dir="ltr">@InternalComposeApi</code> for recording snapshot reads and writes (<a href="https://android-review.googlesource.com/#/q/Id134d5546887381ceb59fa420202d8f9c891fd1e">Id134d</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>The AndroidManifest files from ui-test-manifest and ui-tooling-data are now compatible with Android 12 (<a href="https://android-review.googlesource.com/#/q/I6f9dec0515ad6eb7fd232eeb124ee0164f4e90cb">I6f9de</a>, <a href="https://issuetracker.google.com/issues/184718994">b/184718994</a>)</li> </ul> <h3 id="1.0.0-beta04" data-text="Version 1.0.0-beta04" tabindex="-1">Version 1.0.0-beta04</h3> <p>April 7, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-beta04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5c42896eb6591b09e3952030fb7ea8d9b8c42713..0e6e72e136ada934db74265667417524ba0ba04f/compose/runtime">Version 1.0.0-beta04 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li><p>Prior to this change, local composable functions were skippable based on their parameters. After this change, no local composable functions will skip. This change is done because it is common and expected for local functions to capture parameters from the parent and them skipping is a common source of bugs.</p> <p>To summarize, consider the example:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-nd">@Composable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">Counter</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">count</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Int</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">onCountChange</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-kt">Int</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Unit</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nd">@Composable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">ShowCount</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Text</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"Count: </span><span class="devsite-syntax-si">$</span><span class="devsite-syntax-n">count</span><span class="devsite-syntax-s">"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ShowCount</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Button</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">onClick</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">onCountChange</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">count</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">1</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">})</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Text</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"Increment"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <p>Prior to this change, the <code translate="no" dir="ltr">ShowCount</code> composable function would always skip, even after the <code translate="no" dir="ltr">count</code> parameter was updated. This is no longer the case. (<a href="https://android-review.googlesource.com/#/q/I5648a5f11c89e71c6b8c748f111c47bcafee9178">I5648a</a>)</p></li> <li><p>Fixed the issue when <code translate="no" dir="ltr">rememberSaveable()</code> was restoring the old value when used with input params (<a href="https://android-review.googlesource.com/#/q/I1b1108e2d8f141887a46e781d4fe04a0d84cd09c">I1b110</a>, <a href="https://issuetracker.google.com/issues/182403380">b/182403380</a>)</p></li> </ul> <h3 id="1.0.0-beta03" data-text="Version 1.0.0-beta03" tabindex="-1">Version 1.0.0-beta03</h3> <p>March 24, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-beta03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/52fbd7ed5b07ca4431fa828325a1f8da45b02e51..5c42896eb6591b09e3952030fb7ea8d9b8c42713/compose/runtime">Version 1.0.0-beta03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">DefaultMonotonicFrameClock</code> is deprecated. Calling <code translate="no" dir="ltr">withFrameNanos</code> or <code translate="no" dir="ltr">Recomposer.runRecomposeAndApplyChanges</code> with no <code translate="no" dir="ltr">MonotonicFrameClock</code> will now throw <code translate="no" dir="ltr">IllegalStateException</code>. (<a href="https://android-review.googlesource.com/#/q/I4eb0d7a8ebae7497735d25bc35e9f94c66ce2232">I4eb0d</a>)</li> </ul> <h3 id="1.0.0-beta02" data-text="Version 1.0.0-beta02" tabindex="-1">Version 1.0.0-beta02</h3> <p>March 10, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/df134e0f94ac70e36764a70dc7fb6a083e0e0fab..52fbd7ed5b07ca4431fa828325a1f8da45b02e51/compose/runtime">Version 1.0.0-beta02 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Enforce restrictions on public usage of experimental APIs (<a href="https://android-review.googlesource.com/#/q/I6aa29518ed4d6a3821d921d2ae1a300e31183dcc">I6aa29</a>, <a href="https://issuetracker.google.com/issues/174531520">b/174531520</a>)</li> <li>Fix for broken <code translate="no" dir="ltr">rememberSaveable { mutableStateOf(0) }</code> when used inside a destination of navigation-compose. (<a href="https://android-review.googlesource.com/#/q/I1312b5b210dde32250945d164a2f3a1b574cb0a8">I1312b</a>, <a href="https://issuetracker.google.com/issues/180042685">b/180042685</a>, <a href="https://issuetracker.google.com/issues/180701630">b/180701630</a>)</li> </ul> <h3 id="1.0.0-beta01" data-text="Version 1.0.0-beta01" tabindex="-1">Version 1.0.0-beta01</h3> <p>February 24, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9ed3262e0dfca1d352bdbf8f8e10253a61ef6218..4b6cff92e45f1d4467086aa2c6aa0248b4883950/compose/runtime">Version 1.0.0-beta01 contains these commits.</a></p> <p>This is the first release of Compose 1.0.0 Beta.</p> <p><strong>API Changes</strong></p> <ul> <li>Add <code translate="no" dir="ltr">Recomposer.runRecomposeConcurrentlyAndApplyChanges</code> experimental API for recomposing invalidated compositions off the main frame loop. (<a href="https://android-review.googlesource.com/#/q/I342d03606de9fe04254e620296ad9b57c42da7b4">I342d0</a>)</li> <li>Any composables marked with @ReadOnlyComposable are now compile-time validated to ensure that they only make calls to other @ReadOnlyComposables (<a href="https://android-review.googlesource.com/#/q/I58961d2946c80a6a2d9e8e0cca35fd61f41ee703">I58961</a>)</li> <li><p>The <code translate="no" dir="ltr">defaultFactory</code> for <code translate="no" dir="ltr">compositionLocalOf</code> and <code translate="no" dir="ltr">staticCompositionLocalOf</code> is now required instead of optional.</p> <p>This changes removes a potential type error for non-nullable types where no default factory was provided. Previously this would provide a null reference for a non-nullable type.</p> <p>For nullable types consider supplying <code translate="no" dir="ltr">{ null }</code> as the default factory.</p> <p>We do not recommend using locals with non-nullable types unless a sensible default can be provided. If no sensible default exists, the <code translate="no" dir="ltr">defaultFactory</code> lambda should throw an exception. However throwing an exception means that consumers of the local will have an implicit dependency on it being provided that is not enforced by the type system. (<a href="https://android-review.googlesource.com/#/q/Ifbd2a8abd2f1fc4578da4b782b570ed9de088beb">Ifbd2a</a>)</p></li> <li><p>Deprecated symbols were removed from the compose runtime (<a href="https://android-review.googlesource.com/#/q/I3252c231cab96abb5b73ffb1d37410c0569490f5">I3252c</a>)</p></li> <li><p>Deprecated <code translate="no" dir="ltr">emptyContent()</code> is removed. Use <code translate="no" dir="ltr">{}</code> instead. (<a href="https://android-review.googlesource.com/#/q/Idb33f22d9a1002f86b42606dd93478ee37924445">Idb33f</a>, <a href="https://issuetracker.google.com/issues/179432510">b/179432510</a>)</p></li> <li><p>Providers has been renamed to CompositionLocalProvider</p> <ul> <li>The Composition constructor no longer accepts a key parameter, and has been deprecated.</li> <li>currentCompositeKeyHash has been turned into a composable top level property instead of a composable top level function.</li> <li>CompositionData and CompositionGroup have been moved to the androidx.compose.runtime.tooling namespace</li> <li>ComposableLambda has been made an interface instead of a concrete class, and no longer has type parameters.</li> <li>ComposableLambdaN has been made an interface instead of a concrete class, and no longer has type parameters.</li> <li>The snapshotFlow function has been moved to the androidx.compose.runtime namespace</li> <li>the merge method of SnapshotMutationPolicy is no longer experimental</li> <li>The @TestOnly top level clearRoots function has been removed. It is no longer necessary.</li> <li>keySourceInfoOf and resetSourceInfo functions have been removed. They are no longer necessary.</li> <li>Composer.collectKeySourceInformation has been removed. It is no longer necessary.</li> <li>isJoinedKey, joinedKeyLeft, and joinedKeyRight methods have been removed. They are no longer necessary.</li> <li>Various top level APIs have been moved and reorganized into different files. Due to Kotlin’s file class semantics, this will break binary compatibility but not source compatibility, so should not be an issue for most users.</li> <li>(<a href="https://android-review.googlesource.com/#/q/I99b7de8ea0fb5d73a0ee4667a65e35d976383831">I99b7d</a>, <a href="https://issuetracker.google.com/issues/177245490">b/177245490</a>)</li> </ul></li> <li><p>SnapshotStateObserver is not Experimental anymore (<a href="https://android-review.googlesource.com/#/q/Id2e6a2eaac801b2eb9ef3fcacfdadb679ffbffab">Id2e6a</a>)</p></li> <li><p>Deleted some previously deprecated APIs (<a href="https://android-review.googlesource.com/#/q/Ice5dae36591015a9d905b84b26cc02662385d831">Ice5da</a>, <a href="https://issuetracker.google.com/issues/178633932">b/178633932</a>)</p></li> <li><p>Made the following Material API changes:</p> <ul> <li>Added contentPadding parameter to Top/BottomAppBar to allow customizing the default padding.</li> <li>Reordered parameters in BackdropScaffold to follow API guidelines for required parameters being before optional parameters.</li> <li>Moved <code translate="no" dir="ltr">icon</code> parameter in BottomNavigationItem to be after <code translate="no" dir="ltr">selected</code> and <code translate="no" dir="ltr">onClick</code>.</li> <li>Renamed <code translate="no" dir="ltr">alwaysShowLabels</code> parameter in BottomNavigationItem to <code translate="no" dir="ltr">alwaysShowLabel</code>.</li> <li>Renamed <code translate="no" dir="ltr">bodyContent</code> parameters in a few components to just <code translate="no" dir="ltr">content</code>.</li> <li>Reordered parameters in <code translate="no" dir="ltr">ButtonDefaults.buttonColors()</code>. Please note that because the type of the parameters have not changed, this will not cause an error in your code - please ensure you are either using named parameters or update the ordering manually, otherwise your code will not work the same as previously.</li> <li>Added <code translate="no" dir="ltr">secondaryVariant</code> parameter to <code translate="no" dir="ltr">darkColors()</code>. This color is typically the same as <code translate="no" dir="ltr">secondary</code> in dark theme, but adding for consistency and further customization.</li> <li>Removed ElevationDefaults and animateElevation() from the public API surface since they were not commonly used / useful.</li> <li>Renamed <code translate="no" dir="ltr">onValueChangeEnd</code> in <code translate="no" dir="ltr">Slider</code> to <code translate="no" dir="ltr">onValueChangeFinished</code> and made it nullable.</li> <li>Renamed <code translate="no" dir="ltr">text</code> parameter in <code translate="no" dir="ltr">Snackbar</code> to <code translate="no" dir="ltr">content</code> for consistency.</li> <li>Added <code translate="no" dir="ltr">contentPadding</code> parameter to <code translate="no" dir="ltr">DropdownMenuItem</code> to allow customizing the default padding and made <code translate="no" dir="ltr">content</code> be an extension on <code translate="no" dir="ltr">RowScope</code>.</li> <li>Renamed <code translate="no" dir="ltr">ModalDrawerLayout</code> to <code translate="no" dir="ltr">ModalDrawer</code>.</li> <li>Renamed <code translate="no" dir="ltr">BottomDrawerLayout</code> to <code translate="no" dir="ltr">BottomDrawer</code>.</li> <li>(<a href="https://android-review.googlesource.com/#/q/I1cc669dfec6194e13843879823bfdc97f98a7d20">I1cc66</a>)</li> </ul></li> </ul> <h3 id="1.0.0-alpha12" data-text="Version 1.0.0-alpha12" tabindex="-1">Version 1.0.0-alpha12</h3> <p>February 10, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha12</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6950aab50fe6c9f7e9d97cf865161f2d3999eb9e..9ed3262e0dfca1d352bdbf8f8e10253a61ef6218/compose/runtime">Version 1.0.0-alpha12 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Support for ViewGroups was removed from UiApplier. The Deprecated emitView composables were removed. (<a href="https://android-review.googlesource.com/#/q/Ifb2141153189ac4b0fbd748a23c3de38ed155af7">Ifb214</a>)</li> <li>CompositionReference renamed to CompositionContext (<a href="https://android-review.googlesource.com/#/q/I53fcb2d87d57c95c293108bf80e54c7d17064f24">I53fcb</a>)</li> <li>ComponentActivity.setContent has moved to androidx.activity.compose.setContent in the androidx.activity:activity-compose module. (<a href="https://android-review.googlesource.com/#/q/Icf4168e6078b87ce746569a946b2a90274197c72">Icf416</a>)</li> <li>Snapshot API was updated to be more consistent with API guideline as well as hiding internal implementation classes from the public API. (<a href="https://android-review.googlesource.com/#/q/Id9e32c885473f09cd69354a4c87a2c57c5f86533">Id9e32</a>)</li> <li>Renamed Ambients to match the Ambient -> CompositionLocal rename. Ambients used to be named AmbientFoo, now CompositionLocals are named LocalFoo. (<a href="https://android-review.googlesource.com/#/q/I2d55d1c5c38a08b04e72a569d3079db4feca1bf7">I2d55d</a>)</li> <li>Renamed Ambient to CompositionLocal, and ambientOf / staticAmbientOf to compositionLocalOf / staticCompositionLocalOf respectively. This change helps to make the purpose of CompositionLocal more clear: a mechanism for providing / retrieving values local to a composition. CompositionLocal instances should be prefixed with <code translate="no" dir="ltr">Local</code>, such as val LocalFoo = compositionLocalOf { Foo() }. (<a href="https://android-review.googlesource.com/#/q/Ia55b6cb149a659a2738cd1c60540e81ef835b8cc">Ia55b6</a>)</li> <li>takeMutableSnapshot and takeSnapshot have moved to be companion methods of Snapshot. (<a href="https://android-review.googlesource.com/#/q/I91f197a054cd967e69c47fa99c40e0da7e91b83a">I91f19</a>)</li> <li><p><code translate="no" dir="ltr">@ComposableContract</code> has been deprecated in favor of three more specific annotations.</p> <p><code translate="no" dir="ltr">@ComposableContract(restartable = false)</code> has become <code translate="no" dir="ltr">@NonRestartableComposable</code> <code translate="no" dir="ltr">@ComposableContract(readonly = true)</code> has become <code translate="no" dir="ltr">@ReadOnlyComposable</code> <code translate="no" dir="ltr">@ComposableContract(preventCapture = true)</code> has become <code translate="no" dir="ltr">@DisallowComposableCalls</code> <code translate="no" dir="ltr">@ComposableContract(tracked = true)</code> has been removed. (<a href="https://android-review.googlesource.com/#/q/I60a9db0287dc0e03b38e6cf31a7d435026a2ce0f">I60a9d</a>)</p></li> <li><p>emptyContent() and (@Composable () -> Unit).orEmpty() utilities have been deprecated as they no longer have any positive performance impact or value (<a href="https://android-review.googlesource.com/#/q/I0484d3ef439993d05eea86e53f05997eced590ab">I0484d</a>)</p></li> <li><p><code translate="no" dir="ltr">snapshotFlow</code> and <code translate="no" dir="ltr">withMutableSnapshot</code> are no longer experimental (<a href="https://android-review.googlesource.com/#/q/I6a45fac62267a318481e9a3ba8a3acf3162219f6">I6a45f</a>)</p></li> <li><p>Recomposers can now be closed. Closed recomposers will continue recomposition until composition child coroutines complete. Recomposer.shutDown renamed to cancel to contrast with close. (<a href="https://android-review.googlesource.com/#/q/Ib6d766b91381ee45af41a14b7951c48f794f0a90">Ib6d76</a>)</p></li> <li><p>The <code translate="no" dir="ltr">compose:runtime-dispatch</code> artifact is now deprecated. MonotonicFrameClock can now be found in compose:runtime and AndroidUiDispatcher can be found in compose:ui. (<a href="https://android-review.googlesource.com/#/q/Ib5c36a427306eceac4b9b16b52a091e864e5b936">Ib5c36</a>)</p></li> <li><p>The API the Compose compiler plugin targets has been refactored to use an interface instead of a concrete class. The interface also no longer uses a type parameter.</p> <p>This is an internal change that should not effect source code compatibility but is a binary breaking change. (<a href="https://android-review.googlesource.com/#/q/I3b9229969aa70138bc57f5e8498602f5b2dba1e6">I3b922</a>, <a href="https://issuetracker.google.com/issues/169406779">b/169406779</a>)</p></li> <li><p>SnapshotMutableState was introduced (<a href="https://android-review.googlesource.com/#/q/Icfd03593afd98c2cd1ad94751e590f4eefbc06e5">Icfd03</a>)</p></li> <li><p>DisposableEffectDisposable was renamed to DisposaleEffectResult (<a href="https://android-review.googlesource.com/#/q/Ica7c6a63e2bc101837cdd0463d827d3a8193d6e0">Ica7c6</a>)</p></li> <li><p>Removed Recomposer.current(). [Abstract]ComposeView now default to lazily created, window-scoped Recomposers driven by the ViewTreeLifecycleOwner for the window. Recomposition and withFrameNanos-based animation ticks are paused while the host Lifecycle is stopped. (<a href="https://android-review.googlesource.com/#/q/I38e11565b2fc776966b6b6984aceafd8a1e6fed1">I38e11</a>)</p></li> <li><p>Recomposer.runningRecomposers now offers a global StateFlow of read-only RecomposerInfo for observing ongoing composition state in the process. Prefer this API to Recomposer.current(), which is now deprecated. (<a href="https://android-review.googlesource.com/#/q/If8ebe3959cfe71682ad372382d3b720035ef1605">If8ebe</a>)</p></li> <li><p>DisposableEffectDisposable was renamed to DisposaleEffectResult (<a href="https://android-review.googlesource.com/#/q/I3ea68f09bf464edace067212655a85b8d55b679b">I3ea68</a>)</p></li> </ul> <h3 id="1.0.0-alpha11" data-text="Version 1.0.0-alpha11" tabindex="-1">Version 1.0.0-alpha11</h3> <p>January 28, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha11</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6207afb1646d302c5d29c2c67d332b48db87fb27..6950aab50fe6c9f7e9d97cf865161f2d3999eb9e/compose/runtime">Version 1.0.0-alpha11 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>onCommit, onDispose, and onActive have been deprecated in favor of SideEffect and DisposableEffect APIs (<a href="https://android-review.googlesource.com/#/q/If760ec2a190c4121a35006695d953010ac22a43a">If760e</a>)</li> <li>The emit() API and all overloads have been deprecated and renamed to ComposeNode. The APIs are identical, just a different name in order to follow the naming conventions of Compose (<a href="https://android-review.googlesource.com/#/q/I4137beb6f23fb43350bf7badcbe790f59fa85e2c">I4137b</a>)</li> <li>invalidate and compositionReference() are now deprecated in favor of currentRecomposeScope and rememberCompositionReference respectively. (<a href="https://android-review.googlesource.com/#/q/I583a8efa6e3d3bc303792b825b948b3722ada103">I583a8</a>)</li> <li><p>RememberObserver replaces CompositionLifecycleObserver and CompositionLifecycleObserver is now deprecated.</p> <p><code translate="no" dir="ltr">RememberObserver</code> is a replacement for <code translate="no" dir="ltr">CompositionLifecycleObserver</code> with modified semantics and renamed methods. Changing to the new API can be done mechanically for objects that are only remembered once which is, and continues to be, the recommended practice. However, if a reference was remembered more than once in a composition <code translate="no" dir="ltr">onRemembered</code> is called for each reference where <code translate="no" dir="ltr">onEnter</code> is only called once. <code translate="no" dir="ltr">onEnter</code> was called multiple time if the object was used in subcompositions, such as <code translate="no" dir="ltr">WithConstraints</code> and <code translate="no" dir="ltr">Scaffold</code> making the single <code translate="no" dir="ltr">onEnter</code> call guarantee unreliable and it was removed for <code translate="no" dir="ltr">RememberObserver</code>.</p> <p><code translate="no" dir="ltr">RememberObserver</code> adds <code translate="no" dir="ltr">onAbandoned</code> which is called if the <code translate="no" dir="ltr">RememberObserver</code> instance is returned from the callback passed to <code translate="no" dir="ltr">remember</code> but was not remembered in the composition state and, therefore, will never have <code translate="no" dir="ltr">onRemembered</code> called. This can occur if an exception terminates composition before completing or the composition is discarded because the state is was producing a composition for is no longer current or otherwise is no longer needed. If the instance of <code translate="no" dir="ltr">RememberObserver</code> following the single reference recommendation above is tracking an external resource both <code translate="no" dir="ltr">onForgotten</code> and <code translate="no" dir="ltr">onAbandoned</code> each indicate that the resource is no longer needed. If the object is tracking work started or resources allocated in <code translate="no" dir="ltr">onRemembered</code>, <code translate="no" dir="ltr">onAbandoned</code> can be ignored as it will not be called if <code translate="no" dir="ltr">onRemembered</code> is called. (<a href="https://android-review.googlesource.com/#/q/I02c364f517507abd6a5c071fb527192ad1d77239">I02c36</a>)</p></li> <li><p>Do not mark <code translate="no" dir="ltr">collectAsState()</code> functions as inline (<a href="https://android-review.googlesource.com/#/q/Ia73e40c20f0bd5eea3b2fa870aae90ba02237cfc">Ia73e4</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>WithConstraints was reworked as BoxWithConstraints and moved to foundation.layout. (<a href="https://android-review.googlesource.com/#/q/I9420b9e0fbea7ee048b23a6ef328165bbb11e8a8">I9420b</a>, <a href="https://issuetracker.google.com/issues/173387208">b/173387208</a>)</li> <li>Leverage TestCoroutineDispatcher in testing (<a href="https://android-review.googlesource.com/#/q/I532b68e37ea6f72964fdcc267e397d285cffd9ad">I532b6</a>)</li> </ul> <h3 id="1.0.0-alpha10" data-text="Version 1.0.0-alpha10" tabindex="-1">Version 1.0.0-alpha10</h3> <p>January 13, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha10</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/72f02c12e4709ab41ae0fea9a8a668d5267a1df8..6207afb1646d302c5d29c2c67d332b48db87fb27/compose/runtime">Version 1.0.0-alpha10 contains these commits.</a></p> <p><strong>Breaking Change</strong></p> <ul> <li><p>Restructuring of the internal compiler API allows batching changes to the nodes generated as a result of composition into the "apply changes" phase of composition, after all <code translate="no" dir="ltr">@Composable</code> functions have completed.</p> <p>This is a behavioral breaking change that might affect application code as nodes are no longer available from internal and experimental APIs until after changes have been applied. This can usually be worked around by surrounding code with such dependencies in a <code translate="no" dir="ltr">SideEffect</code> composable to defer execution of the code until after the nodes have been created and initialized. (<a href="https://android-review.googlesource.com/#/q/I018dab05a0486e8db663aea39a7546aa73142c11">I018da</a>)</p></li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Added a way to track if the recomposer has applied changes. (<a href="https://android-review.googlesource.com/#/q/I1b3e25252119ddf45e1c72af5239cd1a999722ce">I1b3e2</a>)</li> <li><p>Expand [Abstract]ComposeView APIs to allow recycling Compose-based views, disposing their composition to recreate again later. Add APIs for installing and discovering window-scoped Recomposers and CompositionReferences for creating child compositions.</p> <p>Add ViewCompositionStrategy for configuring the composition disposal strategy of [Abstract]ComposeViews; default behavior is dispose on window detach. (<a href="https://android-review.googlesource.com/#/q/I860ab99a2950457157a4d904e0c514d5134fdfd7">I860ab</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Recomposer now exposes a Flow of its current state, allowing monitoring its activity and the activity of associated effects. (<a href="https://android-review.googlesource.com/#/q/Ifb2b901636db4ec2f3ad068d063f5b8f74be82f4">Ifb2b9</a>)</li> <li>The native keyEvent can now be accessed through keyEvent.nativeKeyEvent (<a href="https://android-review.googlesource.com/#/q/I87c57d68b76441fe92d2b91f58385832fc40ec8d">I87c57</a>, <a href="https://issuetracker.google.com/issues/173086397">b/173086397</a>)</li> </ul> <h3 id="1.0.0-alpha09" data-text="Version 1.0.0-alpha09" tabindex="-1">Version 1.0.0-alpha09</h3> <p>December 16, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha09</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/10b5e9fd366c1c413d5576aed50a305d300938e1..72f02c12e4709ab41ae0fea9a8a668d5267a1df8/compose/runtime">Version 1.0.0-alpha09 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><p>Removed SlotTable, SlotReader and SlotWriter from the public API. These were marked as InternalComposeAPI previously. Now they are internal to the compose module.</p> <p>CompositionData and CompositionGroup were added as a replacement for the ui-tooling API to use to extract composition information. These are public but are not intended for use outside the ui-tooling API as they provide the raw information the ui-tooling API interprets (<a href="https://android-review.googlesource.com/#/q/I31a9ca6a7e5bbf162c984394dffd7a25b059315a">I31a9c</a>)</p></li> <li><p>The Applier class is no longer considered an (<a href="https://android-review.googlesource.com/#/q/Id85b061f677b509bfc62d1fd797531520ac8e09d">Id85b0</a>)</p></li> <li><p>The <code translate="no" dir="ltr">Applier</code> interface has changed to simplify building trees bottom-up instead of top-down.</p> <p>The <code translate="no" dir="ltr">insert()</code> method has been renamed to <code translate="no" dir="ltr">insertTopDown()</code>.</p> <p>A new method, <code translate="no" dir="ltr">insertBottomUp()</code>, was added.</p> <p>An applier either inserts nodes into the tree it is editing using <code translate="no" dir="ltr">insertTopDown()</code> or <code translate="no" dir="ltr">insertBottomUp()</code> depending on which performs better.</p> <p>Some trees, such as <code translate="no" dir="ltr">LayoutNode</code> and <code translate="no" dir="ltr">View</code>, are much more efficient to build bottom-up than top-down. Prior to this change, a stack of inserts was required to implement bottom-up which needed to be copied to every applier which needed bottom-up construction for performance. With this change an <code translate="no" dir="ltr">Applier</code> overrides <code translate="no" dir="ltr">insertBottomUp()</code> to build a tree bottom-up and <code translate="no" dir="ltr">insertTopDown()</code> to build the tree top-down. (<a href="https://android-review.googlesource.com/#/q/Icbdc2929ab8fc8fce231d633b062fc80be5c10c9">Icbdc2</a>)</p></li> <li><p>Compose supports property getters that can make composable invocations. Support for this is not going away, but the syntax for declaring a property getter as being @Composable is changing.</p> <p>The now-deprecated syntax for doing this was by annotating the property itself:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nd">@Composable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">someProperty</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Int</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">get</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> </code></pre></devsite-code> <p>The now-correct syntax for doing this is by annotating the getter of the property:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">someProperty</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Int</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nd">@Composable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">get</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> </code></pre></devsite-code> <p>Both syntaxes will work for some time, but the former deprecated syntax will eventually become a compile error. (<a href="https://android-review.googlesource.com/#/q/Id91977f2583b81d3e4e51bbf120cfaf943be25d5">Id9197</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>AndroidOwner made internal (<a href="https://android-review.googlesource.com/#/q/Ibcad027dbc1794f5d202be52fe0783c73d249a25">Ibcad0</a>, <a href="https://issuetracker.google.com/issues/170296980">b/170296980</a>)</li> <li>subcomposeInto(LayoutNode) was made internal (<a href="https://android-review.googlesource.com/#/q/Id724aebef104f6404884f1a45bee9958583b7229">Id724a</a>)</li> </ul> <h3 id="1.0.0-alpha08" data-text="Version 1.0.0-alpha08" tabindex="-1">Version 1.0.0-alpha08</h3> <p>December 2, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha08</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/358bdaf3c3c4a917883408e9f747da521fdf9e65..10b5e9fd366c1c413d5576aed50a305d300938e1/compose/runtime">Version 1.0.0-alpha08 contains these commits.</a></p> <aside class="note"><strong>Note:</strong><span> This release is only compatible with Kotlin <code translate="no" dir="ltr">1.4.20</code>, so you will need to update your Kotlin version.</span></aside> <p><strong>API Changes</strong></p> <ul> <li>Added lint check for composable lambda parameter naming and position, to check for consistency with Compose guidelines. Also migrated some APIs using <code translate="no" dir="ltr">children</code> as the name for their trailing lambda to <code translate="no" dir="ltr">content</code>, according to the lint check and guidance. (<a href="https://android-review.googlesource.com/#/q/Iec48e38a2896785b521814d95c9fb624d2807315">Iec48e</a>)</li> <li>Recomposer no longer accepts an EmbeddingContext; required scheduling dependencies are obtained from the effectCoroutineContext. FrameManager is deprecated; platform integrations should initialize their own global snapshot handling. (<a href="https://android-review.googlesource.com/#/q/I02369db94b92e6ace0a7273d9d74ad44cc8cebe5">I02369</a>)</li> <li>RestorableStateHolder.withRestorableState function was renamed to RestorableStateProvider (<a href="https://android-review.googlesource.com/#/q/I66640dac2f299f5d85d270f2aa1c5d6fc8ab7128">I66640</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Deprecated Ambients named with <code translate="no" dir="ltr">Ambient</code> as their suffix, and replaced them with new properties prefixed with Ambient, following other Ambients and Compose API guidelines. (<a href="https://android-review.googlesource.com/#/q/I334403cc490ea913b8980d29e2cbe08e98ad7945">I33440</a>)</li> <li>Remove old ui-test module and its stubs (<a href="https://android-review.googlesource.com/#/q/I3a7cbbe376d0542955983fb09afd2dc37be7647e">I3a7cb</a>)</li> </ul> <h3 id="1.0.0-alpha07" data-text="Version 1.0.0-alpha07" tabindex="-1">Version 1.0.0-alpha07</h3> <p>November 11, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha07</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/234e23e470a5e7f81291f6acd12d538146dc010b..358bdaf3c3c4a917883408e9f747da521fdf9e65/compose/runtime">Version 1.0.0-alpha07 contains these commits.</a></p> <p><strong>New Features</strong></p> <p><strong>API Changes</strong></p> <ul> <li>The <code translate="no" dir="ltr">@UnionType</code> annotation has been deprecated (<a href="https://android-review.googlesource.com/#/q/I57cdec8694f46c502f7f6fc2bfe377a0ea0c075b">I57cde</a>)</li> <li>provideDefault was added as an alternative to provide for providing ambients, and it can be used to specify ambient values that will only be set when there is no ambient value already provided. (<a href="https://android-review.googlesource.com/#/q/Id663500276ad2ec3e5a5b1310a81efbf3acc0842">Id6635</a>, <a href="https://issuetracker.google.com/issues/171024925">b/171024925</a>)</li> <li>LaunchedTask was renamed to LaunchedEffect for consistency with the SideEffect and DisposableEffect APIs. LaunchedEffect with no subject params is not permitted in order to encourage best practices. (<a href="https://android-review.googlesource.com/#/q/Ifd3d4f3b529b3956915c99096eef3fb3108b2b61">Ifd3d4</a>)</li> <li>Applier now has onBeginChanges/onEndChanges callbacks that are invoked when a Composer begins/is finished applying changes to the tree. These may be used for batching resource management if needed. (<a href="https://android-review.googlesource.com/#/q/Icf4765f3fd6102d26177aac6f5f259f9b9c0c0de">Icf476</a>)</li> <li>Recomposer now requires a CoroutineContext at construction (<a href="https://android-review.googlesource.com/#/q/Ic4610c5531ceebafc3c8644a3501a8442d1479d6">Ic4610</a>)</li> <li>Changes to the internal SlotTable implementation which should not affect the public API. (<a href="https://android-review.googlesource.com/#/q/If98280439f4965fd05f21dd0362635314176eaf8">If9828</a>)</li> <li>Deprecated rxjava2 adapters which does not take the initial value were removed (<a href="https://android-review.googlesource.com/#/q/Idb72f5d9df0562cdfe1c0e77d89f228e9e01e857">Idb72f</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>foundation.Text has been deprecated and replaced with material.Text. For a basic, unopinionated text API that does not consume values from a theme, see androidx.compose.foundation.BasicText. (<a href="https://android-review.googlesource.com/#/q/If64cbdd89497f171edfd1b4de907123f73279e8d">If64cb</a>)</li> <li>BaseTextField has been deprecated. Use BasicTextField instead. (<a href="https://android-review.googlesource.com/#/q/I896eb0eb21e73bda5f269e1ffae4357201acb219">I896eb</a>)</li> <li>Several layout related symbols were moved from androidx.compose.ui to androidx.compose.layout.ui. (<a href="https://android-review.googlesource.com/#/q/I0fa982d87929e5ca9e3a32762fe9cf1fa8b8cfef">I0fa98</a>, <a href="https://issuetracker.google.com/issues/170475424">b/170475424</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Added <code translate="no" dir="ltr">runtime-rxjava3</code> module for compose. Similar to <code translate="no" dir="ltr">runtime-rxjava2</code> (<a href="https://android-review.googlesource.com/#/q/I02cbfebc2770cedd58de9d5ecbdcc87c7141a089">I02cbf</a>)</li> </ul> <h3 id="1.0.0-alpha06" data-text="Version 1.0.0-alpha06" tabindex="-1">Version 1.0.0-alpha06</h3> <p>October 28, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha06</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/dd84d35abd1bc13fe53a4632d4b3889f6062ac81..234e23e470a5e7f81291f6acd12d538146dc010b/compose/runtime">Version 1.0.0-alpha06 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Recomposer is now a CompositionReference and a valid composition parent. Explicit Recomposer is now required in fewer places. (<a href="https://android-review.googlesource.com/#/q/I4036ff66dff4759bd40127a9af0ca59cbaa37041">I4036f</a>)</li> <li>Added DisposableEffect counterpart API to SideEffect, filling the role of onCommit-with-params but with a required onDispose. <ul> <li>Added rememberUpdatedState API to publish data from recomposition to ongoing or long-lived processes such as DisposableEffects or LaunchedTasks.</li> <li>(<a href="https://android-review.googlesource.com/#/q/Id50b9b85d2303166e5abe10aea47d6934d2c8597">Id50b9</a>)</li> </ul></li> <li>MutableVector now implements RandomAccess (<a href="https://android-review.googlesource.com/#/q/I85d73f55b19cce31ba70770dbd0dc98cb3a6957a">I85d73</a>, <a href="https://issuetracker.google.com/issues/170461551">b/170461551</a>)</li> <li>Added SideEffect composable for applying side effects of composition to objects managed by the composition. SideEffect is intended to replace the onCommit composable. (<a href="https://android-review.googlesource.com/#/q/Ia77c2060e10aa8011052e18ece011297fc28831c">Ia77c2</a>)</li> <li>New experimental api RestorableStateHolder. It allows to save the state defined with [savedInstanceState] and [rememberSavedInstanceState] for the subtree before disposing it to make it possible to compose it back next time with the restored state. (<a href="https://android-review.googlesource.com/#/q/I66884b1e65f716de7936c4fe9e573efc6539b80f">I66884</a>, <a href="https://issuetracker.google.com/issues/166586419">b/166586419</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Enable transitions in ComposeTestRule; remove option to enable the blinking cursor from ComposeTestRule. (<a href="https://android-review.googlesource.com/#/q/If0de36db743b7f57b161b0fe6324565750436866">If0de3</a>)</li> </ul> <h3 id="1.0.0-alpha05" data-text="Version 1.0.0-alpha05" tabindex="-1">Version 1.0.0-alpha05</h3> <p>October 14, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/64c532a70705a33e1e12d83a42fe6aeaca6823f9..dd84d35abd1bc13fe53a4632d4b3889f6062ac81/compose/runtime">Version 1.0.0-alpha05 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Experimental Modifier.pointerInput suspending input modifier (<a href="https://android-review.googlesource.com/#/q/Ia77d26185ba835c33bf48015977667df31800dff">Ia77d2</a>)</li> <li>The scrolling performance of LazyColumn/Row is improved by doing less work in subcomposition on every scroll. The new hasInvalidations() method was added for Composition class. hasPendingChanges() method from Recomposer was renamed to hasInvalidations() (<a href="https://android-review.googlesource.com/#/q/Ib2f324dd6845fd83321e0d4f3fa6e502c346dbc3">Ib2f32</a>, <a href="https://issuetracker.google.com/issues/168293643">b/168293643</a>, <a href="https://issuetracker.google.com/issues/167972292">b/167972292</a>, <a href="https://issuetracker.google.com/issues/165028371">b/165028371</a>)</li> <li>Add produceState API for launching coroutines from composition that update a single <code translate="no" dir="ltr">State<T></code> value over time (<a href="https://android-review.googlesource.com/#/q/Id4a573e37be1f3072066dadd3032511acae8d2ff">Id4a57</a>)</li> <li>launchInComposition renamed to LaunchedTask to match Compose API guidelines (<a href="https://android-review.googlesource.com/#/q/I99a8ef39b1e1abd7b9cae898863a35ed71b62e48">I99a8e</a>)</li> <li>The order of place() calls in custom Layouts now defines the drawing order for the children (<a href="https://android-review.googlesource.com/#/q/Ibc9f6844b7309f45a8f3dadfdcda0a33b39425e6">Ibc9f6</a>)</li> </ul> <h3 id="1.0.0-alpha04" data-text="Version 1.0.0-alpha04" tabindex="-1">Version 1.0.0-alpha04</h3> <p>October 1, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/18a5639262f8504db530176550e338a5d0e2e044..f5a2c7477391539d8bc9f65a8f0db1e8a7bf2cf5/compose/runtime">Version 1.0.0-alpha04 contains these commits.</a></p> <aside class="note"><strong>Note:</strong><span> Compose Version 1.0.0-alpha04 is only compatible with Android Studio 4.2 Canary 13 and later.</span></aside> <p><strong>API Changes</strong></p> <ul> <li>Added OwnerScope to allow collection of layout and drawing observation scopes once they are no longer valid. (<a href="https://android-review.googlesource.com/#/q/Ic4cf8889e486e175e0f2405f1a0dc7a5a085ad99">Ic4cf8</a>)</li> <li>Added derivedStateOf API to create State objects based on a calculation which may read (and derive from) other State objects (<a href="https://android-review.googlesource.com/#/q/If758b97e85ac4c0c087ff0d62e4aa47da72dcf1d">If758b</a>)</li> <li>Added TestOnly API for SnapshotStateObserver (<a href="https://android-review.googlesource.com/#/q/I6e2a9e3dd227254545c29cd5e5b19fede89b7598">I6e2a9</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>foundation.Box was deprecated. Please use foundation.layout.Box instead. (<a href="https://android-review.googlesource.com/#/q/Ie59501cfd404c6bce53afee2d14dd95f1520d02c">Ie5950</a>, <a href="https://issuetracker.google.com/issues/167680279">b/167680279</a>)</li> </ul> <h3 id="1.0.0-alpha03" data-text="Version 1.0.0-alpha03" tabindex="-1">Version 1.0.0-alpha03</h3> <p>September 16, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/31022a2dda22705843be1199c786552a6f9f875d..18a5639262f8504db530176550e338a5d0e2e044/compose/runtime">Version 1.0.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">CompositionCoroutineScope</code> no longer implements <code translate="no" dir="ltr">MonotonicFrameClock</code>. Callers of <code translate="no" dir="ltr">withFrameNanos</code> should import the top-level function explicitly. (<a href="https://android-review.googlesource.com/#/q/Icb642e00a670c235f26d11e6549b4222b2b4c2fb">Icb642</a>, <a href="https://issuetracker.google.com/issues/166778123">b/166778123</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Global testing functions such as <code translate="no" dir="ltr">onNode</code> or <code translate="no" dir="ltr">waitForIdle</code> are now deprecated, please migrate to their new counterparts that are defined on ComposeTestRule (<a href="https://android-review.googlesource.com/#/q/I7f45a41128160a0e67ad07e32a1ad49774602a97">I7f45a</a>)</li> <li><code translate="no" dir="ltr">launchInComposition</code> no longer launches coroutines undispatched (<a href="https://android-review.googlesource.com/#/q/Ief6afbbd9cae98ef337808a5cb481f012df602c8">Ief6af</a>, <a href="https://issuetracker.google.com/issues/166486000">b/166486000</a>)</li> </ul> <h3 id="1.0.0-alpha02" data-text="Version 1.0.0-alpha02" tabindex="-1">Version 1.0.0-alpha02</h3> <p>September 2, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/96eb302ee1740ba656c90c9fb27df3723a1a89c1..31022a2dda22705843be1199c786552a6f9f875d/compose/runtime">Version 1.0.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Add <code translate="no" dir="ltr">snapshotFlow</code> and <code translate="no" dir="ltr">withMutableSnapshot</code> APIs for consuming and producing Snapshot data changes. (<a href="https://android-review.googlesource.com/#/q/I3e7226bacc660bdfc9ea4d781a7abfef86f5dfce">I3e722</a>)</li> <li><p>The calling convention for composable functions has changed. This is a binary breaking change. All libraries must be recompiled to work with this version of the compose compiler plugin.</p> <p>This change does not create a source level breaking change as the only APIs that have changed are compiler APIs that have an explicit opt in. (<a href="https://android-review.googlesource.com/#/q/I7afd2d7b19652ec92b8d6d1d1e92f0745968aa66">I7afd2</a>, <a href="https://issuetracker.google.com/issues/158123185">b/158123185</a>)</p></li> <li><p>Removed scheduling methods from EmbeddingContext (<a href="https://android-review.googlesource.com/#/q/I7b9bea6af71d1b610ce68c89938bbbc793193457">I7b9be</a>)</p></li> <li><p>onPreCommit is deprecated; onCommit now has onPreCommit's behavior.</p> <p>onCommit and onActive now run in the same choreographer frame that the composition changes committed in rather than at the beginning of the next choreographer frame. (<a href="https://android-review.googlesource.com/#/q/I70403eea442a7a003f08e7b1d19e44e0134ea077">I70403</a>)</p></li> </ul> <h3 id="1.0.0-alpha01" data-text="Version 1.0.0-alpha01" tabindex="-1">Version 1.0.0-alpha01</h3> <p>August 26, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:1.0.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/96eb302ee1740ba656c90c9fb27df3723a1a89c1..c93ac38a59f31e5db0eab67687532a4ba61913d5/compose">Version 1.0.0-alpha01 contains these commits.</a></p> <h2 id="version_010-dev_2" data-text="Version 0.1.0-dev" tabindex="-1">Version 0.1.0-dev</h2> <h3 id="0.1.0-dev17" data-text="Version 0.1.0-dev17" tabindex="-1">Version 0.1.0-dev17</h3> <p>August 19, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:0.1.0-dev17</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/316f882e649c600372170f013a18515f590f490d..96eb302ee1740ba656c90c9fb27df3723a1a89c1/compose">Version 0.1.0-dev17 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Custom emits can now declare that one or more of its setters can be skipped and recomposed independently of the emit. (<a href="https://android-review.googlesource.com/#/q/Ibbd13068440252724db405b26d1f6be179e80411">Ibbd13</a>)</li> <li><p>Removed deprecated FrameManager calls.</p> <p>Internal compose APIs have been changed to reduce the amount of overhead to track state objects such as <code translate="no" dir="ltr">mutableStateof()</code> (<a href="https://android-review.googlesource.com/#/q/I80ba67ebf59f9399e673b6218edfca4249158f82">I80ba6</a>)</p></li> <li><p>The <code translate="no" dir="ltr">state { ... }</code> composable is now deprecated in favor of explicit calls to <code translate="no" dir="ltr">remember { mutableStateOf(...) }</code> for clarity. This reduces the overall API surface and number of concepts for state management, and matches the <code translate="no" dir="ltr">by mutableStateOf()</code> pattern for class property delegation. (<a href="https://android-review.googlesource.com/#/q/Ia57278556d4f35ecf2cf5e6e30888b0d1f1f8012">Ia5727</a>)</p></li> <li><p>Flow.collectAsState now determines the default dispatcher from the composition itself rather than defaulting to Dispatchers.Main. (<a href="https://android-review.googlesource.com/#/q/I9c1d9ad9a881492cd74a89e896ddf5b3b8d12777">I9c1d9</a>)</p></li> <li><p>Crash when something which saves the state was used inside the for loop is fixed. Now having the same key in savedInstanceState() is allowed, api of UiSavedStateRegistry is now adjusted to this new requirement (<a href="https://android-review.googlesource.com/#/q/I4ab7630120ffce145d1bf09d52a475d197030150">I4ab76</a>, <a href="https://issuetracker.google.com/issues/160042650">b/160042650</a>, <a href="https://issuetracker.google.com/issues/156853976">b/156853976</a>, <a href="https://issuetracker.google.com/issues/159026663">b/159026663</a>, <a href="https://issuetracker.google.com/issues/154920561">b/154920561</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">emitView</code> was deprecated. Use <code translate="no" dir="ltr">AndroidView</code> instead if possible for emitting Views inside Compose. Note that composing Views and ViewGroups directly will not be supported in the future unless these are leaves in the composition tree, case when this can be achieved using AndroidView. (<a href="https://android-review.googlesource.com/#/q/I29b1e5405077f45e101eacfb26a1ebed85120444">I29b1e</a>, <a href="https://issuetracker.google.com/issues/163871221">b/163871221</a>)</li> </ul> <h3 id="0.1.0-dev16" data-text="Version 0.1.0-dev16" tabindex="-1">Version 0.1.0-dev16</h3> <p>August 5, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:0.1.0-dev16</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9c74ed7b07d1c18da576f179d55e568ca12973df..316f882e649c600372170f013a18515f590f490d/compose">Version 0.1.0-dev16 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><p>The default mutation policy of <code translate="no" dir="ltr">mutableStateOf()</code>, <code translate="no" dir="ltr">ambientOf()</code> and <code translate="no" dir="ltr">savedInstanceStateOf()</code> has changed to be <code translate="no" dir="ltr">structuralEqualityPolicy()</code> instead of <code translate="no" dir="ltr">referentialEqualityPolicy()</code>.</p> <p>The default for deciding if a new value assigned to a <code translate="no" dir="ltr">mutableStateOf()</code> instance is considered a change now defaults to using <code translate="no" dir="ltr">==</code> instead of using <code translate="no" dir="ltr">===</code>.</p> <p>See https://kotlinlang.org/docs/reference/equality.html</p> <p><code translate="no" dir="ltr">ambientOf()</code> and <code translate="no" dir="ltr">savedInstanceStateOf()</code> use <code translate="no" dir="ltr">mutableStateOf()</code> in their implementations so they were changed to be consistent with <code translate="no" dir="ltr">mutableStateOf()</code>.</p> <p>Using structural equality more closely matches developer expectations.</p> <p>For example,</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">state</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">mutableStateOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-m">1f</span><span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <p>followed by,</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-n">state</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">value</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">1f</span> </code></pre></devsite-code> <p>will no longer be consider a change to <code translate="no" dir="ltr">state</code> and uses of <code translate="no" dir="ltr">state</code> during composition will no longer need to be recomposed.</p> <p>This is a breaking change but, in most cases (such when using classes that do not override <code translate="no" dir="ltr">equals()</code>), this will not have a noticeable effect on an application.</p> <p>Classes that do override <code translate="no" dir="ltr">equals()</code>, such as <code translate="no" dir="ltr">data</code> classes, might see a performance degradation as their <code translate="no" dir="ltr">equals()</code> methods are now, by default, called when assigned to a <code translate="no" dir="ltr">mutableStateOf()</code>.</p> <p>The previous behavior can be restored by adding the policy parameter <code translate="no" dir="ltr">policy = referentialEqualityPolicy()</code> to calls to <code translate="no" dir="ltr">mutableStateOf()</code>, <code translate="no" dir="ltr">ambientOf()</code> and <code translate="no" dir="ltr">savedInstanceStateOf()</code>. (<a href="https://android-review.googlesource.com/#/q/Ic21a772051c4f891c655c9bd816ebb360ce19a81">Ic21a7</a>)</p></li> <li><p><code translate="no" dir="ltr">Row</code> and <code translate="no" dir="ltr">Column</code> are now inline function significantly reducing the overhead of using them. (<a href="https://android-review.googlesource.com/#/q/I75c10e663b74ffc250a3293df7583fcd86ea891a">I75c10</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>setViewContent was deprecated. setContent should be used instead. (<a href="https://android-review.googlesource.com/#/q/I7e49740d26f42e9326cb5582a4522d74957b90fe">I7e497</a>, <a href="https://issuetracker.google.com/issues/160335130">b/160335130</a>)</li> <li><p>Added MonotonicFrameAnimationClock that enables you to use a MonotonicFrameClock as an AnimationClockObservable to bridge the gap between the new coroutines based clocks and APIs that still use the old callback based clocks.</p> <p>The MonotonicFrameClock equivalent of ManualAnimationClock is now ManualFrameClock. (<a href="https://android-review.googlesource.com/#/q/I111c7b7182a1495f95eab1bb808d3acd6af82447">I111c7</a>, <a href="https://issuetracker.google.com/issues/161247083">b/161247083</a>)</p></li> <li><p>Modifier.stateDraggable was completely reworked and renamed to Modifier.swipeable. A new SwipeableState class was introduced, and DrawerState and BottomDrawerState were refactored to inherit from it. [Modal/Bottom]DrawerLayout no longer take an onStateChange parameter. (<a href="https://android-review.googlesource.com/#/q/I7233229dfc9c04a4615f4c1cc29e604b97edd1df">I72332</a>, <a href="https://issuetracker.google.com/issues/148023068">b/148023068</a>)</p></li> <li><p>Modifier.plus has been deprecated, use Modifier.then instead. 'Then' has a stronger signal of ordering, while also prohibits to type <code translate="no" dir="ltr">Modifier.padding().background() + anotherModifier</code>, which breaks the chain and harder to read (<a href="https://android-review.googlesource.com/#/q/Iedd587edbed0ba964ef203a66b98be7297147bd7">Iedd58</a>, <a href="https://issuetracker.google.com/issues/161529964">b/161529964</a>)</p></li> <li><p>SubcomposeLayout is added. It is a low level primitive which allows to compose the children during the measuring if we want to use some values available only later during the measure for the subtree composition. For example WithConstraints is not implemented using SubcomposeLayout. (<a href="https://android-review.googlesource.com/#/q/I25cc8cfe8382db1ef61e93866ba08f4668cbc734">I25cc8</a>)</p></li> <li><p>Material FilledTextField was renamed to TextField and foundational TextField was renamed to BaseTextField to make simplest desired API easy to discover and use (<a href="https://android-review.googlesource.com/#/q/Ia62420a7a2231c02b6874a9a2867bf786a397ed3">Ia6242</a>, <a href="https://issuetracker.google.com/issues/155482676">b/155482676</a>)</p></li> <li><p>Modifier.drawBackground has been renamed to Modifier.background (<a href="https://android-review.googlesource.com/#/q/I1367723fce0e07418ed4ab391fe20c69aa092f53">I13677</a>)</p></li> </ul> <h3 id="0.1.0-dev15" data-text="Version 0.1.0-dev15" tabindex="-1">Version 0.1.0-dev15</h3> <p>July 22, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.runtime:runtime-*:0.1.0-dev15</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9f60cc700129e30cee9df020005c317fb39d32ec/compose">Version 0.1.0-dev15 contains these commits.</a></p> <h4 id="dependencies_update_2" data-text="Dependencies Update" tabindex="-1">Dependencies Update</h4> <ul> <li>To use the <code translate="no" dir="ltr">0.1.0-dev15</code> version of Compose, you will need to update your dependencies according to the new code snippets shown above in <a href="#declaring_dependencies">Declaring dependencies</a>.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><p><code translate="no" dir="ltr">@Model</code> annotation is now deprecated. Use state and mutableStateOf as alternatives. This deprecation decision was reached after much careful discussion.</p> <h4 id="justification_2" data-text="Justification" tabindex="-1">Justification</h4> <p>Rationale includes but is not limited to:</p> <ul> <li>Reduces API surface area and concepts we need to teach</li> <li>More closely aligns with other comparable toolkits (Swift UI, React, Flutter)</li> <li>Reversible decision. We can always bring <code translate="no" dir="ltr">@Model</code> back later.</li> <li>Removes corner-case usage and difficult to answer questions about configuring <code translate="no" dir="ltr">@Model</code> as things we need to handle</li> <li><code translate="no" dir="ltr">@Model</code> data classes, equals, hashcode, etc.</li> <li>How do I have some properties “observed” and others not?</li> <li>How do I specify structural vs. referential equality to be used in observation?</li> <li>Reduces “magic” in the system. Would reduce the likelihood of someone assuming system was smarter than it is (ie, it knowing how to diff a list)</li> <li>Makes the granularity of observation more intuitive.</li> <li>Improves refactorability from variable -> property on class</li> <li>Potentially opens up possibilities to do hand-crafted State-specific optimizations</li> <li>More closely aligns with the rest of the ecosystem and reduces ambiguity towards immutable or us “embracing mutable state”</li> </ul> <h4 id="migration_notes_2" data-text="Migration Notes" tabindex="-1">Migration Notes</h4> <p>Almost all existing usages of <code translate="no" dir="ltr">@Model</code> are fairly trivially transformed in one of two ways. The example below has a <code translate="no" dir="ltr">@Model</code> class with two properties just for the sake of example, and has it being used in a composable.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-nd">@Model</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">class</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">Position</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">x</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Int</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">y</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Int</span> <span class="devsite-syntax-p">)</span> <span class="devsite-syntax-nd">@Composable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">Example</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">p</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">remember</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Position</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-m">0</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">0</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">PositionChanger</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">position</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">onXChange</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">x</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">it</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">onYChange</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">y</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">it</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <h4 id="alternative_1_use_stateoriginalclass_and_create_copies_2" data-text="Alternative 1: Use State<OriginalClass> and create copies." tabindex="-1">Alternative 1: Use <code translate="no" dir="ltr">State<OriginalClass></code> and create copies.</h4> <p>This approach is made easier with Kotlin’s data classes. Essentially, make all previously <code translate="no" dir="ltr">var</code> properties into <code translate="no" dir="ltr">val</code> properties of a data class, and then use <code translate="no" dir="ltr">state</code> instead of <code translate="no" dir="ltr">remember</code>, and assign the state value to cloned copies of the original using the data class <code translate="no" dir="ltr">copy(...)</code> convenience method.</p> <p>It’s important to note that this approach only works when the only mutations to that class were done in the same scope that the <code translate="no" dir="ltr">State</code> instance is created. If the class is internally mutating itself outside of the scope of usage, and you are relying on the observation of that, then the next approach is the one you will want to use.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">data</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">class</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">Position</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">x</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Int</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">y</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Int</span> <span class="devsite-syntax-p">)</span> <span class="devsite-syntax-nd">@Composable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">Example</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">p</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">by</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">state</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Position</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-m">0</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">0</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">PositionChanger</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">position</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">onXChange</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">copy</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">x</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-nb">it</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">onYChange</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">copy</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">y</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-nb">it</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <h4 id="alternative_2_use_mutablestateof_and_property_delegates_2" data-text="Alternative 2: Use mutableStateOf and property delegates" tabindex="-1">Alternative 2: Use mutableStateOf and property delegates</h4> <p>This approach is made easier with Kotlin’s property delegates and the <code translate="no" dir="ltr">mutableStateOf</code> API which allows you to create MutableState instances outside of composition. Essentially, replace all <code translate="no" dir="ltr">var</code> properties of the original class with <code translate="no" dir="ltr">var</code> properties with <code translate="no" dir="ltr">mutableStateOf</code> as their property delegate. This has the advantage that the usage of the class will not change at all, only the internal implementation of it. The behavior is not completely identical to the original example though, as each property is now observed/subscribed to individually, so the recompositions you see after this refactor could be more narrow (a good thing).</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-kd">class</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nc">Position</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">x</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Int</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">y</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Int</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">x</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">by</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">mutableStateOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">x</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">y</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">by</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">mutableStateOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">y</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-c1">// source of Example is identical to original</span> <span class="devsite-syntax-nd">@Composable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">Example</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">p</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">remember</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Position</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-m">0</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">0</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">PositionChanger</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">position</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">onXChange</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">x</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">it</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">onYChange</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">p</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">y</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">it</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <p>(<a href="https://android-review.googlesource.com/#/q/I409e8c158841eae1dd548b33f1ec80bb609cba31">I409e8</a>, <a href="https://issuetracker.google.com/issues/152050010">b/152050010</a>, <a href="https://issuetracker.google.com/issues/146362815">b/146362815</a>, <a href="https://issuetracker.google.com/issues/146342522">b/146342522</a>, <a href="https://issuetracker.google.com/issues/143413369">b/143413369</a>, <a href="https://issuetracker.google.com/issues/135715219">b/135715219</a>, <a href="https://issuetracker.google.com/issues/143263925">b/143263925</a>, <a href="https://issuetracker.google.com/issues/139653744">b/139653744</a>)</p></li> <li><p>Changes the code generation strategy of Compose’s compiler. Prior to the change, the compose compiler would transform calls to composable functions. With this change, we now transform the body of a composable function and leave the callsite unaltered (mostly).</p> <p>This means that most of the logic communicating with the compose runtime happens at the start of the function body, instead of at the callsite.</p> <p>This should be a source-compatible change for all usage of compose. Most users of compose should not have to update any code as a result of this change.</p> <p>In order to support this work, the JVM signature of all composable functions has changed. A Composable function accepting a single parameter is transformed into a function accepting 3 parameters, the additional parameters are the Composer, a ‘key’ integer. a bitmask integer used to propagate metadata through calls.</p> <p>Compose now also transforms default arguments to a composable function. It does this without introducing an additional synthetic default overload of the function itself, so this change will result in fewer functions being defined.</p> <p>Known intentional behavioral changes resulting from this:</p> <ol> <li>Some calls will skip where they wouldn’t have previously</li> <li>Composable expressions in default argument expressions are now correctly subscribed to and handled</li> </ol> <p>This work included some optimizations: 1. The result of comparisons of parameters are propagated through the call graph to other composable functions. This will result in fewer comparisons at runtime, reduces the slot table size, as well as more skipping of composable functions that were previously not skipped 2. Paremeters which are determined to be “static” at compile time are no longer compared or stored in the runtime. This reduces the number of comparisons and reduces slot table size. 3. Control flow structure of the body of functions is used to minimize the number of groups that are generated. This reduces slot table size and results in less work for the runtime 4. Unused dispatch and receiver parameters to functions are not included in determining skippability of the function if they are not used inside of the body of the function.</p> <p>Most breaking changes were for APIs that the compiler targets directly, and typical use of compose will not be affected: 1. Composer::startExpr was removed 2. Composer::endExpr was removed 3. Composer::call was deprecated 4. The non-varargs overloads of <code translate="no" dir="ltr">key</code> have been removed. Use the <code translate="no" dir="ltr">vararg</code> version going forward. 5. The Pivotal annotation was deprecated. Use <code translate="no" dir="ltr">key</code> as a replacement. 6. ScopeUpdateScope::updateScope was changed to expect a Function3 instead of Function1 7. restartableFunction and restartableFunctionN were updated to include additional compile time parameters (<a href="https://android-review.googlesource.com/#/q/I607560574d83b4b6c1e68ff72cc4124c5f8c2602">I60756</a>, <a href="https://issuetracker.google.com/issues/143464846">b/143464846</a>)</p></li> <li><p>Added sortWith and removeRange to MutableVector (<a href="https://android-review.googlesource.com/#/q/Icccf73d3dd073dab0c7e67edf06afe77ec19bc67">Icccf7</a>)</p></li> <li><p>Added default method implementations for CompositionLifecycleObserver (<a href="https://android-review.googlesource.com/#/q/I2428951907b8256d698fc11291dc7d8c3b756d4c">I24289</a>)</p></li> <li><p>Applier now requires a clear() method for disposing compositions (<a href="https://android-review.googlesource.com/#/q/Ibe697b06ea885852731d029ef56da657b5f290dc">Ibe697</a>)</p></li> <li><p>Added asMutableList() to MutableVector to allow it to be passed to public API without having to copy the entire list. (<a href="https://android-review.googlesource.com/#/q/I298df3722ef0fa4bcce7cc0398b931ee934bb233">I298df</a>)</p></li> <li><p>Added rememberCoroutineScope() to obtain a managed CoroutineScope in composition for launching jobs in response to events. (<a href="https://android-review.googlesource.com/#/q/I0e264f3f74fc520c6e57051000a513a52f2d07ce">I0e264</a>)</p></li> <li><p>MutableVector is a new collection that does not implement any of the standard Collection interface. This collection offers speed above other requirements and is intended to only be used in internal implementations. (<a href="https://android-review.googlesource.com/#/q/I8ebd6bf1407595d45eee2a22c1d1db3f38f4ab0b">I8ebd6</a>)</p></li> <li><p>Temporarily removed <code translate="no" dir="ltr">StableMutableList</code> and <code translate="no" dir="ltr">StableMutableMap</code> to avoid an issue in the version of Kotlin compose requires. These interfaces will be reintroduced once compose is updated to a version of Kotlin that doesn't have the issue.</p> <p><code translate="no" dir="ltr">SnapshotStateList</code> and <code translate="no" dir="ltr">SnapshotStateMap</code> are now public but they will be deprecated once <code translate="no" dir="ltr">StableMutableList</code> and <code translate="no" dir="ltr">StableMutableMap</code> are restored. (<a href="https://android-review.googlesource.com/#/q/Ia77691c6a5f523f63bd5d76cd6d7d7dc3f1afce1">Ia7769</a>)</p></li> <li><p>add top-level withFrameNanos function for animation timing (<a href="https://android-review.googlesource.com/#/q/Ie34c53e2e105353acc5ad56df0e15e1bc2a2da08">Ie34c5</a>)</p></li> <li><p>@Untracked annotation has been deprecated. Replace with @ComposableContract(tracked=false) (<a href="https://android-review.googlesource.com/#/q/Id211e1c7c168c5171bbf3c844792890ee87d4fc2">Id211e</a>)</p></li> <li><p>RestartableFunction and associated APIs have been renamed to ComposableLambda, etc. These APIs were targeted only by the compiler so this should not affect source level compatibility normally. The rename was done primarily to communicate what this class is better when it shows up in stack traces (<a href="https://android-review.googlesource.com/#/q/I7eb259b38d832c575810c6d61f2fd7d5fc035009">I7eb25</a>)</p></li> <li><p>@Composable annotation is no longer valid on classes (<a href="https://android-review.googlesource.com/#/q/Ia5f02c4e27d7f96ee52206dc29896751dbf98fb2">Ia5f02</a>)</p></li> <li><p><code translate="no" dir="ltr">Ambient<T></code> is now @Stable instead of @Immutable (<a href="https://android-review.googlesource.com/#/q/I0b4bbe1926fd68e04a7b7a66485c7a2e090f8c46">I0b4bb</a>)</p></li> <li><p>Prior to this change, the compose compiler plugin would non-trivially intercept calls to constructors inside of a @Composable function if there was an (<a href="https://android-review.googlesource.com/#/q/I5205af707238a70d600c105843cd99e88a5381e0">I5205a</a>, <a href="https://issuetracker.google.com/issues/158123804">b/158123804</a>)</p></li> <li><p>The Recompose composable is no longer a useful abstraction. Most recomposition should happen as a result of MutableState assignments. For anything beyond that, it is recommended that you use the <code translate="no" dir="ltr">invalidate</code> function to trigger a recomposition of the current scope. (<a href="https://android-review.googlesource.com/#/q/Ifc9926013c51c1db1e27e702a707bc1050f82fa6">Ifc992</a>)</p></li> <li><p>Observe is no longer a useful abstraction. If you need to replicate it, its implementation can be replicated by just creating a composable function which executes a composable lambda parameter. For example, <code translate="no" dir="ltr">@Composable fun Observe(body: @Composable () -> Unit) = body()</code> (<a href="https://android-review.googlesource.com/#/q/I40d37d6da7268c612231e0b91e1940c6c4fe2ac9">I40d37</a>)</p></li> <li><p>@Direct was deprecated in favor of @ComposableContract(restartable=false) (<a href="https://android-review.googlesource.com/#/q/If47080869682224dff147fd11505c0bc3949fb20">If4708</a>)</p></li> <li><p>Added an adapter for the recently introduced StateFlow which allows as to pre-populate the initial value so the returned State is non-nullable (<a href="https://android-review.googlesource.com/#/q/I61dd845b2329f0e209175ed500a7f27f1520f471">I61dd8</a>, <a href="https://issuetracker.google.com/issues/156233789">b/156233789</a>)</p></li> <li><p>Added an adapter for Flow. Example of the usage: val value by flow.collectAsState() (<a href="https://android-review.googlesource.com/#/q/If219801db734613cc4ea411756141d372f889490">If2198</a>, <a href="https://issuetracker.google.com/issues/153375923">b/153375923</a>)</p></li> <li><p>[Mutable]State property delegate operators moved to extensions to support Kotlin 1.4 property delegate optimizations. Callers must add imports to continue using <code translate="no" dir="ltr">by state { ... }</code> or <code translate="no" dir="ltr">by mutableStateOf(...)</code>. (<a href="https://android-review.googlesource.com/#/q/I5312cf7bdfa072cadc1be2de5d5f45ec53200f41">I5312c</a>)</p></li> <li><p>androidx.compose.ViewComposer has been moved to androidx.ui.node.UiComposer androidx.compose.Emittable has been removed. It was redundant with ComponentNode. androidx.compose.ViewAdapters has been removed. They are no longer a supported use case. Compose.composeInto has been deprecated. Use <code translate="no" dir="ltr">setContent</code> or <code translate="no" dir="ltr">setViewContent</code> instead. Compose.disposeComposition has been deprecated. Use the <code translate="no" dir="ltr">dispose</code> method on the <code translate="no" dir="ltr">Composition</code> returned by <code translate="no" dir="ltr">setContent</code> instead. androidx.compose.Compose.subcomposeInto has moved to androidx.ui.core.subcomposeInto ComponentNode#emitInsertAt has been renamed to ComponentNode#insertAt ComponentNode#emitRemoveAt has been renamed to ComponentNode#removeAt ComponentNode#emitMode has been renamed to ComponentNode#move (<a href="https://android-review.googlesource.com/#/q/Idef00fba3a2e67d7034e31d580d69192e9018b5f">Idef00</a>)</p></li> <li><p>Updated the <code translate="no" dir="ltr">ComposeFlags.COMPOSER_PARAM</code> flag to be <code translate="no" dir="ltr">true</code>, which will change the code generation strategy for the compose plugin. At a high level, this causes @Composable functions to be generated with an additional synthetic parameter, which is passed through to subsequent @Composable calls in order for the runtime to properly manage execution. This is a significant binary breaking change, however, should preserve source-level compatibility in all sanctioned usage of compose. (<a href="https://android-review.googlesource.com/#/q/I7971ca1b6525440c38643953645fa388131e31f0">I7971c</a>)</p></li> <li><p>Breaking changes to the ambients API. See log and <code translate="no" dir="ltr">Ambient<T></code> documentation for details (<a href="https://android-review.googlesource.com/#/q/I4c7eea45f2b7bf41f8a8ba75fd667c06010469a9">I4c7ee</a>, <a href="https://issuetracker.google.com/issues/143769776">b/143769776</a>)</p></li> <li><p>Added ui-livedata - new artifact with an adapter for LiveData. Example of the usage: val value by liveData.observeAsState() (<a href="https://android-review.googlesource.com/#/q/Ie9e8c37c952358186ab311d0d232c188003631f4">Ie9e8c</a>, <a href="https://issuetracker.google.com/issues/150465596">b/150465596</a>)</p></li> <li><p>Rx adapters without explicit initial value are deprecated. Using null is not always the best default, for example when you have a List it is better to start with emptyList() or any other reasonable default (<a href="https://android-review.googlesource.com/#/q/I00025b20be5441dc64edf3077c2e63800e1abf77">I00025</a>, <a href="https://issuetracker.google.com/issues/161348384">b/161348384</a>)</p></li> <li><p>Added ui-rxjava2 - new artifact with adapters for RxJava2. Example of the usage: val value by observable.subscribeAsState() (<a href="https://android-review.googlesource.com/#/q/Ifab4b1eebfa0649716ffd3d9fc980a71ef30eb61">Ifab4b</a>, <a href="https://issuetracker.google.com/issues/153369097">b/153369097</a>)</p></li> <li><p><code translate="no" dir="ltr">savedInstanceState()</code> can now be used with nullable types (<a href="https://android-review.googlesource.com/#/q/I6847f1a78afc14061082993583a6fcfc374e3277">I6847f</a>, <a href="https://issuetracker.google.com/issues/153532190">b/153532190</a>)</p></li> <li><p>New listSaver() and mapSaver() to make it easier to write custom Saver objects (<a href="https://android-review.googlesource.com/#/q/I8cf68efa3344c92d69a980efd4a737c5cac436fa">I8cf68</a>, <a href="https://issuetracker.google.com/issues/152331508">b/152331508</a>)</p></li> <li><p>New functions: savedInstanceState() and rememberSavedInstanceState(). They are similar to state() and remember() but have a saved instance state support build in (<a href="https://android-review.googlesource.com/#/q/If1987a758d18f9fa4ccfeb75011155304ee99cef">If1987</a>, <a href="https://issuetracker.google.com/issues/152025209">b/152025209</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">runOnIdleCompose</code> renamed to <code translate="no" dir="ltr">runOnIdle</code> (<a href="https://android-review.googlesource.com/#/q/I836071f1c3c63d21417a531f336f8a93ca13f9ed">I83607</a>)</li> <li>Made LayoutNode experimental API (<a href="https://android-review.googlesource.com/#/q/I4f2e93737020b0993f8ba5671e2a0a87f5de3ce2">I4f2e9</a>)</li> <li>androidx.ui.foundation.TextFieldValue and androidx.ui.input.EditorValue is deprecated. TextField, FilledTextField and CoreTextField composables that uses that type is also deprecated. Please use androidx.ui.input.TextFieldValue instead (<a href="https://android-review.googlesource.com/#/q/I4066d1f4d2e3e3514753aa3495680292dc55f89d">I4066d</a>, <a href="https://issuetracker.google.com/issues/155211005">b/155211005</a>)</li> <li>Removed deprecated DrawBackground API in favor of drawBackground extension APIs on Modifier. Refactored color, brush and paint drawBackground implementations to reduce code paths as well as remove requirement for Modifier to be created as part of composition. (<a href="https://android-review.googlesource.com/#/q/I0343a0d32684e77f9bc72c9cf68ce55d92ec575d">I0343a</a>)</li> <li>Updated higher level compose APIs that expose a Canvas to expose CanvasScope instead. This removes the need for consumers to maintain their own Paint objects. For consumers that still require access to a Canvas they can use the drawCanvas extension method which provides a callback to issue drawing commands with the underlying Canvas. (<a href="https://android-review.googlesource.com/#/q/I80afdf4c0a648962aa6ef1efc05b1d3b65757094">I80afd</a>)</li> <li>WithConstraints trailing lambda API has been changed. Now instead of two params it has a receiver scope which in addition to constraints and layoutDirection provides minWidth, maxWidth, minHeight and maxHeight properties in Dp (<a href="https://android-review.googlesource.com/#/q/I91b9af740cd2613ddd4fe6d63cd539a46b52fc52">I91b9a</a>, <a href="https://issuetracker.google.com/issues/149979702">b/149979702</a>)</li> <li>Added symmetric padding modifier. (<a href="https://android-review.googlesource.com/#/q/I39840a44ea3ff9cbf17dc1c073b1d142d59b02ec">I39840</a>)</li> <li>Updated wrapContentWidth and wrapContentHeight to expect vertical or horizontal Alignment rather than any Alignment. The gravity modifier was updated to accept vertical or horizontal Alignment. Row, Column and Stack were updated to support custom continuous Alignments. (<a href="https://android-review.googlesource.com/#/q/Ib07281752fa9806a13e61823e00accb26f99c1f6">Ib0728</a>)</li> <li>ui-text module is renamed as ui-text-core (<a href="https://android-review.googlesource.com/#/q/I57dec72ca50e7288e37c9272ef6ce8bcc485a83e">I57dec</a>)</li> <li>Improve DrawModifier API: <ul> <li>Made the receiver scope for draw() ContentDrawScope</li> <li>Removed all parameters on draw()</li> <li>DrawScope has same interface as former CanvasScope</li> <li>ContentDrawScope has drawContent() method (<a href="https://android-review.googlesource.com/#/q/Ibaced5feb8778510b8fe78e96f4fd3da1a6fda50">Ibaced</a>, <a href="https://issuetracker.google.com/issues/152919067">b/152919067</a>)</li> </ul></li> <li>ColoredRect has been deprecated. Use <code translate="no" dir="ltr">Box(Modifier.preferredSize(width, height).drawBackground(color))</code> instead. (<a href="https://android-review.googlesource.com/#/q/I499fa26b66b128943500fbdf9ba490d754adf561">I499fa</a>, <a href="https://issuetracker.google.com/issues/152753731">b/152753731</a>)</li> <li>Replaced Modifier plus operator with factory extension functions (<a href="https://android-review.googlesource.com/#/q/I225e444f50956d84e15ca4f1378b7f805d54e0ca">I225e4</a>)</li> <li>RowScope and ColumnScope members are now accessible outside Row and Column. (<a href="https://android-review.googlesource.com/#/q/I3a6415334c145f6a3f610d7852c4d2478371e6e6">I3a641</a>)</li> <li>Renamed LayoutFlexible to LayoutWeight. Renamed tight parameter to fill. (<a href="https://android-review.googlesource.com/#/q/If4738c70c381e149ded400d657b5efd888ae5891">If4738</a>)</li> <li>WithConstraints got LayoutDirection parameter (<a href="https://android-review.googlesource.com/#/q/I6d6f7d5fd9a4a0428e3ee188a9a3790e1cdaf083">I6d6f7</a>)</li> <li>Renamed background to DrawBackground and make it to be memorized by default (<a href="https://android-review.googlesource.com/#/q/Ia0bd3f7657dc66ae6f492ccfcf88c44ba92bb7e0">Ia0bd3</a>)</li> <li>Replaced ButtonStyle with distinct functions and removed text (string) overload. See updated samples for usage information. (<a href="https://android-review.googlesource.com/#/q/If63ab32bd3f12050a2d2f4b8c0cb044bc7144a6b">If63ab</a>, <a href="https://issuetracker.google.com/issues/146478620">b/146478620</a>, <a href="https://issuetracker.google.com/issues/146482131">b/146482131</a>)</li> <li><code translate="no" dir="ltr">runOnIdleCompose</code> and <code translate="no" dir="ltr">runOnUiThread</code> are now global functions instead of methods on ComposeTestRule. (<a href="https://android-review.googlesource.com/#/q/Icbe8fd71d52144e855ccb4ce06a4677337be731a">Icbe8f</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Remove unneeded API such as Looper and Handler from Compose Runtime porting layer (<a href="https://android-review.googlesource.com/#/q/I6847daf0d70608673a8fe8b2bbf7f3b94fb762f1">I6847d</a>)</li> <li>Deprecate <code translate="no" dir="ltr">Flow<T>.collectAsState()</code> with no initial value. Use <code translate="no" dir="ltr">StateFlow<T></code> or pass an explicit initial value instead. (<a href="https://android-review.googlesource.com/#/q/I63f98eabd19d74c87bc951677cef15c678aeae2f">I63f98</a>, <a href="https://issuetracker.google.com/issues/157674865">b/157674865</a>)</li> </ul> <devsite-hats-survey class="nocontent" hats-id="VxqvKSur40kxBYCLVTd0SSGykbno" listnr-id="5207477"></devsite-hats-survey> </div> <devsite-recommendations display="in-page" hidden yield> </devsite-recommendations> <devsite-thumb-rating position="footer"> </devsite-thumb-rating> <devsite-recommendations id="recommendations-link" yield></devsite-recommendations> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-content-footer class="nocontent"> <p>Content and code samples on this page are subject to the licenses described in the <a href="/license">Content License</a>. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.</p> <p>Last updated 2024-11-13 UTC.</p> </devsite-content-footer> <devsite-notification > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-11-13 UTC."],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> <nav class="devsite-footer-promos nocontent" aria-label="Promotions"> <ul class="devsite-footer-promos-list"> <li class="devsite-footer-promo"> <a href="//x.com/AndroidDev" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer X Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-x_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="X"> <img class="devsite-footer-promo-icon" src="/_static/android/images/logo-x.svg" loading="lazy" alt="X"> </picture> <span class="devsite-footer-promo-label"> X </span> </a> <div class="devsite-footer-promo-description">Follow @AndroidDev on X</div> </li> <li class="devsite-footer-promo"> <a href="//www.youtube.com/user/androiddevelopers" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer YouTube Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-youtube_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="YouTube"> <img class="devsite-footer-promo-icon" src="//www.gstatic.com/images/icons/material/product/2x/youtube_48dp.png" loading="lazy" alt="YouTube"> </picture> <span class="devsite-footer-promo-label"> YouTube </span> </a> <div class="devsite-footer-promo-description">Check out Android Developers on YouTube</div> </li> <li class="devsite-footer-promo"> <a href="//www.linkedin.com/showcase/androiddev" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer LinkedIn Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-linkedin_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="LinkedIn"> <img class="devsite-footer-promo-icon" src="/_static/android/images/logo-linkedin.svg" loading="lazy" alt="LinkedIn"> </picture> <span class="devsite-footer-promo-label"> LinkedIn </span> </a> <div class="devsite-footer-promo-description">Connect with the Android Developers community on LinkedIn</div> </li> </ul> </nav> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">More Android</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com/enterprise/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Android for Enterprise </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com/security-center/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Security </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//source.android.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Source </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/news" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > News </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//android-developers.googleblog.com/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > Blog </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/podcasts" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" > Podcasts </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Discover</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/games" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Gaming </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/ml" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Machine Learning </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/health-and-fitness" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Health & Fitness </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/media" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Camera & Media </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/privacy" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Privacy </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/training/connectivity/5g" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > 5G </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Android Devices</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/large-screens" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Large screens </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/wear" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Wear OS </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/chrome-os" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > ChromeOS devices </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/cars" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Android for cars </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/tv" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android TV </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Releases</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/15" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android 15 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/14" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Android 14 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/13" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Android 13 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/12" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Android 12 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/11" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android 11 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/10" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > Android 10 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/pie" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" > Pie </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Documentation and Downloads</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/studio/intro" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android Studio guide </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/guide" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Developers guides </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/reference" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > API reference </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/studio" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Download Studio </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/ndk" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android NDK </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Support</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="//issuetracker.google.com/issues/new?component=190923&template=841312" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Report platform bug </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//issuetracker.google.com/issues/new?component=192697" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Report documentation bug </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//support.google.com/googleplay/android-developer" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Google Play support </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://g.co/userresearch/androiddeveloperfooter" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Join research studies </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-sites" aria-label="Other Google Developers websites"> <a href="https://developers.google.com/" class="devsite-footer-sites-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Developers Link"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-google-for-developers-dark-theme.svg" media="(prefers-color-scheme: none)" class="devsite-dark-theme" loading="lazy" alt="Google Developers"> <img class="devsite-footer-sites-logo" src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-google-for-developers.svg" loading="lazy" alt="Google Developers"> </picture> </a> <ul class="devsite-footer-sites-list"> <li class="devsite-footer-sites-item"> <a href="//developer.android.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Android Link" > Android </a> </li> <li class="devsite-footer-sites-item"> <a href="//developer.chrome.com/home" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Chrome Link" > Chrome </a> </li> <li class="devsite-footer-sites-item"> <a href="//firebase.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Firebase Link" > Firebase </a> </li> <li class="devsite-footer-sites-item"> <a href="//cloud.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Cloud Platform Link" > Google Cloud Platform </a> </li> <li class="devsite-footer-sites-item"> <a href="//developers.google.com/products/" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer All products Link" > All products </a> </li> </ul> </nav> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" > Privacy </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/license" data-category="Site-Wide Custom Events" data-label="Footer License link" > License </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/distribute/marketing-tools/brand-guidelines" data-category="Site-Wide Custom Events" data-label="Footer Brand guidelines link" > Brand guidelines </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" aria-hidden="true" > Manage cookies </a> </li> <li class="devsite-footer-utility-item devsite-footer-utility-button"> <span class="devsite-footer-utility-description">Get news and tips by email</span> <a class="devsite-footer-utility-link gc-analytics-event" href="/updates" data-category="Site-Wide Custom Events" data-label="Footer Subscribe link" > Subscribe </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[]</script> <script type="application/json" tag-management>{"at": "True", "ga4": [{"id": "G-QFRN08RN6E", "purpose": 0}], "ga4p": [{"id": "G-QFRN08RN6E", "purpose": 0}], "gtm": [{"id": "GTM-KMSWPCJ", "purpose": 0}], "parameters": {"internalUser": "False", "language": {"machineTranslated": "False", "requested": "en", "served": "en"}, "pageType": "article", "projectName": "Jetpack", "signedIn": "False", "tenant": "android", "recommendations": {"sourcePage": "", "sourceType": 0, "sourceRank": 0, "sourceIdenticalDescriptions": 0, "sourceTitleWords": 0, "sourceDescriptionWords": 0, "experiment": ""}, "experiment": {"ids": ""}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <android-fully-clickable target=" .android-case-study .devsite-landing-row-item, .android-grouped-resources .devsite-landing-row-item, .android-grouped-resources-primary .devsite-landing-row-item, .android-grouped-resources-secondary .devsite-landing-row-item, .android-guide-cards .devsite-landing-row-item, .android-illustrated-resources-index .devsite-landing-row-item, .android-illustrated-resources-primary .devsite-landing-row-item, .android-illustrated-resources-secondary .devsite-landing-row-item, .android-illustrated-resources-secondary-small .devsite-landing-row-item, .android-illustrated-resources-tertiary .devsite-landing-row-item, .android-illustrated-resources-tertiary-small .devsite-landing-row-item, .android-promo .devsite-landing-row-item, .android-quick-link, .android-samples .devsite-card-wrapper, .fully-clickable" watch=".android-samples, devsite-content"></android-fully-clickable> <script nonce="8BDYk2e/lSqbVb1hmklr6EjeN0b+YO"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/js/app_loader.js', '[3,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android","https://android-dot-devsite-v2-prod.appspot.com",null,null,["/_pwa/android/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/favicon.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup.svg","https://fonts.googleapis.com/css?family=Google+Sans:400,500,600,700|Google+Sans+Text:400,400italic,500,500italic,600,600italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,116,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyAP-jjEJBzmIyKR4F-3XITp8yM9T1gEEI8","AIzaSyB6xiKGDR5O3Ak2okS4rLkauxGUG7XP0hg","developer.android.com","AIzaSyAQk0fBONSGUqCNznf6Krs82Ap1-NV6J4o","AIzaSyCCxcqdrZ_7QMeLCRY20bh_SXdAYqy70KY",null,null,null,["MiscFeatureFlags__developers_footer_image","Cloud__enable_cloud_shell_fte_user_flow","Search__enable_ai_search_summaries","Profiles__enable_developer_profiles_callout","Concierge__enable_pushui","CloudShell__cloud_code_overflow_menu","MiscFeatureFlags__enable_view_transitions","TpcFeatures__enable_mirror_tenant_redirects","MiscFeatureFlags__developers_footer_dark_image","Search__enable_page_map","Cloud__enable_cloud_shell","Cloud__enable_free_trial_server_call","DevPro__enable_developer_subscriptions","Profiles__enable_page_saving","MiscFeatureFlags__emergency_css","Profiles__enable_release_notes_notifications","Search__enable_ai_eligibility_checks","MiscFeatureFlags__enable_dark_theme","Analytics__enable_clearcut_logging","EngEduTelemetry__enable_engedu_telemetry","Cloud__enable_cloudx_experiment_ids","Profiles__enable_complete_playlist_endpoint","BookNav__enable_tenant_cache_key","Experiments__reqs_query_experiments","Search__enable_dynamic_content_confidential_banner","TpcFeatures__enable_required_headers","Profiles__enable_profile_collections","MiscFeatureFlags__enable_explain_this_code","Profiles__enable_dashboard_curated_recommendations","Search__enable_suggestions_from_borg","Cloud__enable_cloud_facet_chat","Cloud__enable_legacy_calculator_redirect","Profiles__enable_recognition_badges","Cloud__enable_cloud_dlp_service","Profiles__enable_public_developer_profiles","Cloud__enable_llm_concierge_chat","Profiles__require_profile_eligibility_for_signin","Cloud__enable_cloudx_ping","MiscFeatureFlags__enable_variable_operator","Profiles__enable_awarding_url","MiscFeatureFlags__enable_firebase_utm","MiscFeatureFlags__enable_project_variables","DevPro__enable_cloud_innovators_plus","Profiles__enable_completecodelab_endpoint","Significatio__enable_by_tenant","CloudShell__cloud_shell_button"],null,null,"AIzaSyBLEMok-5suZ67qRPzx0qUtbnLmyT_kCVE","https://developerscontentserving-pa.googleapis.com","AIzaSyCM4QpTRSqP5qI4Dvjt4OAScIN8sOUlO-k","https://developerscontentsearch-pa.googleapis.com",2,4,null,"https://developerprofiles-pa.googleapis.com",[3,"android","Android Developers","developer.android.com",null,"android-dot-devsite-v2-prod.appspot.com",null,null,[null,1,null,null,null,null,null,null,null,null,null,[1],null,null,null,null,null,null,[1],[1,null,null,[1,20],"/recommendations"],null,null,null,[1,null,1],[1,1,null,1,1]],null,[18,null,null,null,null,null,"/images/lockup.svg","/images/touchicon-180.png",null,null,null,null,null,null,null,null,null,null,null,null,null,1,null,null,null,"/images/lockup-dark-theme.svg",[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[6,1,14,15,20,22,23,28,29,37,43],null,[[null,null,1],[1,1]],[[null,null,null,null,null,null,null,[["G-QFRN08RN6E"],null,null,[["G-QFRN08RN6E",1]]],null,null,null,null,1],null,[[1,1],[2,2]]],null,4,null,null,null,null,null,null,null,null,null,null,null,null,null,"android.devsite.google"],null,"pk_live_5170syrHvgGVmSx9sBrnWtA5luvk9BwnVcvIi7HizpwauFG96WedXsuXh790rtij9AmGllqPtMLfhe2RSwD6Pn38V00uBCydV4m"]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>