<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-6755709643044947179</id><updated>2026-08-04T12:48:29.572-07:00</updated><category term="Featured"/><category term="Google Play"/><category term="Android"/><category term="latest"/><category term="android developers"/><category term="Develop"/><category term="Android Developer"/><category term="Android Studio"/><category term="Games"/><category term="Announcements"/><category term="Security"/><category term="Wear OS"/><category term="Jetpack"/><category term="Play Console"/><category term="Jetpack Compose"/><category term="Privacy"/><category term="Apps"/><category term="Developer Preview"/><category term="archive"/><category term="app development"/><category term="Compose"/><category term="Game Development"/><category term="developer stories"/><category term="Google Play services"/><category term="Kotlin"/><category term="Android Wear"/><category term="google play developers"/><category term="success stories"/><category term="#WeArePlay"/><category term="Performance"/><category term="Platform_Update"/><category term="case study"/><category term="Gemini"/><category term="mobile"/><category term="Distribute"/><category term="android security"/><category term="#11WeeksOfAndroid"/><category term="GooglePlay"/><category term="NDK"/><category term="#GoogleIO"/><category term="App"/><category term="Google Services"/><category term="User Interface"/><category term="Design"/><category term="Developer Tools"/><category term="Android TV"/><category term="Game"/><category term="Google Play Console"/><category term="Android Auto"/><category term="Material Design"/><category term="Media"/><category term="androidstudio"/><category term="Android N"/><category term="Developer Console"/><category term="Google Play Games"/><category term="Large Screens"/><category term="SDK updates"/><category term="Android Developer Challenge"/><category term="Explore"/><category term="Google Play game services"/><category term="Best Practices"/><category term="Google I/O"/><category term="Google I/O 2025"/><category term="How-to"/><category term="foldables"/><category term="#GenerativeAI"/><category term="#TheAndroidShow"/><category term="AI"/><category term="Android app development"/><category term="Google I/O 2023"/><category term="Story"/><category term="Tablets"/><category term="UI"/><category term="Android Jetpack"/><category term="Web"/><category term="developers"/><category term="Tools"/><category term="form factors"/><category term="wear"/><category term="Android Development"/><category term="Android Market"/><category term="Beta"/><category term="Google I/O 2024"/><category term="AndroidDevStory"/><category term="android11"/><category term="developer"/><category term="#androiddevsummit"/><category term="Android Things"/><category term="Indie Games"/><category term="Location"/><category term="machine learning"/><category term="Android 1.5"/><category term="Android for cars"/><category term="App quality"/><category term="compatibility"/><category term="Android Dev Summit"/><category term="Camera"/><category term="Firebase"/><category term="Android Design"/><category term="Android12"/><category term="Authentication"/><category term="CameraX"/><category term="Optimization"/><category term="Solve"/><category term="Widgets"/><category term="android p"/><category term="permissions"/><category term="#Android"/><category term="Android 11"/><category term="Android O"/><category term="Indie Games Accelerator"/><category term="R8"/><category term="Udacity"/><category term="Wear OS 6"/><category term="announcement"/><category term="media3"/><category term="monetization"/><category term="#JetpackCompose"/><category term="Android Automotive OS"/><category term="Android Emulator"/><category term="Android XR"/><category term="Google Play Store"/><category term="Identity"/><category term="Marshmallow"/><category term="Support Library"/><category term="UX"/><category term="androidq"/><category term="indie developers"/><category term="safety"/><category term="#Media"/><category term="API"/><category term="Android 1.6"/><category term="Audio"/><category term="Gemini Nano"/><category term="Google"/><category term="Google Analytics"/><category term="Open source"/><category term="Pixel"/><category term="notifications"/><category term="subscriptions"/><category term="Europe"/><category term="Health Connect"/><category term="Kotlin Multiplatform"/><category term="Learn"/><category term="Localization"/><category term="London"/><category term="ML Kit"/><category term="Modern Android Development"/><category term="Navigation"/><category term="Performance Optimization"/><category term="Testing"/><category term="adaptive"/><category term="beginner"/><category term="business"/><category term="events"/><category term="passkeys"/><category term="Android 5.0"/><category term="Android UI"/><category term="AndroidO"/><category term="C++"/><category term="ExoPlayer"/><category term="Gemini in Android Studio"/><category term="Google Cloud Platform"/><category term="Graphics"/><category term="Health Connect API"/><category term="How-To Guide"/><category term="IoT"/><category term="Layout"/><category term="Play Store"/><category term="Project Treble"/><category term="WebView"/><category term="analytics"/><category term="aosp"/><category term="appstory"/><category term="competition"/><category term="engagement"/><category term="grow"/><category term="prizes"/><category term="release"/><category term="win"/><category term="#MADSkills"/><category term="ADS 22"/><category term="Ads"/><category term="Android Developer Story"/><category term="Android Instant Apps"/><category term="Android Pie"/><category term="Android SDK"/><category term="Android Vitals"/><category term="AndroidX"/><category term="GDC"/><category term="Game Developers Conference"/><category term="Google Cast"/><category term="Google Cloud Messaging"/><category term="Google Fit"/><category term="Google Play Indie Games Festival"/><category term="Google Play Indie games accelerator"/><category term="Google Play policy"/><category term="Indie Games Festival"/><category term="Mobile Games"/><category term="News"/><category term="Policy"/><category term="Product News"/><category term="Quality"/><category term="Release Notes"/><category term="Renderscript"/><category term="UI toolkit"/><category term="adaptive layouts"/><category term="admob"/><category term="android13"/><category term="android14"/><category term="android16"/><category term="battery"/><category term="credential manager"/><category term="developerstory"/><category term="indie"/><category term="indies"/><category term="showcase"/><category term="user experience"/><category term="wearos"/><category term="‘Google Play"/><category term="#AndroidDevJourney"/><category term="#camera"/><category term="APIs"/><category term="Android 15"/><category term="Android Gradle Plugin"/><category term="Android M"/><category term="Android Q"/><category term="Android fitness"/><category term="Android health"/><category term="Androidify"/><category term="Background work"/><category term="Dev Story"/><category term="Developer Inspiration"/><category term="Google Assistant"/><category term="IO2013"/><category term="Policies"/><category term="Saatchi"/><category term="TensorFlow"/><category term="app optimizations"/><category term="career inspiration"/><category term="careers in tech"/><category term="google play protect"/><category term="google tv"/><category term="health data"/><category term="spotlight week"/><category term="users"/><category term="watch faces"/><category term="#io19"/><category term="Android 10"/><category term="Android 13"/><category term="Android 14"/><category term="Android 2.0"/><category term="Android 9"/><category term="Android Dev Journey"/><category term="Android Go"/><category term="Android Open Source Project"/><category term="Android app developers"/><category term="AndroidAI"/><category term="AndroidDev"/><category term="App Resources"/><category term="Bluetooth"/><category term="Developer Journey"/><category term="Education"/><category term="GenAI"/><category term="GenerativeAI"/><category term="Get Inspired"/><category term="Google Drive"/><category term="Google Play Devs"/><category term="Google Play games services"/><category term="HDR"/><category term="HTTPS"/><category term="In-app Billing"/><category term="KMP"/><category term="Latest news"/><category term="Material 3 Expressive Design"/><category term="Media and Camera"/><category term="OpenGL ES"/><category term="Power series"/><category term="Requirements"/><category term="Samples"/><category term="TV"/><category term="TensorFlow Lite"/><category term="Tiles"/><category term="Treble"/><category term="VR"/><category term="Watch Face Format"/><category term="adaptive UI"/><category term="android15"/><category term="androidn"/><category term="app performance"/><category term="appexcellence"/><category term="chrome"/><category term="community"/><category term="contest"/><category term="desktop"/><category term="developer story"/><category term="gamestory"/><category term="growth"/><category term="io15"/><category term="library"/><category term="material you"/><category term="nearby"/><category term="rendering"/><category term="startup"/><category term="update"/><category term="watchface"/><category term="workmanager"/><category term="#AdaptiveApps"/><category term="#Android11"/><category term="#AndroidDevChallenge"/><category term="#Wear"/><category term="#passkeys"/><category term="ART"/><category term="Actions on Google"/><category term="Android 4.2"/><category term="Android 6.0"/><category term="Android Camera"/><category term="Android Studio Emulator"/><category term="Android Study Jams"/><category term="Android for Work"/><category term="AndroidWear"/><category term="Animation"/><category term="App Components"/><category term="App Security"/><category term="Architecture"/><category term="Baseline Profiles"/><category term="Canary"/><category term="Code Day"/><category term="Connectivity"/><category term="Coroutines"/><category term="Courses"/><category term="DAC/Develop"/><category term="Developer profiles"/><category term="Developing Media Apps"/><category term="Development Tools"/><category term="FIDO2"/><category term="GCM"/><category term="Google Developers"/><category term="Google Mobile Ads"/><category term="IO2014"/><category term="Intents"/><category term="Jetpack Navigation"/><category term="KotlinConf"/><category term="Launch"/><category term="Launchpad Accelerator"/><category term="Licensing"/><category term="ML"/><category term="Platform"/><category term="Platform_Updates"/><category term="Resources"/><category term="Sample code"/><category term="Text-to-Speech"/><category term="Unity"/><category term="Video"/><category term="Virtual Reality"/><category term="accessibility"/><category term="advertising"/><category term="androidp"/><category term="d8"/><category term="event"/><category term="features"/><category term="iOS"/><category term="large_screens"/><category term="layouts"/><category term="multiplatform apps"/><category term="play"/><category term="playback"/><category term="resizing"/><category term="sandbox"/><category term="signing"/><category term="tutorial"/><category term="vulkan"/><category term="wifi"/><category term="windowing"/><category term="#AndroidAI"/><category term="#Gemini"/><category term="#GoogleforGames"/><category term="#Productive"/><category term="#featured"/><category term="#io17"/><category term="#io18"/><category term="#transformer"/><category term="#watch-face"/><category term="#wff"/><category term="#widgets"/><category term="AGDK"/><category term="Activity Recognition"/><category term="Agentic"/><category term="Android 3.0"/><category term="Android 3.2"/><category term="Android 4.4"/><category term="Android App"/><category term="Android Architecture"/><category term="Android Basics"/><category term="Android Dev"/><category term="Android Development Tools"/><category term="Android Studio Narwhal"/><category term="Android ecosystem"/><category term="Android16QPR2"/><category term="AndroidGameDev"/><category term="AndroidPerformance"/><category term="App Bundle"/><category term="App Indexing"/><category term="Architecture Components"/><category term="Auto"/><category term="Biometrics"/><category term="Business &amp; Leadership"/><category term="Camera X"/><category term="Camera2"/><category term="ChromeOS"/><category term="Chromebooks"/><category term="Cloud"/><category term="Commerce"/><category term="Compose Material 3"/><category term="Compose UI"/><category term="Crashlytics"/><category term="Custom Model"/><category term="DAC/google"/><category term="DataStore"/><category term="Developer Labs"/><category term="Developer Productivity"/><category term="Early Access"/><category term="Firebase Cloud Messaging"/><category term="Fragments"/><category term="GameDev"/><category term="Gemma"/><category term="Global"/><category term="Google For Games"/><category term="Google Maps"/><category term="Google Play for Work"/><category term="Google client API"/><category term="Google+"/><category term="Gradle"/><category term="Indie Contest"/><category term="Indie games contest"/><category term="Indie games showcase"/><category term="Indie showcase"/><category term="Input methods"/><category term="Instant Apps"/><category term="LiquidFun"/><category term="MADSkills"/><category term="Maps"/><category term="Maps API"/><category term="MaterialDesign"/><category term="MediaSession"/><category term="Mobile App Development"/><category term="Mobile Development"/><category term="Notification"/><category term="Onboarding"/><category term="Pixel Fold"/><category term="Pixel Watch"/><category term="Preview"/><category term="Privacy Sandbox"/><category term="Productivity"/><category term="Profiling"/><category term="SDK Tools"/><category term="Samsung"/><category term="Screens"/><category term="Studio Bot"/><category term="Subscription"/><category term="TLS"/><category term="Text and Input"/><category term="UI Development"/><category term="Ultra HDR"/><category term="Watch Face"/><category term="Wearables"/><category term="Window Size Classes"/><category term="android oreo"/><category term="android privacy"/><category term="android-tv"/><category term="android17"/><category term="apk"/><category term="appexcellencecasestudy"/><category term="appquality"/><category term="ar"/><category term="bestpractices"/><category term="chrome os"/><category term="codelab"/><category term="compiler"/><category term="connection encryption"/><category term="cross-device"/><category term="developergamestory"/><category term="documentation"/><category term="dynamic delivery"/><category term="emulator"/><category term="encryption"/><category term="fcm"/><category term="foldable"/><category term="free-form"/><category term="glance"/><category term="google play for families"/><category term="google-tv"/><category term="insets"/><category term="kernel"/><category term="language"/><category term="largescreens"/><category term="live edit"/><category term="memory"/><category term="mobile vision APIs"/><category term="multi-device development"/><category term="multitasking"/><category term="network security"/><category term="oreo"/><category term="people"/><category term="privacy sandbox on android"/><category term="profile guided optimization"/><category term="stable release"/><category term="store listing experiments"/><category term="training"/><category term="transformer"/><category term="transparency"/><category term="ubicomp"/><category term="updates"/><category term="wear-tiles"/><category term="windowmanager"/><category term="#APK"/><category term="#Android12"/><category term="#AndroidDev"/><category term="#AndroidJetpack"/><category term="#Androiddevelopment"/><category term="#CredentialManager"/><category term="#GDC20"/><category term="#Media3"/><category term="#Studio"/><category term="#TV"/><category term="#complications"/><category term="#credential-manager"/><category term="#exoplayer"/><category term="#googleplay"/><category term="#identity"/><category term="#nav3"/><category term="#releases"/><category term="#tiles"/><category term="'Google Play"/><category term="5G"/><category term="64bit"/><category term="A/B testing"/><category term="AGDE"/><category term="AI assisted coding"/><category term="AI code completion"/><category term="Action Bar"/><category term="Actions"/><category term="Adaptive apps"/><category term="Adaptive development"/><category term="Agent Mode"/><category term="Android 12L"/><category term="Android 16"/><category term="Android 2.1"/><category term="Android 2.2"/><category term="Android 2.3"/><category term="Android 7.0"/><category term="Android 71"/><category term="Android App Bundles"/><category term="Android Architecture Components"/><category term="Android Bench"/><category term="Android CLI"/><category term="Android Developer Community"/><category term="Android Developer Phone"/><category term="Android Device Streaming"/><category term="Android Devs"/><category term="Android Game SDK"/><category term="Android Media"/><category term="Android Pay API"/><category term="Android Photo Picker"/><category term="Android SDK Upgrade Assistant"/><category term="Android Storage"/><category term="Android Studio 3.0"/><category term="Android Studio Arctic Fox"/><category term="Android Studio Dolphin"/><category term="Android Studio Flamingo"/><category term="Android Studio Giraffe"/><category term="Android Studio Hedgehog"/><category term="Android Studio Jellyfish"/><category term="Android Studio Koala"/><category term="Android Studio Koala Feature Drop"/><category term="Android TV OS"/><category term="Android Wear 2.0"/><category term="Android XR SDK"/><category term="Android app excellence"/><category term="Android betas"/><category term="Android codelabs"/><category term="Android courses"/><category term="Android training"/><category term="Androidtv"/><category term="Animation and Graphics"/><category term="App Bundles"/><category term="App Excellence"/><category term="App Quality Insights"/><category term="AppCompat"/><category term="AppFunctions"/><category term="Assistant"/><category term="Audio for Android"/><category term="BLE"/><category term="Back Stack"/><category term="Better together"/><category term="Boston"/><category term="C"/><category term="Compose Animation Previews"/><category term="Conversation API"/><category term="Dashboard"/><category term="Daydream"/><category term="Debugging"/><category term="Declarative Programming"/><category term="Dev Tools"/><category term="Developer Console Store Listing Experiments"/><category term="Developer Preview 4"/><category term="Efficient Apps"/><category term="Feature Group"/><category term="Fundamentals"/><category term="GDC 2020"/><category term="GLSL"/><category term="GPS"/><category term="Gesture Navigation"/><category term="Gestures"/><category term="Google AI Studio"/><category term="Google Developer"/><category term="Google Play App Safety"/><category term="Google Play Billing"/><category term="Google Play Instant"/><category term="Google Play Integrity API"/><category term="Google Play SDK Console"/><category term="Google Play SDK Index"/><category term="Google Sign-In"/><category term="Google Wallet"/><category term="Google codelabs"/><category term="Google for Games Developer Summit"/><category term="GoogleAPIClient"/><category term="GoogleIO"/><category term="Gradle sync"/><category term="Guidelines"/><category term="Health Services"/><category term="Horologist"/><category term="I/O"/><category term="I/O2014"/><category term="IME"/><category term="Influence"/><category term="Internet of Things"/><category term="JNI"/><category term="Japan"/><category term="Java"/><category term="Java 8"/><category term="JetBrains"/><category term="Jetpack Compose 1.2"/><category term="Jetpack Glance"/><category term="Jetpack Libraries"/><category term="Kotlin Everywhere"/><category term="KotlinConf 2023"/><category term="LVL"/><category term="LaunchShow"/><category term="Linux"/><category term="LondonEng"/><category term="MAD Skills"/><category term="Made by Google"/><category term="Memory Management"/><category term="Mobile World Congress"/><category term="Model Maker"/><category term="MotionLayout"/><category term="Multi-form factor designs"/><category term="Navigation Library"/><category term="Navigation Q&amp;A"/><category term="Navigation component"/><category term="Navigation3"/><category term="Nougat"/><category term="On-Device Machine Learning"/><category term="OnePlus"/><category term="OpenGL"/><category term="OpenXR"/><category term="PC games"/><category term="PickVisualMedia"/><category term="Pixel Tablet"/><category term="Places"/><category term="Play Academy"/><category term="Play Commerce"/><category term="Play Privacy"/><category term="Play Security"/><category term="Play Vitals"/><category term="PlayStore"/><category term="Preview Stabilization"/><category term="Problem-Solving"/><category term="Profilers"/><category term="Pure"/><category term="SDR"/><category term="SEA"/><category term="Safe Browsing"/><category term="SafetyNet"/><category term="Scoped Storage"/><category term="Sharing"/><category term="Southeast Asia"/><category term="Storage"/><category term="TLS by default"/><category term="TikTok"/><category term="Translation"/><category term="UXR"/><category term="User Engagement"/><category term="User Support"/><category term="Visibility"/><category term="Watch Face Push"/><category term="Wear surfaces"/><category term="WebXR"/><category term="Window Manager"/><category term="adaptive API"/><category term="android ux"/><category term="androidjetpack"/><category term="app developer"/><category term="app lifecycle"/><category term="app signing"/><category term="apps games insights"/><category term="attestation"/><category term="autofill"/><category term="beacons"/><category term="beta testing"/><category term="billing"/><category term="build Android apps"/><category term="buildingforbillions"/><category term="canonical layouts"/><category term="code completion"/><category term="codelabs"/><category term="coding productivity"/><category term="color"/><category term="constraintlayout"/><category term="conversations"/><category term="conversions"/><category term="device explorer"/><category term="devices"/><category term="dexer"/><category term="dx"/><category term="editing"/><category term="emojis"/><category term="fitness"/><category term="game design"/><category term="gaming"/><category term="get started"/><category term="google computer science"/><category term="hackster"/><category term="immersive experiences"/><category term="in-app purchase"/><category term="indie game developers"/><category term="infinite deviation: games"/><category term="insights"/><category term="io2010"/><category term="laptops"/><category term="learn Android"/><category term="malware"/><category term="media controls"/><category term="multi-device"/><category term="on-device"/><category term="passwords"/><category term="podcast"/><category term="policy compliance"/><category term="ratings"/><category term="regulations"/><category term="reviews"/><category term="search"/><category term="social impact"/><category term="solutions"/><category term="spatial computing"/><category term="startup profiles"/><category term="target API"/><category term="text"/><category term="things"/><category term="time"/><category term="user data"/><category term="watch face API"/><category term="&quot;featured'+'androidstudio'"/><category term="#11WeeksOfAndroid Android TV"/><category term="#64-bit"/><category term="#AAB"/><category term="#ADS19"/><category term="#AIGlasses"/><category term="#ARCore #TheAndroidShow"/><category term="#ART"/><category term="#ATV"/><category term="#Android #Android development # advanced Android #learn Android #build Android apps #Udacity"/><category term="#Android 14"/><category term="#AndroidAppBundles"/><category term="#AndroidDeviceStreaming&#10;#AndroidStudio"/><category term="#AndroidGeiminiEra"/><category term="#AndroidStudio"/><category term="#AndroidTV"/><category term="#AndroidTV #Google Cast #Udacity"/><category term="#AndroidXR"/><category term="#Androidbasics"/><category term="#AppBundles"/><category term="#Argentina"/><category term="#Compose"/><category term="#Composecamp"/><category term="#Covid-19"/><category term="#EdTech"/><category term="#Editing"/><category term="#Experts"/><category term="#FFmpeg"/><category term="#Firebase"/><category term="#GDC17 #GoogleDeveloperDay #GooglePlay #Games #VR #Daydream #Developers #Android #Google Play"/><category term="#GDE"/><category term="#GPA2017 #GooglePlayAwards #GooglePlay #Games #VR #AR #AndroidWear #Indies #Startup #Apps #Developers #Android #Google Play"/><category term="#GPA2018 #GooglePlayAwards #GooglePlay #Games #VR #AR #AndroidWear #Indies #Startup #Apps #Developers #Android #Google Play"/><category term="#GTV"/><category term="#Game"/><category term="#Gemma"/><category term="#GoogleDevelopers"/><category term="#GoogleTV"/><category term="#Imagen"/><category term="#MADscore"/><category term="#PasskeysWeek #Identity"/><category term="#Pixel"/><category term="#Productivity"/><category term="#STEM"/><category term="#StorageSavings"/><category term="#TechEd"/><category term="#TechEdu"/><category term="#XRGlasses"/><category term="#XRHeadsets"/><category term="#adaptive"/><category term="#advancedAndroid #Udacity"/><category term="#apps"/><category term="#auth-wear"/><category term="#authentication"/><category term="#autofill"/><category term="#autofill-services"/><category term="#codelabcourses"/><category term="#codelabs"/><category term="#compiler"/><category term="#develop"/><category term="#exposing-data"/><category term="#google"/><category term="#io16"/><category term="#largescreens"/><category term="#memory"/><category term="#notifications"/><category term="#optimization"/><category term="#page-sizes"/><category term="#performance"/><category term="#pixel7"/><category term="#restorecredentials"/><category term="#sign-in"/><category term="#ultra-hdr"/><category term="#watch-face-push"/><category term="#xr"/><category term="'featured'+'platform_update'"/><category term=". Web"/><category term=".app"/><category term="11 Weeks of Android"/><category term="11weeksofandroid"/><category term="12l"/><category term="16 KB memory page"/><category term="16 KB page size"/><category term="16KB Page Size"/><category term="3d"/><category term="4 KB page size"/><category term="5 star apps"/><category term="505 Games"/><category term="60 FPS"/><category term="8.1"/><category term="AAKB"/><category term="AAOS"/><category term="AAudio for Android"/><category term="ADT-3"/><category term="AGI"/><category term="AI&#10;Industry Trends"/><category term="AI Edge"/><category term="AI glasses"/><category term="AIY"/><category term="AIY Projects"/><category term="AMD"/><category term="AMP"/><category term="ANR"/><category term="API stabilization"/><category term="APK Expansion Files"/><category term="AQI"/><category term="ARM"/><category term="ARPU"/><category term="ART profiles"/><category term="ASO"/><category term="ATSL"/><category term="About Fun"/><category term="Access"/><category term="Acquisition"/><category term="Activity Embedding"/><category term="Activity Stack Pinning"/><category term="ActivityResult"/><category term="Administration"/><category term="Advanced Android course"/><category term="Advanced Android training"/><category term="Agent Skills"/><category term="Agentic AI"/><category term="Agus Gomez"/><category term="Android 11 Compatibility"/><category term="Android 11 final release"/><category term="Android 12 Beta 5"/><category term="Android 16 KB page"/><category term="Android 17"/><category term="Android 2.3.3"/><category term="Android 4.0"/><category term="Android 4.3"/><category term="Android 5.1"/><category term="Android 7.1"/><category term="Android 8.1"/><category term="Android AICore"/><category term="Android Basics in Kotlin"/><category term="Android Basics with Compose"/><category term="Android C++"/><category term="Android Dev Summit 2021"/><category term="Android Developer Journey"/><category term="Android Developers  #GooglePlayAwards #GooglePlay #Games #Indies #Startup #Apps #Developers #Android"/><category term="Android Developers Best Practices"/><category term="Android Excellence"/><category term="Android GPU"/><category term="Android Game Development Kit"/><category term="Android Games"/><category term="Android IDE"/><category term="Android IO"/><category term="Android Keystore"/><category term="Android ML"/><category term="Android Neural Networks"/><category term="Android Neural Networks API"/><category term="Android O Developer Preview"/><category term="Android One"/><category term="Android Output Switcher"/><category term="Android Paging"/><category term="Android Pay"/><category term="Android Performance Tuner"/><category term="Android Plugins"/><category term="Android Prompting"/><category term="Android Q Beta"/><category term="Android Q Beta 6"/><category term="Android Quality"/><category term="Android Scudo"/><category term="Android Security Rewards"/><category term="Android Security Rewards Program"/><category term="Android Studio 3.6"/><category term="Android Studio 4.0"/><category term="Android Studio 4.1"/><category term="Android Studio 4.2"/><category term="Android Studio Bumblebee"/><category term="Android Studio Chipmunk"/><category term="Android Studio Dolphin Beta"/><category term="Android Studio Electric Eel Canary"/><category term="Android Studio Icon"/><category term="Android Studio Iguana"/><category term="Android Studio Ladybug"/><category term="Android Studio Logo"/><category term="Android Studio Otter"/><category term="Android Studio Profiler"/><category term="Android Studio for enterprises"/><category term="Android Testing Support Library"/><category term="Android Tools"/><category term="Android U"/><category term="Android VRP"/><category term="Android audio latency"/><category term="Android developer codelabs"/><category term="Android games on PC"/><category term="Android graphics"/><category term="Android release"/><category term="Android skills"/><category term="AndroidCanary"/><category term="AndroidRuntime"/><category term="Annoucements"/><category term="AnswerLab"/><category term="AoG"/><category term="App Actions"/><category term="App Review"/><category term="App Startup"/><category term="App Testing"/><category term="App experience"/><category term="App icons"/><category term="AppSearch"/><category term="AppWidgets"/><category term="Application Security Improvement Program"/><category term="Assistant SDK"/><category term="Auto Backup"/><category term="Autofill Framework"/><category term="Autofill Services"/><category term="Automatic App Testing"/><category term="Automotive"/><category term="BABBQ"/><category term="Backup and Restore (IDE)"/><category term="Benchmarking"/><category term="Betatesting"/><category term="Billions"/><category term="Biometric authentication"/><category term="BiometricPrompt"/><category term="BiometricPrompt API"/><category term="Budge Studios"/><category term="Bugs"/><category term="Built-in Intents"/><category term="C++ audio library for Android"/><category term="CDD"/><category term="CFI"/><category term="CMP"/><category term="CTS"/><category term="Call Log"/><category term="CameraX Effect"/><category term="CameraX Extensions"/><category term="Cars"/><category term="Cast"/><category term="Certificates"/><category term="Certification"/><category term="Channels"/><category term="Clock"/><category term="Cloud Speech API"/><category term="Code Generation"/><category term="Compiler Mitigations"/><category term="Compiler-based security"/><category term="Complications"/><category term="Composables"/><category term="Compose 1.8"/><category term="Compose Adaptive Layouts Library 1.2"/><category term="Compose MultiPlatform"/><category term="Compose Preview"/><category term="Compose Tools"/><category term="Compose for Wear OS"/><category term="CompositionPlayer"/><category term="Connected displays"/><category term="Consistency"/><category term="Console"/><category term="Contacts"/><category term="Content Provider"/><category term="Control Flow Integrity"/><category term="Cool Stuff"/><category term="Credential Saving"/><category term="CredentialManager"/><category term="Crostini"/><category term="CultureAlley"/><category term="DAC/Design"/><category term="DNG"/><category term="DNS over TLS"/><category term="DP3"/><category term="DST"/><category term="Dagger"/><category term="Dan Dole"/><category term="Data-Driven Prompts"/><category term="Daylight savings"/><category term="Deep Links"/><category term="DeliQueue"/><category term="Demographics"/><category term="Deprecation"/><category term="Design Hub"/><category term="Desugaring"/><category term="DevTools"/><category term="Developer Accounts"/><category term="Developer Days"/><category term="Developer Experience"/><category term="Developer Student Clubs"/><category term="DialogFragment"/><category term="Disruptor Beam"/><category term="DonutTracker"/><category term="Doze"/><category term="Driving Do Not Disturb"/><category term="Duolingo"/><category term="EA"/><category term="EAP"/><category term="EOY Recap 2022"/><category term="EOY recap 2023"/><category term="Editors’ Choice"/><category term="Educate"/><category term="Electronic Arts"/><category term="Engage"/><category term="Engage SDK"/><category term="Engineering"/><category term="Enterprise"/><category term="Entrepreneurs"/><category term="Extensions"/><category term="FAQ"/><category term="Facebook"/><category term="Fast"/><category term="Fast Pair"/><category term="Feature Combination"/><category term="Feedback"/><category term="Figma"/><category term="Finance"/><category term="Find My Device"/><category term="Firebase AI Logic"/><category term="Firebase Crashlytics"/><category term="Fit"/><category term="Foreground services"/><category term="Fortify"/><category term="Fragment"/><category term="Freeform Resizing"/><category term="Frequently Asked Questions"/><category term="Froyo 2.2"/><category term="GDC 2025"/><category term="GDC17"/><category term="GDC19"/><category term="GDC20"/><category term="GMD"/><category term="GNSS"/><category term="GPGS"/><category term="GPU acceleration"/><category term="GSI"/><category term="Game Mode API"/><category term="Game engine development"/><category term="Gamer Profile"/><category term="Games and Media"/><category term="Gareth Jones"/><category term="Gemini 1.5 Flash"/><category term="Gemini 1.5 Pro"/><category term="Gemini API"/><category term="Gemini APIs"/><category term="Gemini features"/><category term="Gemini for enterprises"/><category term="GeminiPro"/><category term="GenAI APIs"/><category term="Global Game Jam"/><category term="Global events"/><category term="Gmail"/><category term="Golf Clash"/><category term="Google AI Edge"/><category term="Google APIs"/><category term="Google Ads"/><category term="Google Apps"/><category term="Google Awareness API"/><category term="Google Cloud"/><category term="Google Developer Student Clubs"/><category term="Google Health"/><category term="Google Home app"/><category term="Google I/O 2021"/><category term="Google I/O 2026"/><category term="Google I/O 26"/><category term="Google Mobile Developer Day"/><category term="Google Now"/><category term="Google Photos"/><category term="Google Play Asset Delivery"/><category term="Google Play Developer API"/><category term="Google Play Developer API V3"/><category term="Google Play Developer API Version 3"/><category term="Google Play Developer Policies"/><category term="Google Play Games on PC"/><category term="Google Play Orders API benefits"/><category term="Google Play Points"/><category term="Google Play Protect Rewards Program"/><category term="Google Play developer distribution agreement"/><category term="Google Play monetization insights"/><category term="Google Play system updates"/><category term="Google registry"/><category term="GoogleDeveloperDay"/><category term="GoogleForGames"/><category term="GooglePlay AndroidDev"/><category term="Gpfe"/><category term="GridLayout"/><category term="Guidance on how to declare support for pointer input"/><category term="HAL"/><category term="HDR Headroom"/><category term="HTC G1"/><category term="HWASan"/><category term="Hard"/><category term="Health and Fitness"/><category term="HelloEnglish"/><category term="High Speed Recording"/><category term="Hilt"/><category term="Hiring"/><category term="Holo"/><category term="How to build Android app"/><category term="HttpsURLConnection"/><category term="Hutch"/><category term="Hutch Games"/><category term="Hybrid Interface"/><category term="HyperV"/><category term="I/O '25"/><category term="I/O 2018"/><category term="I/O 2024 KMP"/><category term="I/O 2026 announcements"/><category term="ICS"/><category term="IO"/><category term="IO 2019"/><category term="Image Attachment"/><category term="Image Processing"/><category term="Imagen"/><category term="Images"/><category term="Indie Games Fund"/><category term="Indie games developers"/><category term="Indonesia"/><category term="Indonesia Games Contest"/><category term="Industry Standards"/><category term="Industry Trends"/><category term="InkToCode"/><category term="Intel"/><category term="Intent"/><category term="Intermediate"/><category term="Introducing Android Performance Analyzer"/><category term="Inzen studio"/><category term="Issue Tracker"/><category term="J. Eason"/><category term="Jamal Eason"/><category term="Jetpack Compose 1.3"/><category term="Jetpack Compose 1.4"/><category term="Jetpack Compose 1.5"/><category term="Jetpack Core Performance library"/><category term="Jetpack Tiles Library"/><category term="Jetpack XR SDK"/><category term="JetpackCompose"/><category term="JioHotstar"/><category term="Job Scheduler"/><category term="Job Service"/><category term="KNOX"/><category term="KSP"/><category term="Key Attestation"/><category term="Keystone"/><category term="Kids experience"/><category term="Klei Entertainment"/><category term="Kotlin Event"/><category term="Kotlin Symbol Processiong"/><category term="Kotlin codelabs"/><category term="KotlinConf 2025"/><category term="LLM"/><category term="LLM Optimization"/><category term="LLM Tuning"/><category term="LTV"/><category term="LaMatinale"/><category term="Large screen"/><category term="Layout Inspector"/><category term="LeMonde"/><category term="Life of a Bug"/><category term="Lifecycle"/><category term="Lint"/><category term="Linux on Chrome OS"/><category term="Linux on Chromebooks"/><category term="LiteRT"/><category term="Live Updates"/><category term="LiveData"/><category term="Lollipop"/><category term="Low-light"/><category term="MCP"/><category term="MENA"/><category term="ML Kit Face Detection"/><category term="ML Stack"/><category term="MLKit"/><category term="Marta Gui"/><category term="Material 3 Expressive"/><category term="Media Development Kit"/><category term="Media Editing"/><category term="Media3 Effect"/><category term="MediaPipe"/><category term="Memory Safety"/><category term="MessageQueue"/><category term="Messenger"/><category term="Meta"/><category term="Mirror Mode"/><category term="Mixed Reality"/><category term="Mobilel"/><category term="Motorola Droid"/><category term="Mountain View"/><category term="Multimodal"/><category term="Multiwindow"/><category term="Munich"/><category term="Music"/><category term="MyTouch 3G"/><category term="NBU"/><category term="NFC"/><category term="NLP"/><category term="Narwhal Canary"/><category term="Nav Editor"/><category term="Navigation 3"/><category term="Navigation Sample"/><category term="Night Mode"/><category term="Niji Games"/><category term="Nix Hydra"/><category term="Non-SDK"/><category term="Notification bubbles"/><category term="Now in Arabic"/><category term="O-MG"/><category term="OAuth"/><category term="OEM"/><category term="OS Updates"/><category term="Oboe audio library"/><category term="Omnidrone"/><category term="OneTap sign-in"/><category term="OneUi7"/><category term="Ongoing Activities API"/><category term="OpenSL ES for Android"/><category term="Operating System"/><category term="Oppo"/><category term="Orientation"/><category term="OverlayEffect"/><category term="P2P"/><category term="PC"/><category term="PC gaming"/><category term="PWA"/><category term="Paging"/><category term="Pane expansion"/><category term="Parcelize"/><category term="Paris Hsu"/><category term="PasskeysWeek"/><category term="Password Manager"/><category term="Paul Gouge"/><category term="Photo Sphere"/><category term="Physics"/><category term="Pico"/><category term="Pixel 10 Pro fold"/><category term="Pixel 2"/><category term="Pixel 9"/><category term="Pixel Fold AVD"/><category term="Pixel Fold Emulator"/><category term="Pixel Tablet AVD"/><category term="Pixel Tablet Emulator"/><category term="Pixel Watch 4"/><category term="Platform Stability"/><category term="PlatformUpdate"/><category term="Platforms"/><category term="Play Console sales channel reporting"/><category term="Play Games Services"/><category term="Play IO19"/><category term="Play Quality"/><category term="Play developer identification"/><category term="Playdemic"/><category term="Playtime"/><category term="Playtime 2016"/><category term="Plugin"/><category term="Pocket Gems"/><category term="Potentially Harmful Applications"/><category term="Power Consumption"/><category term="Power Profiler"/><category term="Power Rails"/><category term="Pre-Launch Report"/><category term="Preload Manager"/><category term="PreloadManagerListener"/><category term="Preloading"/><category term="Product Inclusion"/><category term="Profileable Build"/><category term="ProfilingManager"/><category term="Programs"/><category term="Project Mainline"/><category term="Promo Graphics"/><category term="Promotions"/><category term="Prompt Library"/><category term="Protolayout"/><category term="Protolayouts"/><category term="Public Tracker"/><category term="Publishing Overview"/><category term="PyTorch"/><category term="PyTorch mobile support"/><category term="PyTorck"/><category term="Q Beta 6"/><category term="Quick Search Box"/><category term="RAW capture"/><category term="RTL"/><category term="Ratings and Reviews"/><category term="Releases"/><category term="RemoteCompose"/><category term="Restore Credentials"/><category term="Robinhood"/><category term="Room"/><category term="Rust"/><category term="SDLC"/><category term="SDV"/><category term="SMS"/><category term="SQLite"/><category term="SafeArgs"/><category term="Sam Glassenberg"/><category term="Sample app"/><category term="Samsung One UI"/><category term="Sanitizers"/><category term="Santa Tracker"/><category term="Save for later"/><category term="Schell Games"/><category term="Screen Flash"/><category term="ScreenCapture"/><category term="Security Development Lifecycle"/><category term="Selected Photos"/><category term="Sensors"/><category term="Seriously"/><category term="Server"/><category term="SessionConfig"/><category term="Sharding"/><category term="ShareActionProvider"/><category term="Shared Components"/><category term="Shared Elements"/><category term="SharedPreferences"/><category term="Shortcuts"/><category term="Signos"/><category term="Simultaneous Contrast"/><category term="Skyscanner"/><category term="Sliding Window Pattern"/><category term="Small Business"/><category term="Smart Home"/><category term="Smart Lock"/><category term="Smartlock"/><category term="Social"/><category term="Social Point"/><category term="South Korea"/><category term="Space"/><category term="Space Ape Games"/><category term="Speech Input"/><category term="Stable 1.0"/><category term="Startup Speed"/><category term="Stencils"/><category term="Storytoys"/><category term="Stripe"/><category term="Studio"/><category term="Stylus"/><category term="Submit changes"/><category term="Super Evil MegaCorp"/><category term="Survey"/><category term="System Fitness Tracker"/><category term="System Instructions"/><category term="System Media Controls"/><category term="System hardening"/><category term="TAGS: Google Play"/><category term="TEE"/><category term="Tabletop"/><category term="Tap to Pay"/><category term="Target API level"/><category term="TargetPreloadStatusControl"/><category term="Tel Aviv"/><category term="Telephony"/><category term="Text improvements"/><category term="The Android Show"/><category term="The Next Evolution in Profiling for Android"/><category term="Tiles API"/><category term="Tiles components"/><category term="Tiles material"/><category term="Timekeeping"/><category term="Timestamps"/><category term="Tips"/><category term="Titan Brawl"/><category term="Todoist"/><category term="Tor Norbye"/><category term="Touch"/><category term="Transform Preview with Gemini"/><category term="Trusted User Interface"/><category term="TrustedTime"/><category term="Twitter"/><category term="UAMP"/><category term="UI Automation"/><category term="USB speed detection"/><category term="UTP"/><category term="Universal Android Music Player"/><category term="Updatability"/><category term="Upgrade Agent"/><category term="User Acquisition"/><category term="User Feedback"/><category term="User Retention"/><category term="User-Agent Reduction"/><category term="VGames"/><category term="VOD"/><category term="Vertex AI Prompts"/><category term="Viber"/><category term="Video recording"/><category term="ViewBinding"/><category term="Virtualization"/><category term="Visibility tracking"/><category term="Vitals"/><category term="Voice"/><category term="Voice Kit"/><category term="Vulnerability"/><category term="Vulnerability Remediation"/><category term="WEI"/><category term="WFF 5"/><category term="WM"/><category term="Wakelocks"/><category term="Watch Face Studio"/><category term="Wear UI Library"/><category term="Webdriver"/><category term="What's new in Cars for developers"/><category term="Wide Color"/><category term="Widget Discovery"/><category term="WindowSizeClass"/><category term="Wired XR glasses"/><category term="Withings"/><category term="Work Manager"/><category term="World Food Day"/><category term="X"/><category term="X86"/><category term="XML"/><category term="XR"/><category term="XR Emulator"/><category term="Xiaomi"/><category term="XmlPullParser"/><category term="YouTube"/><category term="Zero-Shot Prompts"/><category term="activity-recognition"/><category term="add-ons"/><category term="advanced Android"/><category term="adventure games"/><category term="and appquality"/><category term="android 12"/><category term="android 8.0"/><category term="android audio apps"/><category term="android c++ games linux open source release osx serialization windows"/><category term="android extension pack"/><category term="android kotlin"/><category term="android o apis"/><category term="android sanitizer"/><category term="android things 1.0"/><category term="android wear 1.0"/><category term="android-dev"/><category term="android10"/><category term="android71"/><category term="android81"/><category term="android9"/><category term="androidbasics"/><category term="androiddevsummit"/><category term="androidoreo"/><category term="app attribution"/><category term="app id"/><category term="app install"/><category term="app size"/><category term="app standby buckets"/><category term="app updates"/><category term="appbundle"/><category term="application security"/><category term="applications"/><category term="arch"/><category term="arcore"/><category term="ask android"/><category term="assistive technology"/><category term="atomic"/><category term="audio playback"/><category term="audio playback capture"/><category term="audio recording"/><category term="augmented reality"/><category term="award"/><category term="awareness"/><category term="background"/><category term="background access"/><category term="background location"/><category term="backup and sync"/><category term="badge"/><category term="bar code"/><category term="beacon"/><category term="best apps 2020"/><category term="best games 2020"/><category term="betatesting GooglePlayforFamilies"/><category term="big data"/><category term="blackhat"/><category term="bootcamp"/><category term="bubbles"/><category term="bug swatting"/><category term="building 5 star apps"/><category term="building across devices"/><category term="bulletins"/><category term="business development"/><category term="calling"/><category term="car app quality"/><category term="clang"/><category term="class loading"/><category term="code sharing"/><category term="codesearch"/><category term="coding"/><category term="companion Action"/><category term="compilers"/><category term="concurrency"/><category term="concurrent camera"/><category term="conferencing"/><category term="context"/><category term="controls"/><category term="course"/><category term="crash management"/><category term="credential"/><category term="cross-device sdk"/><category term="cross-platform"/><category term="cross-platform development"/><category term="curriculum"/><category term="custom tiles"/><category term="cutout"/><category term="dalvik"/><category term="data storage"/><category term="ddms"/><category term="decompile"/><category term="deeplocal"/><category term="desktop apps"/><category term="developer community"/><category term="developer profile"/><category term="developer success"/><category term="developerappstory"/><category term="developerpreview"/><category term="developerstory developerconsole"/><category term="device id"/><category term="dex2oat"/><category term="diagnostics"/><category term="dialog full-screen dim"/><category term="digital credentials"/><category term="digital identity"/><category term="disassembly"/><category term="dynamicdelivery"/><category term="eBook"/><category term="ecosystem"/><category term="educator"/><category term="efficiency"/><category term="encoding"/><category term="explorer"/><category term="face detection"/><category term="faculty"/><category term="families"/><category term="feature combination query"/><category term="final release"/><category term="financial management"/><category term="first app"/><category term="font updates"/><category term="free trial"/><category term="full-text search"/><category term="game-as-a-service"/><category term="games business"/><category term="gaming industry"/><category term="gapid"/><category term="gdc18"/><category term="getting started"/><category term="go edition"/><category term="gold"/><category term="golf games"/><category term="google pay"/><category term="google security"/><category term="googleservices"/><category term="guide"/><category term="heading"/><category term="health"/><category term="heart rate sensor"/><category term="high dynamic range"/><category term="high frame rate"/><category term="how to develop audio apps for android"/><category term="how to increase app revenue Google Play"/><category term="http"/><category term="i18n"/><category term="iOS development"/><category term="image description"/><category term="imakeapps"/><category term="in-app transactions"/><category term="in-car experiences"/><category term="insider attack resistance"/><category term="install referrer"/><category term="install track"/><category term="installs"/><category term="instant"/><category term="instant experience"/><category term="instant games"/><category term="instructor"/><category term="interactive divider"/><category term="internationalization"/><category term="internet"/><category term="intuit"/><category term="io16"/><category term="io18"/><category term="jetpack media3"/><category term="jobscheduler"/><category term="journeys testing"/><category term="journeys with gemini"/><category term="key"/><category term="keymaster"/><category term="keymint"/><category term="keys"/><category term="keystore"/><category term="kids app developers"/><category term="kids apps"/><category term="ktx"/><category term="l10n"/><category term="language id"/><category term="language identification"/><category term="laptop apps"/><category term="large screen devices"/><category term="latency"/><category term="latest."/><category term="leanback"/><category term="learning"/><category term="listing"/><category term="liveops"/><category term="location access"/><category term="location data"/><category term="lock contention"/><category term="lock-free"/><category term="long aspect ratio"/><category term="longevity"/><category term="machine"/><category term="marble"/><category term="media playback"/><category term="meet"/><category term="messaging api"/><category term="minSdkVersion"/><category term="mobile ads"/><category term="mobile driving license"/><category term="mobile encryption"/><category term="mobile search"/><category term="monitoring"/><category term="motion"/><category term="motion."/><category term="multi-display support"/><category term="multi-product checkout"/><category term="multiplayer"/><category term="music player"/><category term="musician apps"/><category term="native development"/><category term="native libraries"/><category term="navigation apps"/><category term="network"/><category term="new Play developer accounts"/><category term="new with Cast"/><category term="nonce field"/><category term="oboe"/><category term="of"/><category term="official launch"/><category term="offline"/><category term="on-device AI"/><category term="optimize app ARPPU"/><category term="optimized resource shrinking"/><category term="ordered broadcast"/><category term="oscon"/><category term="outreach"/><category term="packaging"/><category term="partial"/><category term="passwordless authentication"/><category term="patch level"/><category term="patching"/><category term="pathway"/><category term="peer group"/><category term="perfetto"/><category term="performance class"/><category term="performancetools"/><category term="phone"/><category term="photo picker"/><category term="play billing"/><category term="play billing library"/><category term="play core"/><category term="playback resumption"/><category term="playbook app"/><category term="playconsole"/><category term="player engagement"/><category term="policy violations"/><category term="postview"/><category term="pre rotation"/><category term="pre-leaunch"/><category term="preinstalled apps"/><category term="preloaded apps"/><category term="priority inversion"/><category term="pro audio"/><category term="problem solving"/><category term="programming"/><category term="project marble"/><category term="protection"/><category term="provisioning"/><category term="publishing"/><category term="purchase flows"/><category term="push messaging"/><category term="pwn"/><category term="real world identity"/><category term="real-time audio"/><category term="recaptcha"/><category term="reduce app churn strategies"/><category term="registration"/><category term="requirement"/><category term="revenue"/><category term="robotics"/><category term="rotation"/><category term="runtime"/><category term="runtime permissions"/><category term="sandbox ads"/><category term="sanitizer"/><category term="schools"/><category term="screen"/><category term="screensharing"/><category term="sdk"/><category term="seamless transfer"/><category term="secondhand"/><category term="secure hardware"/><category term="security infrastructure"/><category term="selinux"/><category term="sensors-and-location"/><category term="service fees"/><category term="sign-in"/><category term="slow motion"/><category term="smart reply"/><category term="smartwatch design"/><category term="smr"/><category term="source code"/><category term="spam"/><category term="spatial audio"/><category term="spyware"/><category term="stability"/><category term="stable"/><category term="storelistingexperime"/><category term="strictmode"/><category term="study group"/><category term="success"/><category term="suggested fixes for crashes"/><category term="synthetics"/><category term="system UI"/><category term="system fonts"/><category term="tamper-resistant hardware security"/><category term="targeted spyware"/><category term="taxation"/><category term="taxes"/><category term="teach"/><category term="telecom"/><category term="text styling API"/><category term="textclassifier"/><category term="texture compression"/><category term="textview"/><category term="threading"/><category term="time zone"/><category term="titan"/><category term="traceview"/><category term="tradein"/><category term="transition api"/><category term="transitions"/><category term="trial period"/><category term="trust"/><category term="university"/><category term="user control"/><category term="user location"/><category term="user safety"/><category term="version"/><category term="video call"/><category term="video editing"/><category term="video playback"/><category term="videocall"/><category term="viewfinder"/><category term="viewpager"/><category term="virtual instruments"/><category term="voice call"/><category term="voip"/><category term="vulnerabilities"/><category term="wake locks"/><category term="wear emulators"/><category term="web registry"/><category term="wellness"/><category term="window"/><category term="“Privacy Sandbox on Android”"/><title type="text">Android Developers Blog</title><subtitle type="html">An Open Handset Alliance Project.</subtitle><link href="http://android-developers.googleblog.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/" rel="alternate" type="text/html"/><link href="http://pubsubhubbub.appspot.com/" rel="hub"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/><author><name>Birna</name><uri>http://www.blogger.com/profile/04044883525253664551</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><generator uri="http://www.blogger.com" version="7.00">Blogger</generator><openSearch:totalResults>2047</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-4296509647035928483</id><published>2026-07-29T06:00:00.000-07:00</published><updated>2026-07-29T11:28:04.581-07:00</updated><title type="text">Delivering safer, age-appropriate experiences on Google Play</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Em0UEKqDqhBIensqI38iULJEsiDOwA6nhPMuJHDAlX2PO-t4D_23woJNm_YFcijJCszieB98dpJi7sNgNpqe5tunH9Cr5O6M1YAMHMhEpB_O-Hoq14a1Yw4oFvuopsDkn719Bu6s4NR0BSfOcsN3DQpfsO1HW-TGpv3FTYk2eINnH-smtlNf8ihOVr0/s2048/Google-Play-Age-Signals-API-Blog-Metadata.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Em0UEKqDqhBIensqI38iULJEsiDOwA6nhPMuJHDAlX2PO-t4D_23woJNm_YFcijJCszieB98dpJi7sNgNpqe5tunH9Cr5O6M1YAMHMhEpB_O-Hoq14a1Yw4oFvuopsDkn719Bu6s4NR0BSfOcsN3DQpfsO1HW-TGpv3FTYk2eINnH-smtlNf8ihOVr0/s2048/Google-Play-Age-Signals-API-Blog-Metadata.png" style="display: none;" /&gt;&lt;div&gt;&lt;i&gt;Posted by Paul Feng, VP of Product Management, Google Play&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCpyp7yWQ-4XkfYfI6bwCUkYoNP1_XpR7xhhC52pwFsyohWxu4pegX6w23S_ZKHj8aENsVN4c1dCJvXrWmVNIeH0dUvyOVTeFvfAWg7TDzjv4BdV-wwUWVmT9MBVYMBBvkG4ZeEQrJelf3i4Rzxy5_Jk0bXpV73XHmk78UQOrUkP13cq5XvOLqTsCAM3I/s4209/Google-Play-Age-Signals-API-Blog-A.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCpyp7yWQ-4XkfYfI6bwCUkYoNP1_XpR7xhhC52pwFsyohWxu4pegX6w23S_ZKHj8aENsVN4c1dCJvXrWmVNIeH0dUvyOVTeFvfAWg7TDzjv4BdV-wwUWVmT9MBVYMBBvkG4ZeEQrJelf3i4Rzxy5_Jk0bXpV73XHmk78UQOrUkP13cq5XvOLqTsCAM3I/s1600/Google-Play-Age-Signals-API-Blog-A.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;p&gt;Providing a safe online experience and protecting users from harm is a top priority at Google Play. We take this responsibility seriously and have been investing continuously to offer baseline protections on our platform while also empowering parents with the tools they need to make decisions for their families. Importantly, we also want to empower Play developers with the capabilities to deliver age-appropriate experiences based on their app's content.&lt;/p&gt;

&lt;p&gt;To support this, today, we are taking another big step in our ongoing partnership with parents and developers by announcing the expansion of the &lt;a href="https://developer.android.com/google/play/age-signals/overview" target="_blank"&gt;Google Play Age Signals API &lt;/a&gt;to all Play developers globally. Building on current availability in Brazil, we will expand this experience first to users in Australia and Canada by mid-August, with a full global rollout to all users later this year.&lt;/p&gt;

&lt;h2&gt;Empowering developers to create age-appropriate experiences&lt;/h2&gt;

&lt;p&gt;The Play Age Signals API is a privacy-preserving tool that puts parents in the driver's seat allowing them to share their child's age range (e.g. 16-17) directly with apps. It also enables adults to easily share their age when prompted by the app developer. In turn, developers receive the signals they need to tailor their own in-app safety experiences and content for users in an age-appropriate way.&lt;/p&gt;

&lt;p&gt;We want to give developers the ability to choose the right protections for the nature of their app. A weather app, for example, shouldn't need the same safety settings as entertainment or media apps. Rather than enforcing one-size-fits-all rules, we give developers the flexibility to choose how they integrate safety signals. With this reliable signal, you retain complete agency to tailor your app's content, features, and settings to match your audience.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWX2huHl1jcWSRmn2YiJaYQ0v8Y_U5HpHJ3o0RvlAf3XPr_tADCW17wCgQjp7g9gBbS0iYETcbReZco_jDbpO8FvEmC6bRugSs6zL8uHGWd7KG1RuT28c6Cyi2D_Tt33ZuIB1imLgGZsiZ7hSS-Fm_deQy2XVmeH76S2naCAmYgJMHLlZ33aNDSSUaqAE/s1924/Production_InApp%20(1).png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1924" data-original-width="1424" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWX2huHl1jcWSRmn2YiJaYQ0v8Y_U5HpHJ3o0RvlAf3XPr_tADCW17wCgQjp7g9gBbS0iYETcbReZco_jDbpO8FvEmC6bRugSs6zL8uHGWd7KG1RuT28c6Cyi2D_Tt33ZuIB1imLgGZsiZ7hSS-Fm_deQy2XVmeH76S2naCAmYgJMHLlZ33aNDSSUaqAE/w296-h400/Production_InApp%20(1).png" width="296" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;Users have a choice to share their age range in a privacy-friendly way&lt;/i&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;Simplifying controls for parents&lt;/h2&gt;

&lt;p&gt;Parents shouldn't have to manage complex safety settings across dozens of different apps to keep their children safe. The Play Age Signals API simplifies this by putting age-sharing controls in one place, directly inside the &lt;a href="https://families.google/"&gt;Google Family Link app&lt;/a&gt;. Parents have a choice to share their child’s age range, and if they choose to share, all Play apps that use Play Age Signals API can receive age signals. This lets children jump straight into age-appropriate content without parents having to manually configure settings inside these apps. Age ranges are never shared by default, and parents can update or turn off these settings at any time.&lt;br /&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6VNiLBGhSTQeC09ObM-U8nF6oJjSSDfYy3fJLAzVBgrJn-0_tGtNJN7Hefp2eUFr1b7CmOvirjVkAGSGSwIT7uV_Hu2xb2714_938t_XLuDUr2MqZdnSfBRvheoUpu5i-dyYiAjJi5vNNLcGWrQuKXBNOhtbWplwNbNkqzbirwDCitzHdF9gTAFFGtFU/s3672/FL_Settings%20(1).png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="3672" data-original-width="1664" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6VNiLBGhSTQeC09ObM-U8nF6oJjSSDfYy3fJLAzVBgrJn-0_tGtNJN7Hefp2eUFr1b7CmOvirjVkAGSGSwIT7uV_Hu2xb2714_938t_XLuDUr2MqZdnSfBRvheoUpu5i-dyYiAjJi5vNNLcGWrQuKXBNOhtbWplwNbNkqzbirwDCitzHdF9gTAFFGtFU/w290-h640/FL_Settings%20(1).png" width="290" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;Centralized and easy way to manage age sharing settings for parents via Family Link App&lt;/i&gt;&lt;/div&gt;

&lt;h2&gt;Building on our broader safety tools&lt;/h2&gt;

&lt;p&gt;The Play Age Signals API builds upon a strong foundation of established safety features and strict policies we have long enforced on Google Play. Today, we already mandate that apps designed for families meet &lt;a href=" https://support.google.com/googleplay/android-developer/answer/9893335?hl=en"&gt;rigorous safety standards&lt;/a&gt;, and we continuously review and scan applications to ensure they are safe for children. For developers, we also offer built-in tools like &lt;a href="https://support.google.com/googleplay/android-developer/answer/9867159#age-groups-18-and-over" target="_blank"&gt;Restrict Minor Access&lt;/a&gt; in the Play Console to help them manage who can discover their apps. For parents, Google Family Link remains a trusted, central dashboard where they can manage screen-time limits, &lt;a href="https://support.google.com/googleplay/answer/1075738" target="_blank"&gt;PIN-based content filters&lt;/a&gt;, and app download approvals.&lt;/p&gt;

&lt;p&gt;Expanding the Play Age Signals API globally adds a powerful new tool to our existing safety suite, helping parents and developers work together to make Google Play an even safer, more trustworthy place for families.&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;</content><link href="http://android-developers.googleblog.com/feeds/4296509647035928483/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/google-play-age-signals-api-safer-experiences.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/4296509647035928483" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/4296509647035928483" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/google-play-age-signals-api-safer-experiences.html" rel="alternate" title="Delivering safer, age-appropriate experiences on Google Play" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Em0UEKqDqhBIensqI38iULJEsiDOwA6nhPMuJHDAlX2PO-t4D_23woJNm_YFcijJCszieB98dpJi7sNgNpqe5tunH9Cr5O6M1YAMHMhEpB_O-Hoq14a1Yw4oFvuopsDkn719Bu6s4NR0BSfOcsN3DQpfsO1HW-TGpv3FTYk2eINnH-smtlNf8ihOVr0/s72-c/Google-Play-Age-Signals-API-Blog-Metadata.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-8693766666920532872</id><published>2026-07-28T09:00:00.000-07:00</published><updated>2026-07-30T07:41:41.322-07:00</updated><title type="text">Celebrating 5 years of Jetpack Compose</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqdSbNmK_9vJR4DQPvGN0oUtQK8s0T2HsgPAsNsl9Kqvd49M3ODh7wlGPZrCRVHEC30oArKNrqmLtuO-zwoZHkfN3_AQz2NNBG6S1st34TOCYx9Mu9cM-ut-rSN8-U1o9Q4ufBwY1l3ukPRjw8QxHWdpxAeeoKRVDPvEjysPwORA3TRhbtpMyTctDQsdY/s320/Jetpack%20compose_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqdSbNmK_9vJR4DQPvGN0oUtQK8s0T2HsgPAsNsl9Kqvd49M3ODh7wlGPZrCRVHEC30oArKNrqmLtuO-zwoZHkfN3_AQz2NNBG6S1st34TOCYx9Mu9cM-ut-rSN8-U1o9Q4ufBwY1l3ukPRjw8QxHWdpxAeeoKRVDPvEjysPwORA3TRhbtpMyTctDQsdY/s320/Jetpack%20compose_Meta.png" style="display: none;" /&gt;Posted by Rebecca Franks, Developer Relations Engineer, Nick Butcher, Product Manager, Loryn Hairston, Product Marketing Manager, Android&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw3DKaw8qASt6AVjsnSTjRqXf81sJAoY9cVQ84H5nyPhcSCrQpsCqGMqt_xHvvCcr5AiUjgOkenszO-Gv0iDi_jvrzXuetPHwRkiNDNXTSF3HAS5q1OMGY7_iHxQMt77_7TvYiNFZGrJSNw6_RrepymprGBh4T1vk11NPgp11l8jd9pUv8CD78jqWjr_I/s8419/Jetpack%20compose_Blog%20banner.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2507" data-original-width="8419" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw3DKaw8qASt6AVjsnSTjRqXf81sJAoY9cVQ84H5nyPhcSCrQpsCqGMqt_xHvvCcr5AiUjgOkenszO-Gv0iDi_jvrzXuetPHwRkiNDNXTSF3HAS5q1OMGY7_iHxQMt77_7TvYiNFZGrJSNw6_RrepymprGBh4T1vk11NPgp11l8jd9pUv8CD78jqWjr_I/s1600/Jetpack%20compose_Blog%20banner.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Today, we officially celebrate five years since the release of Jetpack Compose 1.0. From version &lt;a href="https://android-developers.googleblog.com/2021/07/jetpack-compose-announcement.html" target="_blank"&gt;1.0, announced on July 28th, 2021&lt;/a&gt;, to our latest &lt;a href="https://android-developers.googleblog.com/2026/04/jetpack-compose-april-2026-updates.html" target="_blank"&gt;1.11 release&lt;/a&gt;, we’ve seen the APIs evolve significantly over the years, and we’re taking a moment to celebrate.&lt;/p&gt;

&lt;p&gt;When we officially announced the 1.0 release, we promised a simpler, faster, and more intuitive way to build native interfaces on Android. Looking back, it's safe to say that Compose didn’t just deliver on that promise, but also completely changed the Android ecosystem, with more than 68% of the top 1,000 apps using it in production today.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;"&gt;
  &lt;iframe 
    src="https://www.youtube.com/embed/6qyCXugCU6w" 
    class="BLOG_video_class" 
    allowfullscreen="" 
    youtube-src-id="6qyCXugCU6w"
    style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0;"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;History&lt;/h2&gt;
&lt;p&gt;Over the last five years, Compose has grown steadily. In the &lt;a href="https://www.youtube.com/watch?v=VsStyq4Lzxo"&gt;early days&lt;/a&gt;,  we explored showing you how to build layouts with the basic Box, Row, and Column. Today, we’ve expanded Compose to work not just on mobile devices, but to other form factors such as &lt;a href="https://developer.android.com/training/tv/playback/compose"&gt;Compose for TV&lt;/a&gt;, &lt;a href="https://developer.android.com/training/wearables/compose?version=3"&gt;WearOS&lt;/a&gt;, &lt;a href="https://developer.android.com/develop/ui/compose/glance"&gt;Glance for Widgets&lt;/a&gt;, and even display glasses with &lt;a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer"&gt;Jetpack Compose Glimmer&lt;/a&gt;.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWh8CsCAq-H6bDDYNx7rg-C2Ok49rbVuMXWelUJhj-jivPZl-ZsSyoJuyisNxqvWCsiMCYvpdOAgGXG1Fqm8JLhkDr8iwD0leU8U_Yi3C-eW6Yqk-Gdp4AhgrpIIoUzETs0bTNNLmZRPiLzNPph9yA7hRCTm0-WDhsZu70dDYMX2uPwuVG50Sm8Ra8fko/s1999/jetpack_compose_everywhere.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="743" data-original-width="1999" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWh8CsCAq-H6bDDYNx7rg-C2Ok49rbVuMXWelUJhj-jivPZl-ZsSyoJuyisNxqvWCsiMCYvpdOAgGXG1Fqm8JLhkDr8iwD0leU8U_Yi3C-eW6Yqk-Gdp4AhgrpIIoUzETs0bTNNLmZRPiLzNPph9yA7hRCTm0-WDhsZu70dDYMX2uPwuVG50Sm8Ra8fko/s1600/jetpack_compose_everywhere.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;We recorded an Android Developers Backstage episode with &lt;a href="https://uk.linkedin.com/in/clara-bayarri-815b7333"&gt;Clara Bayarri&lt;/a&gt;, Engineering Lead for Jetpack, and two former leads of the team, &lt;a href="https://www.romainguy.dev/"&gt;Romain Guy&lt;/a&gt; and &lt;a href="https://www.chethaase.com/"&gt;Chet Haase&lt;/a&gt;, along with &lt;a href="https://www.linkedin.com/in/tor-norbye"&gt;Tor Norbye&lt;/a&gt;, Senior Engineering Director. In this episode, they discuss the history of Compose and the early days of development.&lt;/p&gt;&lt;div class="separator" style="clear: both;"&gt;
&lt;div class="separator" style="clear: both; text-align: center; width: 100%;"&gt;
  &lt;div style="height: 0px; max-width: 100%; overflow: hidden; padding-bottom: 56.25%; position: relative;"&gt;
    &lt;iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/HEqXwUm6vd0" style="border: 0; height: 100%; left: 0; position: absolute; top: 0; width: 100%;" width="320" youtube-src-id="HEqXwUm6vd0"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjASmtolyBoNVHRjLZlHPzpVlJPfXuw4eKAphJtUQWYE0JOMbboZSL9nmyyBnsOTtHXDxpD0guDehRU7hBnGN1kR0D3zP7MVb75f1ldqlv2Xe6QQVVrr4zDRDKrpbSJ3xzp99O9tK-sMnxKynzH2MPe5HU3C5RS2g2kiz3Hf0BKIwsEy207YS2oesGTBsw/s3200/timeline.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1200" data-original-width="3200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjASmtolyBoNVHRjLZlHPzpVlJPfXuw4eKAphJtUQWYE0JOMbboZSL9nmyyBnsOTtHXDxpD0guDehRU7hBnGN1kR0D3zP7MVb75f1ldqlv2Xe6QQVVrr4zDRDKrpbSJ3xzp99O9tK-sMnxKynzH2MPe5HU3C5RS2g2kiz3Hf0BKIwsEy207YS2oesGTBsw/s1600/timeline.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;i&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Compose highlights over the years&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;h2 style="text-align: left;"&gt;Looking back&lt;/h2&gt;&lt;p style="text-align: left;"&gt;The beginnings of Compose were very different from what you know today. Two projects were happening in parallel inside the Android team.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;At the time, the Views toolkit team was thinking of unbundling the UI Toolkit into a library to help with development speed, and make it easier for developers to adopt and control updates. Meanwhile, a team was working on a novel idea to build declarative layouts by embedding XML inside Kotlin, which looked something like this:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2MclbgogkD1Ofd5aD6Y1SuoWOQM_Yp7kJHGwxWZ1VMPsH8xxe7BHRUFXQgZqGzyECAvwSHkh9ZAk7350DxuzGyKQkkzqzMTnoWMycVuTXnmZ17WHRS9PHHst-mcA2_D_ofSdOVvxHWv8J3b4i92qZ5jJCvOUigN3Vmh4mHFSEnZtsi9DRRkMfQIgg6h8/s2560/jetpack_compose_early_code.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1440" data-original-width="2560" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2MclbgogkD1Ofd5aD6Y1SuoWOQM_Yp7kJHGwxWZ1VMPsH8xxe7BHRUFXQgZqGzyECAvwSHkh9ZAk7350DxuzGyKQkkzqzMTnoWMycVuTXnmZ17WHRS9PHHst-mcA2_D_ofSdOVvxHWv8J3b4i92qZ5jJCvOUigN3Vmh4mHFSEnZtsi9DRRkMfQIgg6h8/s1600/jetpack_compose_early_code.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Those two efforts merged to produce what you know today - a fully declarative UI Toolkit that utilizes the power of a compiler plugin, runtime, and Kotlin:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@Composable
fun Newsfeed(stories: List&amp;lt;Story&amp;gt;) {
    LazyColumn {
        items(stories) { story -&amp;gt;
            Card {
                val author = story.author
                Image(painterResource(author.profilePhoto),
                    contentDescription = author.name)
                Text(author.name)
                Text(story.content)
                if (story.hasCommentsEnabled()) {
                    for(comment in story.comments) {
                        Text(comment.mainContent)
                    }
                }
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p style="text-align: left;"&gt;And you, the community, helped us very early on! Before 2021, Compose had a pre-alpha phase, which helped ensure Compose was fit to solve the problems of our developers.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;One of our favorite memories is the Android Dev Challenge. We challenged the community to build four different tasks with Compose, filling our feeds with Puppy apps, clocks, and weather apps, and giving us a ton of direct feedback that helped shape the 1.0 release.&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center; width: 100%;"&gt;
  &lt;div style="height: 0px; max-width: 100%; overflow: hidden; padding-bottom: 56.25%; position: relative;"&gt;
    &lt;iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/9AAmOcgdA2s" style="border: 0; height: 100%; left: 0; position: absolute; top: 0; width: 100%;" width="320" youtube-src-id="9AAmOcgdA2s"&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p style="text-align: left;"&gt;Compose has continued to evolve, from launching with a set of Material 2 components to now supporting &lt;a href="https://m3.material.io/blog/building-with-m3-expressive" target="_blank"&gt;Material 3 Expressive&lt;/a&gt;.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXwWhSDIyKO9B9ZUFvjOiIvotw-uC2maZp71vl3qC8GFk01I_xg00AY0JtqZHtAsRofj2G8i-zNG9odM31EWc4mGs00kTvjvfzuX0jD8-2kG4mASj6mFOJOCABsD5c9b4FUXjJZCmgx0hoK1xkGWfVx6ds64JXk2vLVuVO3Xz2zhzrkFrMTXlSJnCAai0/s1064/material2.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="784" data-original-width="1064" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXwWhSDIyKO9B9ZUFvjOiIvotw-uC2maZp71vl3qC8GFk01I_xg00AY0JtqZHtAsRofj2G8i-zNG9odM31EWc4mGs00kTvjvfzuX0jD8-2kG4mASj6mFOJOCABsD5c9b4FUXjJZCmgx0hoK1xkGWfVx6ds64JXk2vLVuVO3Xz2zhzrkFrMTXlSJnCAai0/w400-h295/material2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;Material 2 in Compose&lt;/i&gt;&lt;/div&gt;&lt;i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" data-original-height="686" data-original-width="1342" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtmkVTKomIpyOR2aAls-hmHJ95o5jgjkGC3a3YeVzNlu9IlNI624el3d_b5somGHvsVIGLkQC5n9bcxci1jXm-1wF_WwHler0XcYNlZgEKs8N_8vBJsweBc5Ev8io-Y9xwxchl7YPXJp7XFc0O99z0nwR0R-poiuztvv9ep9pup6ePghH19WuQri_eMsQ/s1600/m9d3dbjl-00_Hero%20Expressive%20New_Export.gif" /&gt;&lt;i&gt;Material 3 Expressive in Compose&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/i&gt;&lt;h2 style="text-align: left;"&gt;Looking ahead&lt;/h2&gt;
&lt;p style="text-align: left;"&gt;As of today, Compose 1.11 is the latest version with 1.12 coming soon, offering so much more than 1.0, 5 years ago. This year, we introduced  more adaptive APIs, such as &lt;code&gt;&lt;a href="https://developer.android.com/develop/adaptive-apps/guides/flexbox"&gt;FlexBox&lt;/a&gt;&lt;/code&gt;, &lt;code&gt;&lt;a href="https://developer.android.com/develop/adaptive-apps/guides/grid"&gt;Grid&lt;/a&gt;&lt;/code&gt;, &lt;code&gt;&lt;a href="https://developer.android.com/develop/adaptive-apps/guides/mediaquery"&gt;MediaQuery&lt;/a&gt;&lt;/code&gt;, and &lt;a href="https://developer.android.com/develop/ui/compose/styles"&gt;Styles&lt;/a&gt;. These APIs let you advance to the next level of premium, adaptive UI development with Compose.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;At Google I/O 2026, we announced that we are now &lt;a href="https://developer.android.com/develop/ui/compose/first"&gt;Compose-first&lt;/a&gt;, meaning that all future UI development will happen only in Compose, while the Views toolkit enters maintenance mode. Material Design is also &lt;a href="https://m3.material.io/blog/material-is-compose-first" target="_blank"&gt;shifting focus&lt;/a&gt; entirely to Compose, signaling an end to the &lt;code&gt;findViewById era&lt;/code&gt;.&lt;/p&gt;

&lt;h2 style="text-align: left;"&gt;Community is at the heart of Compose&amp;nbsp;&lt;/h2&gt;
&lt;p style="text-align: left;"&gt;Over the years, you’ve inspired us with creative examples of how you’ve used Compose, and we’d love to highlight a few more examples of where we’ve seen exciting work. JetBrains has been a great partner for Google with Compose, expanding Compose to work across platforms with &lt;a href="https://kotlinlang.org/compose-multiplatform/" target="_blank"&gt;Compose Multiplatform&lt;/a&gt; and enabling desktop, iOS, and web developers to also enjoy the benefits of Compose.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;We’ve really enjoyed following our most beloved newsletters from &lt;a href="https://www.jetpackcompose.app/newsletter" target="_blank"&gt;JetpackCompose.app’s Dispatch&lt;/a&gt;,  &lt;a href="https://androidweekly.net/" target="_blank"&gt;AndroidWeekly&lt;/a&gt;, to&lt;a href="https://jetc.dev/" target="_blank"&gt; jetc&lt;/a&gt; - helping Android Developers stay up-to-date with the latest in the world of Compose and Android.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Another standout contributor is &lt;a href="https://www.sinasamaki.com/"&gt;sinasamaki&lt;/a&gt;. They’ve created many delightful experiences using Compose, such as this fun ribbon modifier and the glitchy effect:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhULTmBhLhA3t_xyz4cyCcVjxnF4_kCxoQh5ndyzOwMOVDhhsiDSZwINKcpLlxJm1usnULmoMNVRCO8HqSFfHcm6yCkAfqnhyphenhyphengjavPuxlYnoNwtDiUnWsC0aNqphG6to5J1FWsLnvato0l3mlc1YOcxXFrXZ-gEqL58BCR4oHzPRCCjFaGOngvQlwg_65s/s1282/glitch%20(1).gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="718" data-original-width="1282" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhULTmBhLhA3t_xyz4cyCcVjxnF4_kCxoQh5ndyzOwMOVDhhsiDSZwINKcpLlxJm1usnULmoMNVRCO8HqSFfHcm6yCkAfqnhyphenhyphengjavPuxlYnoNwtDiUnWsC0aNqphG6to5J1FWsLnvato0l3mlc1YOcxXFrXZ-gEqL58BCR4oHzPRCCjFaGOngvQlwg_65s/s320/glitch%20(1).gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCyqX6q5ZTclPBK-WChrNnNQlQ96ysOddRQeDQbtEji4u1DzbuPDIN7Xpov6QCZ-gjVMLlIKHr_3v_D0ZZKJQuEAe3M3Q24LbKxcz9jyk9tulTi-YBMwC0mOJSP0PVebWn-LJO15AT77t6Gp70VUcsiwz8U04w5tEN9pAbOqlobAw7hYe4Uuz7taGm_6w/s990/ribbon_modifier_sinasamaki.gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="990" data-original-width="990" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCyqX6q5ZTclPBK-WChrNnNQlQ96ysOddRQeDQbtEji4u1DzbuPDIN7Xpov6QCZ-gjVMLlIKHr_3v_D0ZZKJQuEAe3M3Q24LbKxcz9jyk9tulTi-YBMwC0mOJSP0PVebWn-LJO15AT77t6Gp70VUcsiwz8U04w5tEN9pAbOqlobAw7hYe4Uuz7taGm_6w/s320/ribbon_modifier_sinasamaki.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;&lt;a href="https://github.com/saket" target="_blank"&gt;Saket Narayan&lt;/a&gt; has also always been an inspiration when it comes to creating useful tools for Compose, such as &lt;a href="https://github.com/saket/telephoto" target="_blank"&gt;telephoto&lt;/a&gt;, a library featuring support for pan and zoom gestures and automatic sub-sampling of large images, or the latest library, &lt;a href="https://github.com/saket/touch-robot" target="_blank"&gt;Touch Robot&lt;/a&gt;, which allows you to easily test interaction animations:&lt;/p&gt;

&lt;table border="1" style="border-collapse: collapse; table-layout: fixed; width: 100%;"&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style="box-sizing: border-box; padding: 10px; vertical-align: top; width: 50%;"&gt;
        &lt;pre style="margin: 0px; white-space: pre-wrap; word-break: break-word;"&gt;&lt;code&gt;paparazzi.gif(end = 3_000) {
  DebitCard(
    Modifier.testTag("card")
  )

  val touchRobot = rememberTouchRobot()
  LaunchedEffect(Unit) {
    touchRobot.onNode(hasTestTag("card")).performGesture {
      draw(
        path = createAndroidHeadPath(),
        duration = 3.seconds,
      )
    }
  }
}

/** A path drawing the Android head. */
fun createAndroidHeadPath(bounds: Rect): Path = TODO()&lt;/code&gt;&lt;/pre&gt;
      &lt;/td&gt;
      &lt;td style="box-sizing: border-box; padding: 10px; vertical-align: top; width: 50%;"&gt;
        &lt;div class="separator" style="clear: both;"&gt;
          &lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBz8urkhKEeFAuw1Xm4-pVS9PxZmAkaAx9c2IB6U5ZeVhVkwLqUeBmTjtA6zzbZAMzvZVYqw4tLIh2pVRJWy5J8SEu24LW5rDdpnJYpMYqYy-fGkGXQ4p6wryqpeFFdBlNkIx_TITAsYqreNKluyEZpTlH6Gr48nmltIZie5bkDmpd82qJx0FxsK0k1dk/s461/saket_touch_robot.gif" style="display: block; padding: 1em 0px; text-align: center;"&gt;
            &lt;img alt="" border="0" data-original-height="349" data-original-width="461" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBz8urkhKEeFAuw1Xm4-pVS9PxZmAkaAx9c2IB6U5ZeVhVkwLqUeBmTjtA6zzbZAMzvZVYqw4tLIh2pVRJWy5J8SEu24LW5rDdpnJYpMYqYy-fGkGXQ4p6wryqpeFFdBlNkIx_TITAsYqreNKluyEZpTlH6Gr48nmltIZie5bkDmpd82qJx0FxsK0k1dk/s400/saket_touch_robot.gif" style="height: auto; max-width: 100%;" /&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p style="text-align: left;"&gt;&lt;a href="https://jakewharton.com/" target="_blank"&gt;Jake Wharton&lt;/a&gt;, who has used Compose in innovative ways (like &lt;a href="https://github.com/cashapp/molecule" target="_blank"&gt;molecule&lt;/a&gt;, and even building UI with Compose for the terminal with &lt;a href="https://github.com/JakeWharton/mosaic" target="_blank"&gt;mosaic&lt;/a&gt;). &lt;a href="https://chrisbanes.me/" target="_blank"&gt;Chris Banes&lt;/a&gt;, who has built many Compose libraries over the years, with our most recent favourite - &lt;a href="https://github.com/chrisbanes/haze" target="_blank"&gt;Haze&lt;/a&gt; for background blurring, and many of the &lt;a href="https://developers.google.com/community/experts" target="_blank"&gt;Android Google Developer Experts&lt;/a&gt; like &lt;a href="https://github.com/AkshayChordiya" target="_blank"&gt;Akshay Chordiya&lt;/a&gt;, &lt;a href="https://www.randomlytyping.com/" target="_blank"&gt;Huyen Tue Dao&lt;/a&gt;, and &lt;a href="https://katiebarnett.dev/" target="_blank"&gt;Katie Barnett&lt;/a&gt;, who’ve contributed to the success of Compose. But this is not about selecting individuals - there have been so many great contributors to the Compose codebase, and many of you continue to inspire us with your fun examples, libraries, and in-depth talks.  Without the community, Jetpack Compose wouldn’t be as successful as it is today.&lt;/p&gt;

&lt;h2 style="text-align: left;"&gt;Cheers to the next 5 years, and more!&amp;nbsp;&lt;/h2&gt;
&lt;p style="text-align: left;"&gt;Jetpack Compose has grown from an experimental idea into the standard for Android UI Development. Thank you to the entire Toolkit team at Google, and to the incredible global developer community that wrote libraries, filed bugs, and pushed the boundaries of what declarative UI can do.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;This week, we’ll be celebrating with some in-person birthday parties across the globe, and a live “Birthday party” on the &lt;a href="https://www.youtube.com/user/androiddevelopers" target="_blank"&gt;Android Developers YouTube channel&lt;/a&gt; on July 30th at 13:00 UTC.  During this time, we’ll hang out and discuss Compose and answer your questions!&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Cheers to the next 5 years, and happy composing!&lt;/p&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/8693766666920532872/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/five-years-of-jetpack-compose.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8693766666920532872" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8693766666920532872" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/five-years-of-jetpack-compose.html" rel="alternate" title="Celebrating 5 years of Jetpack Compose" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqdSbNmK_9vJR4DQPvGN0oUtQK8s0T2HsgPAsNsl9Kqvd49M3ODh7wlGPZrCRVHEC30oArKNrqmLtuO-zwoZHkfN3_AQz2NNBG6S1st34TOCYx9Mu9cM-ut-rSN8-U1o9Q4ufBwY1l3ukPRjw8QxHWdpxAeeoKRVDPvEjysPwORA3TRhbtpMyTctDQsdY/s72-c/Jetpack%20compose_Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-1305649857865852540</id><published>2026-07-27T06:00:00.000-07:00</published><updated>2026-07-27T21:48:52.868-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android Gradle Plugin"/><category scheme="http://www.blogger.com/atom/ns#" term="app performance"/><category scheme="http://www.blogger.com/atom/ns#" term="atomic"/><category scheme="http://www.blogger.com/atom/ns#" term="Compose"/><category scheme="http://www.blogger.com/atom/ns#" term="Coroutines"/><category scheme="http://www.blogger.com/atom/ns#" term="R8"/><title type="text">How R8 made Kotlin Coroutines on Android 2x faster</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHiv_LIAZ9QEJ4RWJSvZphTWmkDaVoseyWsbSPkfJDKd0DXjq53xtLOMiVtTEzlW6dAwXUlcucsBDKxjp9MjET4MB1b4ymZkd-b7jhm-PczdvyFqQCpZ39MXVjaVrWg4Y6WD4KLYOL3PbmYBDumMULpZQDX0052163RVUWZnfUAUPFtfwZMVflqjT9AnQ/s2469/0707%20Faster%20Kotlin%20coroutines%20on%20Android%20with%20R8_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHiv_LIAZ9QEJ4RWJSvZphTWmkDaVoseyWsbSPkfJDKd0DXjq53xtLOMiVtTEzlW6dAwXUlcucsBDKxjp9MjET4MB1b4ymZkd-b7jhm-PczdvyFqQCpZ39MXVjaVrWg4Y6WD4KLYOL3PbmYBDumMULpZQDX0052163RVUWZnfUAUPFtfwZMVflqjT9AnQ/s2469/0707%20Faster%20Kotlin%20coroutines%20on%20Android%20with%20R8_Meta.png" style="display: none;" /&gt;&lt;i&gt;Posted by Andrei Shikov, Senior Software Engineer, Android Toolkit and Jonathan Starup, Software Engineer, R8 Team&lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYQ0hvP8noS5d46xLL2ca89fUyDM7ONaSVUIn8QhZxuB8GKNdGi_IIQNt3c8dAT67nO1TMfcPrmXMXfBjggYafmHV6cYH86vFyoEnIEgaFJ2uOYQIH4l9zA4GlQvduoJEVUNzIUX1qJmaxY3qRGn9TKwuRD_HR87trMxuaU0x29FXcx7Pr-DdP0ZhxZhQ/s8582/0707%20Faster%20Kotlin%20coroutines%20on%20Android%20with%20R8_Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2601" data-original-width="8582" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYQ0hvP8noS5d46xLL2ca89fUyDM7ONaSVUIn8QhZxuB8GKNdGi_IIQNt3c8dAT67nO1TMfcPrmXMXfBjggYafmHV6cYH86vFyoEnIEgaFJ2uOYQIH4l9zA4GlQvduoJEVUNzIUX1qJmaxY3qRGn9TKwuRD_HR87trMxuaU0x29FXcx7Pr-DdP0ZhxZhQ/s1600/0707%20Faster%20Kotlin%20coroutines%20on%20Android%20with%20R8_Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;Starting from AGP 9.2.0, R8 optimizes most &lt;code&gt;Atomic*FieldUpdater&lt;/code&gt; calls into &lt;code&gt;Unsafe&lt;/code&gt; variants that perform &lt;a href="https://github.com/Kotlin/kotlinx.coroutines/issues/3950"&gt;2x to 4x better on common operations&lt;/a&gt;. This has a particularly large impact on the kotlinx.atomicfu library that implements atomics for &lt;code&gt;kotlinx.coroutines&lt;/code&gt;, making launching and cancelling coroutines up to 2x faster. In order to get the benefits, update your AGP to 9.2.0 or above.&lt;/p&gt;

&lt;p&gt;With the majority of Android apps adopting Kotlin as their main language of choice, &lt;code&gt;&lt;a href="https://github.com/Kotlin/kotlinx.coroutines" target="_blank"&gt;kotlinx.coroutines&lt;/a&gt;&lt;/code&gt; has become a de-facto standard for asynchronous programming. The library offers a well-designed and structured way of managing concurrent flows that is native to Kotlin. Jetpack Compose was no exception, adopting coroutines for managing pointer events, animations and other interactions. At the time of writing, most concurrent APIs in Compose call &lt;code&gt;suspend&lt;/code&gt; functions under the hood and are launching and/or cancelling coroutines to handle updates.&lt;/p&gt;

&lt;p&gt;As the Compose team started to investigate performance, coroutines were discovered to be a bottleneck for many operations that happen outside of composition. As an example, 80% of the time spent on creating and updating &lt;code&gt;Modifier.clickable&lt;/code&gt; was consumed by launching and cancelling internal coroutines that handled &lt;code&gt;InteractionSource&lt;/code&gt; updates. Based on those observations, much of early performance work was focused on removing coroutines from the default path and delaying initialization until necessary.&lt;/p&gt;

&lt;h2&gt;The cost of a coroutine&lt;/h2&gt;

&lt;p&gt;The easiest way to analyze a function's internal behavior on Android is to capture an Android Runtime (ART) method trace. An ART method trace is a tool that records the execution flow of an app, showing exactly which methods are called, their order, and how much time is spent in each, allowing developers to identify performance bottlenecks. For an empty &lt;code&gt;LaunchedEffect { }&lt;/code&gt; call, it would look something like this:&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtNkPVicdJLFrYlTBtffjL73QsWm8LztGzRCLSVrzpHy-FiyMEcOIJPkDYAjUKI0ZAgQDgATjjZXIcmjZlf7iusLjC9E5F6GaIPMvZbTh1hP4N7OsnUPgkz5atS5PcsrPh5ulpSAqJ9K8T6eviqTwy4NB5zMu8HAnBZgK2PaZwX3ajJFXSRuoH35T4TZk/s7680/pic01_enhanced.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="3432" data-original-width="7680" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtNkPVicdJLFrYlTBtffjL73QsWm8LztGzRCLSVrzpHy-FiyMEcOIJPkDYAjUKI0ZAgQDgATjjZXIcmjZlf7iusLjC9E5F6GaIPMvZbTh1hP4N7OsnUPgkz5atS5PcsrPh5ulpSAqJ9K8T6eviqTwy4NB5zMu8HAnBZgK2PaZwX3ajJFXSRuoH35T4TZk/s1600/pic01_enhanced.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: center;"&gt;&lt;i&gt;LaunchedEffect method trace visualized in the Perfetto UI&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;The method trace above can be separated into three parts:&lt;br /&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;
Initializing a new coroutine&lt;/li&gt;&lt;li&gt;
Starting coroutine&lt;/li&gt;&lt;li&gt;
Completing coroutine (because it exits immediately)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Cancelling &lt;code&gt;LaunchedEffect&lt;/code&gt; is similar to normal completion, except it also creates a &lt;code&gt;CancellationException&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From the profile above, one thing that is immediately suspicious is frequent calls into &lt;code&gt;java.util.concurrent.AtomicReferenceFieldUpdater&lt;/code&gt; (purple or green boxes with j… labels). While each call is relatively fast, the frequency is concerning; any non-negligible overhead that is spread out across multiple invocations might add up to a noticeable regression. Zooming in on a call reveals that most of the time is spent on... reflection checks?&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirqmZk8TeN6KsUrqnCFT_AigbT3IdjfMDxabgQEM7izThyphenhyphenubMyvsFzkd3zR6SSxfvovJb5QeaoeIYPG9pFoNCegLDizYwfTOnKFv9sWfp1whDlFB9gUf3VMS9qU2-smyKEHrmsrPlN4htYxmLQ3yGfgZlWzjpwi6nTXbTcghvutTmJQjSo2s9c8xG-LOM/s13034/pic02-enhanced.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="4102" data-original-width="13034" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirqmZk8TeN6KsUrqnCFT_AigbT3IdjfMDxabgQEM7izThyphenhyphenubMyvsFzkd3zR6SSxfvovJb5QeaoeIYPG9pFoNCegLDizYwfTOnKFv9sWfp1whDlFB9gUf3VMS9qU2-smyKEHrmsrPlN4htYxmLQ3yGfgZlWzjpwi6nTXbTcghvutTmJQjSo2s9c8xG-LOM/s1600/pic02-enhanced.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;An up-close look at the method trace of AtomicReferenceFieldUpdater.get during LaunchedEffect initialization&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Coroutines implement a lock-free tree structure for parent-child relationships that makes structured concurrency possible. Turns out, the &lt;code&gt;kotlinx.atomicfu&lt;/code&gt; library implements lock-free atomic operations using a well-known JVM primitive, &lt;code&gt;&lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.html" target="_blank"&gt;AtomicReferenceFieldUpdater&lt;/a&gt;&lt;/code&gt;. The updater uses a class reference and a field name to perform atomic operations at runtime, and it has to run several reflective safety checks to make sure the field exists and is accessible. Each operation in coroutines (starting, suspending, cancelling, completing) calls at least one atomic operation, so if it is slow, coroutines will not perform well.&lt;/p&gt;

&lt;h2&gt;Investigating AtomicReferenceFieldUpdater&lt;/h2&gt;

&lt;p&gt;But let's not get ahead of ourselves. &lt;code&gt;AtomicReferenceFieldUpdater&lt;/code&gt; is actually well-optimized on JVM &lt;a href="https://shipilev.net/blog/2015/faster-atomic-fu/"&gt;for over 10 years now&lt;/a&gt;, and method traces might capture overhead that is completely removed by a VM level optimization: just-in-time (JIT) or ahead-of-time (AOT) compilations. To verify performance, let's write a few benchmarks to measure the difference between atomic references from &lt;code&gt;kotlinx.atomicfu&lt;/code&gt; and &lt;code&gt;java.util.concurrent.atomic&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@RunWith(AndroidJUnit4::class)
class AtomicReferenceBenchmark {
    @get:Rule
    val benchmarkRule = BenchmarkRule()
    
    private val atomicReference = java.util.concurrent.atomic.AtomicReference(false)
    private val atomicRef = kotlinx.atomicfu.atomic&amp;lt;Boolean&amp;gt;(false)
    
    @Test
    fun atomicReference_compareAndSet() {
        benchmarkRule.measureRepeated { 
            atomicReference.compareAndSet(true, false)
            atomicReference.compareAndSet(false, true)
        }
    }

     @Test
    fun atomicRef_compareAndSet() {
        benchmarkRule.measureRepeated {
            atomicRef.compareAndSet(true, false)
            atomicRef.compareAndSet(false, true)
        }
    }

    /* measuring other methods from the method traces above */
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Running this benchmark on a Pixel 5 (while ensuring &lt;code&gt;AtomicReferenceFieldUpdater#compareAndSet&lt;/code&gt; is JIT compiled during warmup), yields the following results on Pixel 5 (API 33):&lt;br /&gt;
&lt;/p&gt;&lt;pre&gt;&lt;code&gt; 50.7 ns  atomicReference_compareAndSet
135   ns  atomicRef_compareAndSet
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The measurements confirm the gap, with &lt;code&gt;kotlinx.atomicfu&lt;/code&gt; version clearly being approximately 2.7x slower. This confirms that ART does not perform any hidden optimization and reflective access checks add real overhead during runtime.&lt;/p&gt;

&lt;p&gt;Looking back at the original method trace, the only meaningful work performed by the &lt;code&gt;AtomicReferenceFieldUpdater&lt;/code&gt; is the internal call into &lt;code&gt;Unsafe.getObjectVolatile&lt;/code&gt; that actually executes the underlying atomic operation. In most cases, the updater initializer is static, and can be proved to be always correct based on the structure of the surrounding class. Thus, one could statically analyze most of the &lt;code&gt;AtomicReferenceFieldUpdater&lt;/code&gt; usages and replace them with an internal &lt;code&gt;Unsafe&lt;/code&gt; variant during compilation. It also just happens that Android build toolchain has its very own optimizing compiler that can do exactly that.&lt;/p&gt;

&lt;h2&gt;Optimization with R8&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Atomic*FieldUpdater&lt;/code&gt; classes support subtle, dynamic and reflection-based use,  but are often used in statically obvious patterns. This both explains the slow baseline performance and the want for optimization. R8 is a full-program optimizing compiler and is well-suited to see through the simpler patterns to skim the overhead of the reflective safety checks. R8 receives JVM bytecode after the Java or the Kotlin compiler, but to ease readability these examples are presented in Java syntax. This is why there are no type arguments for &lt;code&gt;AtomicReferenceFieldUpdater&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Example {
    volatile String data = "";
    static final AtomicReferenceFieldUpdater updater =
        AtomicReferenceFieldUpdater.newUpdater(Example.class, String.class, "data");

    void example() {
        // ...
        updater.compareAndSet(this, "", "new");
        // ...
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The base example creates a static final updater which accesses a volatile field with simple constant arguments for the holder, the type, and the name of the field. The reflection used is totally transparent. It is clear to see this updater references a valid field and that the site of the updater creation has valid access to the field.&lt;/p&gt;

&lt;p&gt;In its essence, &lt;code&gt;Atomic*FieldUpdater&lt;/code&gt; is a wrapper around a field offset and calls to &lt;code&gt;Unsafe&lt;/code&gt;. The best case scenario for the optimization is to replace the updater field with an offset field and replace the updater calls with calls to &lt;code&gt;Unsafe&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Optimizing Atomic*FieldUpdater&lt;/h3&gt;

&lt;p&gt;The optimization is implemented in three parts: Instrumentation, Replacement, and Clean-up.&lt;/p&gt;

&lt;h2&gt;Instrumentation&lt;/h2&gt;

&lt;p&gt;The first step is to introduce offset fields alongside the updater field in order to facilitate direct access via the &lt;code&gt;Unsafe&lt;/code&gt; call.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;static final long updater$offset =
    SyntheticUnsafe.UNSAFE.objectFieldOffset(Example.class.getDeclaredField("data"))&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The field is accessed via reflection, and &lt;code&gt;Unsafe&lt;/code&gt; is used to extract the field offset on the class. This code represents the internals of &lt;code&gt;Atomic*FieldUpdater&lt;/code&gt; if you disregard reflection validation. Instead, the holder type of the updater and the field type of the volatile field are tracked statically in the compiler.&lt;/p&gt;

&lt;p&gt;Note that the original field and its initialization are left as-is. The optimization process optimistically facilitates and optimizes uses and then later cleans up. This is a simple approach to the implementation but also allows partial optimization of updater fields, where some uses are left as they were while others are optimized.&lt;/p&gt;

&lt;h2&gt;Replacement&lt;/h2&gt;

&lt;p&gt;At this point in the compiler, after a suitable concurrency join point, we have a list of instrumented updater fields. This means that we can optimize each call site individually based on a few conditions. Consider an example call:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;updater.compareAndSet(holder, expectedValue, newValue);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The conditions that &lt;code&gt;Atomic*FieldUpdater&lt;/code&gt; requires are these:&lt;br /&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;
  Does &lt;code&gt;updater&lt;/code&gt; come from an instrumented field? That is, can static analysis track the value of the object back to a field read of an instrumented updater?&lt;/li&gt;&lt;li&gt;
  Is &lt;code&gt;holder&lt;/code&gt; the same class or a subclass of the originally defined holder type?&lt;/li&gt;&lt;li&gt;
  Is &lt;code&gt;newValue&lt;/code&gt; the same class or a subclass of the originally defined field type?&lt;/li&gt;&lt;/ul&gt;
  If all conditions are met, then the call is replaced by a call to &lt;code&gt;Unsafe&lt;/code&gt; without any of the reflection checks.&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SyntheticUnsafe.UNSAFE.compareAndSwapObject(holder, Example.updater$offset, expectedValue, newValue)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This new call is faster and simpler but it differs from the original call in regards to its handling of null values in &lt;code&gt;updater&lt;/code&gt; and &lt;code&gt;holder&lt;/code&gt;. Unless statically ruled out, null-checks are inserted for both.&lt;/p&gt;

&lt;h2&gt;Clean-up&lt;/h2&gt;

&lt;p&gt;At this point, the holding class has the original updater field and the new offset field along with call sites that might use either one of the two. If  none of the call sites were optimized, then the offset field should be removed and if all of the call sites were optimized, then the updater field should be removed. In both cases the initializing call should also be deleted. The deletion of unused fields and removal of dead code is already done in the compiler, but removing the initializing code here requires a few more tricks.&lt;/p&gt;

&lt;p&gt;Both the call to &lt;code&gt;newUpdater&lt;/code&gt; and &lt;code&gt;getDeclaredField&lt;/code&gt; might have side effects as they can throw exceptions (and their implementation is also unknown since it depends on the API version). This means that by generic optimization, they cannot safely be removed. So this clean-up required explicit consideration of the instrumented fields, since those are statically known to be free of exceptions.&lt;/p&gt;

&lt;p&gt;In the end, the simple updater example shown above looks like this after optimization:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Example {
    volatile String data = "";
    static final long updater$offset =
        SyntheticUnsafe.UNSAFE.objectFieldOffset(Example.class.getDeclaredField("data"))

    void example() {
        // ...
        SyntheticUnsafe.UNSAFE.compareAndSwapObject(this, Example.updater$offset, "", "new")
        // ...
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Results&lt;/h3&gt;

&lt;p&gt;After these optimizations, &lt;code&gt;kotlinx.atomicfu&lt;/code&gt; and most explicit uses of &lt;code&gt;AtomicInt/Long/ReferenceFieldUpdater&lt;/code&gt; now match &lt;code&gt;AtomicReference&lt;/code&gt; performance with R8 applied. In fact, it is even faster in some benchmarks; &lt;code&gt;kotlinx.atomicfu&lt;/code&gt; has a compiler plugin that can inline &lt;code&gt;atomic&lt;/code&gt; instances into fields, reducing allocations required to create an atomically updated field.&lt;/p&gt;

&lt;p&gt;Jetpack Compose was the main beneficiary of this work. Compose runtime has a number of microbenchmarks that track coroutine performance very closely to catch performance regressions early. When the benchmarks were updated to a new version of R8, we noticed a 2x improvement when launching and cancelling coroutines in &lt;code&gt;LaunchedEffect&lt;/code&gt;!&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5VYYOudfoQzHlELVMmmiLkRxUd80bqzqB8ykvBedO0VpCROTeK63gXhyphenhyphenYZWed99FWOFl58qqj34aQP9GLPJGW_Ls2w5ez0o-TIOqdt9hlIn5NFmpT7N83sKuhnCdbazdVSFcz0h2e4Zu12GCaW_ss9t-7v7t9J26WgqKpIWUyCkKz4X8L95H2fYjA6i0/s9600/pic03_enhanced.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="5580" data-original-width="9600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5VYYOudfoQzHlELVMmmiLkRxUd80bqzqB8ykvBedO0VpCROTeK63gXhyphenhyphenYZWed99FWOFl58qqj34aQP9GLPJGW_Ls2w5ez0o-TIOqdt9hlIn5NFmpT7N83sKuhnCdbazdVSFcz0h2e4Zu12GCaW_ss9t-7v7t9J26WgqKpIWUyCkKz4X8L95H2fYjA6i0/s1600/pic03_enhanced.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;div style="text-align: center;"&gt;&lt;i&gt;Benchmark graph illustrating the time taken when starting and cancelling coroutines in LaunchedEffect (lower is better). The change in the graph corresponds to an R8 update, showcasing 2x improvement.&lt;/i&gt;&lt;/div&gt;

&lt;p&gt;Aside from that, the ART team is implementing these optimizations natively at the VM level. If your app is targeting API 37 and is running on a recent version of Android, it is possible that your device is already optimizing coroutines in a similar way. The coroutine benchmarks above observed ~15% improvement in performance after JIT updates in the recent versions of ART.&lt;/p&gt;

&lt;p&gt;Your app will receive this optimization by default when upgrading to AGP 9.2.0 or by using R8 9.2.0 directly. For more information, see &lt;a href="https://r8.googlesource.com/r8/+/refs/heads/main/README.md#replacing-r8-in-agp" target="_blank"&gt;D8 dexer and R8 shrinker&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</content><link href="http://android-developers.googleblog.com/feeds/1305649857865852540/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/how-r8-made-kotlin-coroutines-2x-faster.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/1305649857865852540" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/1305649857865852540" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/how-r8-made-kotlin-coroutines-2x-faster.html" rel="alternate" title="How R8 made Kotlin Coroutines on Android 2x faster" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHiv_LIAZ9QEJ4RWJSvZphTWmkDaVoseyWsbSPkfJDKd0DXjq53xtLOMiVtTEzlW6dAwXUlcucsBDKxjp9MjET4MB1b4ymZkd-b7jhm-PczdvyFqQCpZ39MXVjaVrWg4Y6WD4KLYOL3PbmYBDumMULpZQDX0052163RVUWZnfUAUPFtfwZMVflqjT9AnQ/s72-c/0707%20Faster%20Kotlin%20coroutines%20on%20Android%20with%20R8_Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-7230493561349571062</id><published>2026-07-22T12:00:00.000-07:00</published><updated>2026-07-22T12:06:26.700-07:00</updated><title type="text">Optimize your apps for the next generation of Samsung Galaxy devices</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV-c747avSj9Z8JO4DTK4kSfO3SjSpd5aTuVvR_TBeD3bXV6cc8lzNLGrWCngNXdyZBeiNjQqwQZCcU4QCrovwL99gu0t5bQrlTXa0PIBGIivwyS8y226MgeraphZr4VITWYe0x7ckFto0dsD8rBLM1J_P3dV0CBj5Ctlwm8jsgAPZA7W2XnKnRz59H9I/s2049/MM_Adaptive_and_device_Meta%20(1).png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV-c747avSj9Z8JO4DTK4kSfO3SjSpd5aTuVvR_TBeD3bXV6cc8lzNLGrWCngNXdyZBeiNjQqwQZCcU4QCrovwL99gu0t5bQrlTXa0PIBGIivwyS8y226MgeraphZr4VITWYe0x7ckFto0dsD8rBLM1J_P3dV0CBj5Ctlwm8jsgAPZA7W2XnKnRz59H9I/s2049/MM_Adaptive_and_device_Meta%20(1).png" style="display: none;" /&gt;&lt;div&gt;



&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;Posted by Fahd Imtiaz, Senior Product Manager and Miguel Montemayor, Developer Relations Engineer, Android Developer Experience&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGrEplk_My1fOfyw851kt92Jc2wyODN6bwWJaL5EGFV6_5grP3-pS7jrMzI4MOXgo1W1yVHcwj8J7AIO3olxlHDoNWxzTTlQLc9_D6CWB6bUtWLyvxmXN-JQQ92_HWYErsdMVuNkynTjXpZSKoaUTFiY_4aiffEDsfdCrl9om05MRVqqMac0YGExE4XLQ/s4210/MM_Adaptive_and_device_Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1254" data-original-width="4210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGrEplk_My1fOfyw851kt92Jc2wyODN6bwWJaL5EGFV6_5grP3-pS7jrMzI4MOXgo1W1yVHcwj8J7AIO3olxlHDoNWxzTTlQLc9_D6CWB6bUtWLyvxmXN-JQQ92_HWYErsdMVuNkynTjXpZSKoaUTFiY_4aiffEDsfdCrl9om05MRVqqMac0YGExE4XLQ/s1600/MM_Adaptive_and_device_Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;p&gt;Today at Galaxy Unpacked, Samsung &lt;a href="https://blog.google/products-and-platforms/platforms/android/galaxy-unpacked-2026" target="_blank"&gt;unveiled&lt;/a&gt; its latest lineup of foldable and wearable devices. For developers, this means that the variety of form factors, screen sizes, and device postures your app needs to support is expanding once again.&lt;/p&gt;

&lt;p&gt;With devices like the Galaxy Z Fold8, the ecosystem is expanding to include hardware with a landscape-first natural orientation and a wider aspect ratio in its main display state. Whether a user is unfolding a large display, flipping open a cover screen, or glancing at their wrist, users expect a flawless experience. To help you meet this moment, we’re sharing actionable guidance and new tooling updates to enable you to build adaptively proactively.&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/pLNJ-fNYTKU" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="pLNJ-fNYTKU"&gt;&lt;/iframe&gt;&lt;/div&gt;

&lt;h2&gt;Rethink layout architecture for dynamic displays, including ultra-wide foldables&lt;/h2&gt;

&lt;p&gt;Building for the latest foldables means dropping assumptions about display orientation and size. This is especially true for the Galaxy Z Fold8, which adopts an ultra-wide display, adding to the variety of aspect ratios to account for.&amp;nbsp; Devices with this landscape-first natural orientation show the limitations of hardcoded layout rules when users unfold the device. That’s why we’ve introduced &lt;a href="https://developer.android.com/develop/adaptive-apps/guides/foldables/trifolds-and-landscape-foldables" target="_blank"&gt;dedicated guidance for building for landscape foldables and trifolds.&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrdDMq9mmhR2NzEVD5cgQgT3Y5DgMZOV5FrjsJb-wSiZVvJjIiDQuUkfv0cjBHQMREjOKPqz9n6wPf-x5Hn6H7uT2_JiXA3Nykcr1UwnwDRK9jGFurhTRKR-5t1BN62ISXFznXhQ_e-03Mo6uIh5-BDVmNbA1Q4RY9rSg4VxBO0K6E6Dc4kViNpvuYefY/s1302/Samsung%20fold8%20phones.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="442" data-original-width="1302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrdDMq9mmhR2NzEVD5cgQgT3Y5DgMZOV5FrjsJb-wSiZVvJjIiDQuUkfv0cjBHQMREjOKPqz9n6wPf-x5Hn6H7uT2_JiXA3Nykcr1UwnwDRK9jGFurhTRKR-5t1BN62ISXFznXhQ_e-03Mo6uIh5-BDVmNbA1Q4RY9rSg4VxBO0K6E6Dc4kViNpvuYefY/s1600/Samsung%20fold8%20phones.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;To build a responsive UI that handles these physics seamlessly, focus on the following core pillars:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Build fluid, adaptive layouts: &lt;/b&gt;Wide aspect ratios and compact vertical heights require fluid UIs that scale responsively. Our updated &lt;a href="https://developer.android.com/design/ui/mobile/guides/layout-and-content/adapt-layout" target="_blank"&gt;adaptive design guidance&lt;/a&gt; advises considering the window class width first to determine layout changes, then adjusting for height. To let individual components fluidly adapt to the grid, structure your layout using flexible containers that allow your content to automatically wrap, span, and reflow. For design inspiration browse our &lt;a href="https://developer.android.com/design/ui/gallery/social/pawparazzi" target="_blank"&gt;adaptive sample app&lt;/a&gt; and &lt;a href="https://developer.android.com/design/ui/gallery/social/dual-screen?hl=en" target="_blank"&gt;dual-screen&lt;/a&gt; design galleries.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Track actual app space:&lt;/b&gt; Your app's display space rarely matches the physical device size, especially on an ultra-wide screen during multi-window, split-screen, or multitasking states. Sometimes even the orientations differ. Leverage &lt;a href="https://developer.android.com/develop/adaptive-apps/guides/use-window-size-classes?hl=en" target="_blank"&gt;Window Size Classes&lt;/a&gt; using the &lt;a href="https://developer.android.com/blog/posts/jetpack-window-manager-1-5-is-stable" target="_blank"&gt;Jetpack Window Manager library&lt;/a&gt; to calculate the exact space your app occupies.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
  
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/thfNTC9x_Ys" style="border: 0; height: 450px; width: 100%;" width="100%"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Leverage the latest Jetpack Compose Update: &lt;/b&gt;Start by adopting the stable &lt;a href="https://android-developers.googleblog.com/2026/04/jetpack-compose-april-2026-updates.html" target="_blank"&gt;Jetpack Compose April '26 release&lt;/a&gt; (&lt;a href="https://developer.android.com/develop/ui/compose/bom" target="_blank"&gt;Compose BOM&lt;/a&gt; version &lt;code&gt;2026.04.01&lt;/code&gt;).Take advantage of the new structural layout tools to manage complex architectures. The new &lt;a href="https://developer.android.com/develop/ui/compose/layouts/adaptive/grid" target="_blank"&gt;Grid&lt;/a&gt; API allows you to define dynamic tracks and column spans without the performance overhead of a lazy list. Pair Grid with the new &lt;a href="https://developer.android.com/develop/ui/compose/layouts/adaptive/flexbox" target="_blank"&gt;FlexBox&lt;/a&gt; layout API to easily handle multi-axis alignment and dynamic item wrapping. You can also use the new &lt;a href="https://developer.android.com/develop/ui/compose/layouts/adaptive/mediaquery" target="_blank"&gt;MediaQuery&lt;/a&gt; API to adapt your UI to its environment, using conditions to detect signals like device posture, window size, and keyboard types.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Make your app fold aware: &lt;/b&gt;Use the Jetpack WindowManager library, which provides an API surface for foldable device window features such as folds and hinges. When your app is&lt;a href="https://developer.android.com/develop/adaptive-apps/guides/foldables/make-your-app-fold-aware" target="_blank"&gt; fold aware&lt;/a&gt;, it can adapt its layout to avoid placing important content in the area of folds or hinges and use folds and hinges as natural separators.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Maintain app continuity:&lt;/b&gt; Avoid breaking the user journey when the device configuration shifts. Retain your UI state using &lt;a href="https://developer.android.com/topic/libraries/architecture/viewmodel?hl=en" target="_blank"&gt;ViewModel&lt;/a&gt; to ensure smooth transitions when a user folds or unfolds their device.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdxp09YbiUc9EzTGhIJ2fcoV67rLKb6Sm9UOVCISO4Xa0VVVnFUJG9PXSAYCq7gnHILLx8xoIx-L2C0blhugbADUa3nM0AOx8UQzGImu194B94Kt-CKAuK1CrGHUz10fBFs02Lmly-HO-fmBHFuZ9knuYRb6EP9v4-SpR7Ja-oeJZErJDUVEgEje0d7J8/s1920/7.22_MorphToTablet_Gif.gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1080" data-original-width="1920" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdxp09YbiUc9EzTGhIJ2fcoV67rLKb6Sm9UOVCISO4Xa0VVVnFUJG9PXSAYCq7gnHILLx8xoIx-L2C0blhugbADUa3nM0AOx8UQzGImu194B94Kt-CKAuK1CrGHUz10fBFs02Lmly-HO-fmBHFuZ9knuYRb6EP9v4-SpR7Ja-oeJZErJDUVEgEje0d7J8/w640-h360/7.22_MorphToTablet_Gif.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 style="text-align: left;"&gt;Ensure seamless camera capture on foldable devices&lt;/h2&gt;&lt;div&gt;Camera implementation on foldables brings unique hardware quirks. Moving from a compact outer display to an expanded inner display introduces distinct layout aspect ratios while device rotation remains unchanged. If an app assumes a fixed portrait relationship between the camera sensor and the device layout, the app will likely suffer from sideways, stretched, or cropped previews during these folding transitions.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;When optimizing your app's media pipeline, migrate your capture experiences to &lt;a href="https://developer.android.com/media/camera/camerax" target="_blank"&gt;CameraX&lt;/a&gt; using the CameraX migration &lt;a href="https://github.com/android/skills/blob/main/camera/camerax/SKILL.md"&gt;skill&lt;/a&gt;. The library’s &lt;a href="https://developer.android.com/reference/kotlin/androidx/camera/view/PreviewView" target="_blank"&gt;PreviewView&lt;/a&gt; automatically handles sensor orientation, device rotation, and scaling behind the scenes. This guarantees a clean, stable preview regardless of how the user holds or positions the device. If you are maintaining an existing Camera2 codebase, integrate the &lt;a href="https://developer.android.com/develop/adaptive-apps/guides/foldables/trifolds-and-landscape-foldables#solution_2_cameraviewfinder" target="_blank"&gt;CameraViewfinder&lt;/a&gt; library to apply these complex aspect ratio and rotation transformations automatically without needing a total architecture overhaul.&lt;/div&gt;&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;Extend glanceable interactions to Wear OS 7&lt;/h2&gt;&lt;div&gt;The opportunity to build for this new generation of devices extends right to the wrist. Launching with Wear OS 7, Wear Widgets give you a fresh surface to provide users with instant, glanceable access to their essential updates. You can build these highly expressive experiences using &lt;a href="https://developer.android.com/jetpack/androidx/releases/glance-wear" target="_blank"&gt;Jetpack Glance&lt;/a&gt; and &lt;a href="https://developer.android.com/jetpack/androidx/releases/compose-remote" target="_blank"&gt;RemoteCompose&lt;/a&gt;. Crucially, Widgets built with this framework can now populate multi-widget tiles that were previously reserved for first-party widgets.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
    
 &lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/VnjgKzAa0ws" style="border: 0; height: 450px; width: 100%;" width="100%"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;h2 style="clear: both; text-align: left;"&gt;Build intelligent features&amp;nbsp;&lt;/h2&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blog.google/products-and-platforms/platforms/android/gemini-intelligence/" target="_blank"&gt;Gemini intelligence &lt;/a&gt;already completes tasks on users’ behalf, and you can &lt;a href="https://developer.android.com/ai/appfunctions?_gl=1*1jms098*_up*MQ..*_ga*MjY0OTY0MDI3LjE3ODQzMzI1NDk.*_ga_6HH9YJMN9M*czE3ODQzMzI1NDkkbzEkZzAkdDE3ODQzMzI1NDkkajYwJGwwJGgxNjE0MTMzNjEz" target="_blank"&gt;experiment&lt;/a&gt; with the intelligence system by sharing your apps capabilities.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;Samsung’s new foldable devices come with Gemini Nano 4, our latest on-device model. Nano 4 provides support for over 140 languages, better multimodal understanding, and &lt;a href="https://developers.google.com/ml-kit/release-notes#july_14_2026" target="_blank"&gt;much more&lt;/a&gt;. Use &lt;a href="https://developers.google.com/ml-kit/genai/prompt/android" target="_blank"&gt;ML Kit’s Prompt API&lt;/a&gt; with advanced features like s&lt;a href="https://developers.google.com/ml-kit/genai/prompt/android/structured-output" target="_blank"&gt;tructured output&lt;/a&gt; and &lt;a href="https://developers.google.com/ml-kit/genai/prompt/android/thinking-mode" target="_blank"&gt;thinking mode&lt;/a&gt; to build intelligent features on-device.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;h2 style="clear: both; text-align: left;"&gt;Start optimizing today&lt;/h2&gt;&lt;div class="separator" style="clear: both;"&gt;The tools and frameworks are ready to help you optimize your app for all screen sizes. Begin by exploring our guidance for &lt;a href="https://developer.android.com/develop/adaptive-apps" target="_blank"&gt;building adaptive apps &lt;/a&gt;to learn more about core adaptive design principles.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;To dive deeper, check out our comprehensive &lt;a href="https://www.youtube.com/playlist?list=PLD2U7gd1-ieo" target="_blank"&gt;YouTube playlist&lt;/a&gt;. Finally, ensure your app delivers a flawless, premium experience on the newest form factors by reviewing our dedicated quality guidelines for &lt;a href="https://developer.android.com/develop/adaptive-apps/guides/foldables/trifolds-and-landscape-foldables" target="_blank"&gt;trifolds and landscape foldables&lt;/a&gt; and &lt;a href="https://developer.android.com/design/ui/wear/guides/get-started?hl=en" target="_blank"&gt;WearOS&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;Unfold the future today!&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/7230493561349571062/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/optimize-galaxy-screen-sizes.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7230493561349571062" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7230493561349571062" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/optimize-galaxy-screen-sizes.html" rel="alternate" title="Optimize your apps for the next generation of Samsung Galaxy devices" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV-c747avSj9Z8JO4DTK4kSfO3SjSpd5aTuVvR_TBeD3bXV6cc8lzNLGrWCngNXdyZBeiNjQqwQZCcU4QCrovwL99gu0t5bQrlTXa0PIBGIivwyS8y226MgeraphZr4VITWYe0x7ckFto0dsD8rBLM1J_P3dV0CBj5Ctlwm8jsgAPZA7W2XnKnRz59H9I/s72-c/MM_Adaptive_and_device_Meta%20(1).png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-1633372972504974395</id><published>2026-07-21T06:00:00.000-07:00</published><updated>2026-07-21T09:58:09.514-07:00</updated><title type="text">Build intelligent Android apps: Cloud and hybrid inference</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBHTpa22SxEltoebLZYO_34iRtahN8z5tA3tnIryIii0s4_conN5qFYfmNro6nmZBfsgiZeRLtru-gE4XO2mf-RBDyIo00kf3QunWwUO-SICHkVSv0exAQQ4qA0KzjMGRpA8qj1TSMP0Ffe0FzrEc_S1zBaakKzCZFpqYLXqds9Zqmqr8yyeSgyNl9U0s/s2469/features%20in%20Jetpacker%20Features%20with%20Firebase%20AI%20Logic%20_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBHTpa22SxEltoebLZYO_34iRtahN8z5tA3tnIryIii0s4_conN5qFYfmNro6nmZBfsgiZeRLtru-gE4XO2mf-RBDyIo00kf3QunWwUO-SICHkVSv0exAQQ4qA0KzjMGRpA8qj1TSMP0Ffe0FzrEc_S1zBaakKzCZFpqYLXqds9Zqmqr8yyeSgyNl9U0s/s2469/features%20in%20Jetpacker%20Features%20with%20Firebase%20AI%20Logic%20_Meta.png" style="display: none;" /&gt;&lt;div&gt;&lt;i&gt;Posted by Thomas Ezan, Jolanda Verhoef, Caren Chang, Senior Developer Relations Engineers, Android Developer Relations&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn2fO3T2xckksQ9pk3RUNPxZqqq2CyaifXnju0lCCpbfwJ4gZyq-df0kM_mK1TMV0F9YCMo19Ba9NvFAiUpzDH6Wlk_RyonRCK5Ono25CYyQ7xGC3q70mUhyphenhyphenOOYJ-5JX2KlFP1lIA3ULIhH86_hP2ptO0AllUIf6ZVh-SqoXVWcXrM8m3hHCkhGwZYfP4/s8583/AFD%20-%20%5BABL_101%5D%20Building%20AI%20features%20in%20Jetpacker%20Features%20with%20Firebase%20AI%20Logic%20_Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2601" data-original-width="8583" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn2fO3T2xckksQ9pk3RUNPxZqqq2CyaifXnju0lCCpbfwJ4gZyq-df0kM_mK1TMV0F9YCMo19Ba9NvFAiUpzDH6Wlk_RyonRCK5Ono25CYyQ7xGC3q70mUhyphenhyphenOOYJ-5JX2KlFP1lIA3ULIhH86_hP2ptO0AllUIf6ZVh-SqoXVWcXrM8m3hHCkhGwZYfP4/s1600/AFD%20-%20%5BABL_101%5D%20Building%20AI%20features%20in%20Jetpacker%20Features%20with%20Firebase%20AI%20Logic%20_Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Welcome back to the blog post series "&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html" target="_blank"&gt;Build intelligent Android apps&lt;/a&gt;" where we take a basic Android app and transform it into a &lt;b&gt;personalized&lt;/b&gt;, &lt;b&gt;intelligent&lt;/b&gt;, and &lt;b&gt;agentic&lt;/b&gt; experience. In our &lt;a href="http://android-developers.googleblog.com/2026/07/android-on-device-inference.html"&gt;previous post&lt;/a&gt; we explored how to build intelligent on-device features using Gemini Nano through ML Kit's Prompt API.&lt;/p&gt;

&lt;p&gt;In this post, we will look at how you can leverage &lt;b&gt;&lt;a href="https://firebase.google.com/docs/ai-logic"&gt;Firebase AI Logic&lt;/a&gt; &lt;/b&gt;to build cloud-hosted and hybrid AI features:&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Grounding answers in real-world context&lt;/li&gt;
  &lt;li&gt;Routing requests dynamically between cloud and local execution using hybrid inference&lt;/li&gt;
  &lt;li&gt;Translating content with custom routing systems&lt;/li&gt;
&lt;/ul&gt;

&lt;div style="margin: 0px auto; width: 100%;"&gt;
  &lt;iframe allowfullscreen="" src="https://www.youtube.com/embed/_iuXykdlTkk" style="aspect-ratio: 16/9; border: 0; width: 100%;"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Sometimes a use case requires AI models with greater world knowledge, a much larger context window, or the ability to handle complex queries. In those scenarios, we can leverage cloud models.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Other times, you want the best of both worlds: using hybrid inference to run on-device when available to lower costs, while falling back to the cloud to ensure compatibility for all devices.&lt;/p&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwlTUF1Kzkbrf2w64KO3jZJZZ_wLEu34vq6Cb7PX2alVUhFVdbkiWuXCkzUS-bPJkHMbmuNJ_Ov0HYZzujr69jCU9gPvmKaKMZt2q4-TolSDFCLABBIY1IBRY9Zn7D5S10hFcJD2kuVCm3N2glpqDJoHiqAZat4z6oyXxxwH4ZCGVBgfPObMevoJrgNPg/s8000/features_upscaled.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="4744" data-original-width="8000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwlTUF1Kzkbrf2w64KO3jZJZZ_wLEu34vq6Cb7PX2alVUhFVdbkiWuXCkzUS-bPJkHMbmuNJ_Ov0HYZzujr69jCU9gPvmKaKMZt2q4-TolSDFCLABBIY1IBRY9Zn7D5S10hFcJD2kuVCm3N2glpqDJoHiqAZat4z6oyXxxwH4ZCGVBgfPObMevoJrgNPg/s1600/features_upscaled.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;em style="text-align: left;"&gt;Cloud and hybrid features in Jetpacker: Museum assistant with web grounding, hybrid restaurant review drafting, and&amp;nbsp;
  support chat featuring custom-routed live translation.&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Let’s look at how we implemented three cloud and hybrid features in &lt;a href="https://github.com/android/ai-samples/tree/main/jetpacker" target="_blank"&gt;Jetpacker&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;a museum assistant with web grounding&lt;/li&gt;
  &lt;li&gt;hybrid restaurant review drafting&lt;/li&gt;
  &lt;li&gt;hotel support chat featuring custom-routed live translation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Use LLM grounding for up-to-date informationMuseum assistant chatbot with LLM grounding&lt;/h2&gt;
&lt;p&gt;The &lt;b&gt;Museum assistant &lt;/b&gt;is an interactive chatbot designed to help users plan their museum visits. It provides visitors with up-to-date details regarding specific exhibits, current opening hours, ticket pricing, and more.&lt;/p&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;em style="text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3pxeCVJfOo5G7McNB4RCIhoCUch8CHSAWI7gHijJJcE95b0gbu3lyAO1xIWc6mKllkpylSPBnVfU6RYnwfay4z6dH7TlufPuNw3Lw7s-bEuR4Ajx8IHK8k6zJcOHitqMRdDv8EVL-fCN6uuDo1QTnOgk_RW-AEM1_hZaJWbCGezMQF_D9Hia-Rm2T4-c/s4880/museum_assistant_upscaled.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="4880" data-original-width="2392" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3pxeCVJfOo5G7McNB4RCIhoCUch8CHSAWI7gHijJJcE95b0gbu3lyAO1xIWc6mKllkpylSPBnVfU6RYnwfay4z6dH7TlufPuNw3Lw7s-bEuR4Ajx8IHK8k6zJcOHitqMRdDv8EVL-fCN6uuDo1QTnOgk_RW-AEM1_hZaJWbCGezMQF_D9Hia-Rm2T4-c/w314-h640/museum_assistant_upscaled.png" width="314" /&gt;&lt;/a&gt;&lt;/div&gt;Museum assistant is a chatbot that answers questions, such as&amp;nbsp;&lt;/em&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;em style="text-align: left;"&gt;‘How can I get a ticket discount for Le Louvre?’&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;When building AI features, getting the model to answer with fresh, accurate, and specific real-world information is a common challenge. While cloud models possess massive amounts of world knowledge, they might not know about seasonal exhibits or the current day’s opening hours.&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8He5M2JC5EwXZwa-M52UAXHSO4dWy4gx3aZoY2ZXM-x25pV4kc6BsICe_fG4Zn6-R37_UgTQ8LBSsrNcP50e3aQLgxNbHOfWLBqzaSqQ78ZDmNEJadZNc-I5bduHr0UtWOxYMTFAHgffxcuzaETHPe3lvfRod2rkeOUXnRaLJ_vIiAfO_xRKpESbX3L8/s8000/grounding_upscaled.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="4452" data-original-width="8000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8He5M2JC5EwXZwa-M52UAXHSO4dWy4gx3aZoY2ZXM-x25pV4kc6BsICe_fG4Zn6-R37_UgTQ8LBSsrNcP50e3aQLgxNbHOfWLBqzaSqQ78ZDmNEJadZNc-I5bduHr0UtWOxYMTFAHgffxcuzaETHPe3lvfRod2rkeOUXnRaLJ_vIiAfO_xRKpESbX3L8/s1600/grounding_upscaled.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;em style="text-align: left;"&gt;&lt;br /&gt;Grounding data is added to the context window to enable the model&lt;/em&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;em style="text-align: left;"&gt;&amp;nbsp;to answer questions correctly and accurately.&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;To bridge this gap, we can use grounding techniques to add extra context to the model’s context window. The &lt;a href="https://firebase.google.com/products/firebase-ai-logic" target="_blank"&gt;Firebase AI Logic SDK&lt;/a&gt; supports three types of grounding:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href="https://firebase.google.com/docs/ai-logic/url-context"&gt;URL grounding&lt;/a&gt;:&lt;/strong&gt; Grounding responses using content from a specific webpage (e.g. current ticket prices or museum rules).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href="https://firebase.google.com/docs/ai-logic/grounding-google-search"&gt;Google Search grounding&lt;/a&gt;:&lt;/strong&gt; Letting the model query the real-time Google search index for up-to-date details.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;a href="https://firebase.google.com/docs/ai-logic/grounding-google-maps"&gt;Maps grounding&lt;/a&gt;:&lt;/strong&gt; Using Google Maps location data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Jetpacker, we dynamically construct the available tools based on enabled feature flags and initialize the generative model using the Firebase AI SDK:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// implementation("com.google.firebase:firebase-ai-logic")

private var toolList = mutableListOf&amp;lt;Tool&amp;gt;()

init {
    if (ENABLE_SEARCH_GROUNDING) {
        toolList.add(Tool.googleSearch())
    }
    if (ENABLE_URL_GROUNDING) {
        toolList.add(Tool.urlContext())
    }
}

private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3-flash",
        systemInstruction = content {
            text("You are a helpful museum assistant answering questions about a museum. Use plain text.")
        },
        tools = toolList
    )&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When the user queries the assistant, if URL grounding is enabled, we append the specific museum resource URLs directly into the prompt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;val groundingText = if (FeatureFlags.ENABLE_URL_GROUNDING) {
    "\n If the following message above is about the rules and terms to visit Le Louvre, " +
    "if needed answer this urls ${urlList.joinToString()}"
} else {
    ""
}

val prompt = "$text $groundingText"

var response = chat.sendMessage(prompt)
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Hybrid inference: On-device review generation with Maps deep link&lt;/h2&gt;
&lt;p&gt;Not every AI task requires a cloud-based model, and not every device is online. To help developers balance latency, cost, and offline availability, we recently introduced the &lt;a href="https://firebase.google.com/docs/ai-logic/hybrid/android/get-started?api=dev"&gt;Firebase API for Hybrid Inference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In Jetpacker, the &lt;b&gt;restaurant review&lt;/b&gt; feature lets users review select topics and automatically drafts a review. To enable this for all users, we prioritize local execution with Gemini Nano, and fall back to cloud models on devices that don’t support Gemini Nano.&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVa1o2Zh3v3Babi7gGmzOFYAKPEgS0HWmvisiKgK-QsSRh_ZhjTjuUYSS_QIH0JQw9NsqrkYe4Quud6cfCGwVc61_7HKcACj6c9yywWySn5xyHGgemBR5tYPP8q3bmLadaN6uLXspE9LqrcZkVdckEGHWDhdfYVa-xo8QomDaRn03mau2fHVyK0Fr1FaU/s4680/review_upscaled.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="4680" data-original-width="2392" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVa1o2Zh3v3Babi7gGmzOFYAKPEgS0HWmvisiKgK-QsSRh_ZhjTjuUYSS_QIH0JQw9NsqrkYe4Quud6cfCGwVc61_7HKcACj6c9yywWySn5xyHGgemBR5tYPP8q3bmLadaN6uLXspE9LqrcZkVdckEGHWDhdfYVa-xo8QomDaRn03mau2fHVyK0Fr1FaU/w327-h640/review_upscaled.png" width="327" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;em&gt;The restaurant review feature uses hybrid inference to draft a review based on topics&lt;/em&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;

&lt;pre&gt;&lt;code&gt;// implementation("com.google.firebase:firebase-ai-logic")
// implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta03")


// Initialize the model with hybrid routing configuration
val reviewModel = Firebase.ai.generativeModel(
    modelName = "gemini-3.1-flash-lite",
    onDeviceConfig = OnDeviceConfig(
        inferenceMode = InferenceMode.PREFER_ON_DEVICE
    )
)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The Hybrid Inference API supports four distinct routing modes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;PREFER_ON_DEVICE:&lt;/strong&gt; Prioritizes local execution and falls back to cloud if Gemini Nano is unavailable.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;PREFER_IN_CLOUD:&lt;/strong&gt; Prioritizes cloud execution and falls back to on-device if the device goes offline.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;ONLY_ON_DEVICE:&lt;/strong&gt; Restricts execution strictly to the device.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;ONLY_IN_CLOUD:&lt;/strong&gt; Restricts execution strictly to the cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the review is generated, we copy it to the clipboard and use an intent to open Google Maps directly to the restaurant's review page, providing a seamless user experience:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private fun copyAndOpenMapsReview(context: Context, reviewText: String, placeId: String) {
    val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText("User Review", reviewText)
    clipboard.setPrimaryClip(clip)

    val uri = Uri.parse("https://search.google.com/local/writereview/mobile?placeid=$placeId")
    val intent = Intent(Intent.ACTION_VIEW, uri).apply {
        setPackage("com.google.android.apps.maps")
    }
    context.startActivity(intent)
}&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Custom hybrid routing: Hotel support chat translation with simulated personas&lt;/h2&gt;
&lt;p&gt;The &lt;b&gt;hotel support chat&lt;/b&gt; was built to let users finalize logistics and check on hotel details. This feature uses system instructions to configure a localized receptionist assistant. By passing specific information—such as the preferred language and hotel information—in the instructions, we can set up a conversational persona representing a specific hotel.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        systemInstruction = content {
            text("""
              You are a helpful hotel receptionist at $hotelName only speaking $language. 
              Answer politely in $language. The bar closes at 10pm and breakfast is from 7am to 10am.
              There's someone at the desk 24/7. You can retrieve your luggage from the storage room 
              at the back of the lobby at any time.
              """)
        },
        modelName = "gemini-3-flash-preview"
    )&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Because receptionist responses are in the hotel's local language (for example, French for Hotel Le Meurice in Paris), we need to translate messages to the user’s preferred language.&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;em&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikIB_NnUYK8GnEpI3foNLO2_AQ2lNZhoc9gFB-CjERDjMwrdQ2T45y6jzrJAafi4Jz7eF_SBkXG7csDwpajKctp5yo1hsBjIacIfK3aHvvQjCUu22qZBj7dLl5Q4aGFJRD4hwTlMMNgZD8sIuYpCrRjMmpa5ybXDzi9nkTMZoiJOEn8jLmqBsgTXcVTDY/s4112/translation_upscaled.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2364" data-original-width="4112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikIB_NnUYK8GnEpI3foNLO2_AQ2lNZhoc9gFB-CjERDjMwrdQ2T45y6jzrJAafi4Jz7eF_SBkXG7csDwpajKctp5yo1hsBjIacIfK3aHvvQjCUu22qZBj7dLl5Q4aGFJRD4hwTlMMNgZD8sIuYpCrRjMmpa5ybXDzi9nkTMZoiJOEn8jLmqBsgTXcVTDY/s1600/translation_upscaled.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;em&gt;Hotel support chat messages are automatically translated to the user’s preferred language&amp;nbsp;&lt;/em&gt;&lt;/div&gt;&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;While hybrid models can configure simple routing preferences, complex scenarios require custom routing logic. In Jetpacker, we implement a custom routing stack that takes into account:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Language identification:&lt;/strong&gt; Using the on-device &lt;a href="https://developers.google.com/ml-kit/language/identification/android"&gt;ML Kit Language Identification API&lt;/a&gt;, we can detect the incoming message language.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;On-device translation (Gemini Nano):&lt;/strong&gt; &lt;a href="https://developers.google.com/ml-kit/genai/prompt/android"&gt;ML Kit’s Prompt API&lt;/a&gt; lets us translate common language pairs directly on the device, saving bandwidth and cloud cost.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Cloud translation (Gemini 3 Flash):&lt;/strong&gt; For more complex languages, we use Gemini Flash 3 to get a higher quality translation.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;// implementation("com.google.android.gms:play-services-mlkit-language-id:17.0.0")&amp;nbsp;

// ML Kit for Language Identification (powered by Google Play Services)
private val languageIdentifier = LanguageIdentification.getClient()

// On-device translator model (prefer Gemini Nano) for translating common language pairs
private val hybridTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3-flash",
        onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE)
    )

// Cloud translator model for more complex language pairs
private val cloudTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3-flash"
    )&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When a message needs to be translated, we identify the source language and apply our custom routing logic, executing either on-device or cloud translation:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fun translateMessage(message: SupportChatMessage) {
    viewModelScope.launch {
        // 1. Detect language using ML Kit Language Identification
        val sourceLang = try {
            Tasks.await(languageIdentifier.identifyLanguage(message.text))
        } catch (e: Exception) {
            "Undefined"
        }

        // 2. Custom routing: we've verified the translation quality for English and Korean with Gemini Nano, and will translate message on-device for those two languages
        val routeToCloud = sourceLang != "en" &amp;amp;&amp;amp; sourceLang != "kr"

        val prompt = "Translate the following text to $selectedLanguage. Just return the translated sentence: ${message.text}."

        val (translatedText, routePrefix) = if (routeToCloud) {
            val result = cloudTranslationModel.generateContent(prompt)
            result.text to "[Cloud]"
        } else {
            val result = hybridTranslationModel.generateContent(prompt)
            result.text to "[On-Device]"
        }

        if (translatedText != null) {
            _translations.update { current -&amp;gt;
                current + (message.id to "$routePrefix: $translatedText")
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In this example, the custom routing logic only takes into consideration the translation’s source and target language. However, based on your app’s use case, you can expand the routing logic to include other factors such as the on-device model version, network connectivity, battery status, and more.&lt;/p&gt;

&lt;h2&gt;Securing the AI Pipelines: Firebase App Check&lt;/h2&gt;
&lt;p&gt;Lastly, using AI in the cloud opens up possibilities of API key abuse or unauthorized billing. To secure API calls, we integrated &lt;a href="https://firebase.google.com/docs/app-check"&gt;&lt;b&gt;Firebase App Check&lt;/b&gt;&lt;/a&gt; using both Play Integrity (production) and the local Debug Provider (for local development or emulators).&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://github.com/android/ai-samples/blob/main/jetpacker/android/app/src/main/kotlin/com/example/jetpacker/JetPackerApplication.kt"&gt;JetPackerApplication.kt&lt;/a&gt; file, we install the debug provider at startup and trigger anonymous authentication to establish a secure user session:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//  implementation("com.google.firebase:firebase-appcheck-playintegrity")&amp;nbsp;
//  implementation("com.google.firebase:firebase-appcheck-debug")&amp;nbsp;&amp;nbsp;
//  implementation("com.google.firebase:firebase-auth")&amp;nbsp;

override fun onCreate() {
    super.onCreate()
    Firebase.initialize(context = this)
    Firebase.appCheck.installAppCheckProviderFactory(
        DebugAppCheckProviderFactory.getInstance()
    )
    Firebase.auth.signInAnonymously()
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When building locally on an emulator, App Check prints a local token secret to logcat:&lt;/p&gt;

&lt;p&gt;Enter this debug secret into the allow list in the Firebase Console: a8c2dd4c-xxxx-xxxx-xxxx-ef6c114ba27e&lt;/p&gt;

&lt;p&gt;Once registered in the Firebase console, local requests are fully verified and authenticated by App Check, protecting our backend while letting us test the app locally.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;By combining cloud model capabilities (grounding, system instructions) with on-device capabilities (hybrid routing, translation, security app checks), we created a travel app that is smart, secure, and available offline.&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/android/ai-samples/tree/main/jetpacker" target="_blank"&gt;full source code for Jetpacker on GitHub&lt;/a&gt;, and explore the Firebase documentation to get started:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://firebase.google.com/docs/ai-logic/get-started"&gt;Firebase AI Logic Documentation&lt;/a&gt;&lt;br /&gt;&lt;a href="https://firebase.google.com/docs/ai-logic/hybrid/android/get-started"&gt;Firebase Hybrid Inference API&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Learn more&lt;/h2&gt;
&lt;p&gt;Check out the other parts of this blog post series:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html"&gt;Part 1&lt;/a&gt;:&lt;/b&gt; Introduction of the app and a high-level overview.&lt;br /&gt;&lt;b&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/android-on-device-inference.html"&gt;Part 2&lt;/a&gt;: &lt;/b&gt;On-device intelligence. Deep-dive into ML Kit’s GenAI APIs and Gemini Nano to build privacy-first features like itinerary summarization, receipt parsing, and local audio processing.&lt;br /&gt;&lt;b&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-cloud-hybrid-inference.html"&gt;Part 3 (this post!):&lt;/a&gt;&lt;/b&gt; Hybrid and cloud reasoning. Explore how to use Firebase AI Logic to ground LLM answers in real-world data like Google Maps and web context.&lt;br /&gt;&lt;b&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-appfunctions.html"&gt;Part 4:&lt;/a&gt; &lt;/b&gt;System integration. Integrating with the Android intelligence system using AppFunctions.&amp;nbsp;&lt;br /&gt;&lt;b&gt;Part 5 (coming soon):&lt;/b&gt; In-app agentic workflows. Extend the app with an end-to-end booking assistant powered by A2UI and ADK.&lt;/p&gt;

&lt;p&gt;Interested in more on Android Development? Follow Android Developers on &lt;a href="https://www.youtube.com/@AndroidDevelopers"&gt;YouTube&lt;/a&gt; or &lt;a href="https://www.linkedin.com/showcase/androiddev/"&gt;LinkedIn&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;All code snippets in this blog post follow the following copyright notice:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0&lt;/code&gt;&lt;/pre&gt;</content><link href="http://android-developers.googleblog.com/feeds/1633372972504974395/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-cloud-hybrid-inference.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/1633372972504974395" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/1633372972504974395" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-cloud-hybrid-inference.html" rel="alternate" title="Build intelligent Android apps: Cloud and hybrid inference" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBHTpa22SxEltoebLZYO_34iRtahN8z5tA3tnIryIii0s4_conN5qFYfmNro6nmZBfsgiZeRLtru-gE4XO2mf-RBDyIo00kf3QunWwUO-SICHkVSv0exAQQ4qA0KzjMGRpA8qj1TSMP0Ffe0FzrEc_S1zBaakKzCZFpqYLXqds9Zqmqr8yyeSgyNl9U0s/s72-c/features%20in%20Jetpacker%20Features%20with%20Firebase%20AI%20Logic%20_Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-5691330950466150364</id><published>2026-07-21T06:00:00.000-07:00</published><updated>2026-07-23T11:47:25.264-07:00</updated><title type="text">Build intelligent Android apps: Integrate into Android's intelligence system using AppFunctions</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi961epgT3N_Za_k2-pCJ30tegn7DM-Umh1LWh7Q4NxhryR5H57JB00zKQcek56ccAvEM95i6wyXWWCZZ7486_Gq1ewxPHtsMY13UVsVTmndAvkOJtHPjUXuZ3XW_yBEFtlOr2ocBFIKr0PCRZhIRs67h6bX6zDKihwcxQs8bGbYTqIp5azuBKcX4PNMMY/s2469/AFD%20-%20%5BABL_104%5D%20JetPacker%20AppFunctions_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi961epgT3N_Za_k2-pCJ30tegn7DM-Umh1LWh7Q4NxhryR5H57JB00zKQcek56ccAvEM95i6wyXWWCZZ7486_Gq1ewxPHtsMY13UVsVTmndAvkOJtHPjUXuZ3XW_yBEFtlOr2ocBFIKr0PCRZhIRs67h6bX6zDKihwcxQs8bGbYTqIp5azuBKcX4PNMMY/s2469/AFD%20-%20%5BABL_104%5D%20JetPacker%20AppFunctions_Meta.png" style="display: none;" /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Posted by Ben Weiss, Senior Developer Relations Engineer,&amp;nbsp;Android Developer Relations&lt;/i&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi92OFxAOxVMpResmBcBoUfxzgcMmVOMn3mXQabB9O-xkC7pjYxrvXS7YLTEWLIBstwuDLc0ePCC-Tf7AKq62mgAXjSYg9-VUIjKvokK6BhGHqPDSXCTQowbpj40plsP3V3Ju3ck4gzNdJmGQ6C1-twuob2UnPu7oY9B_oSwnYSkaif7lSEMwFnStzWknM/s8583/AFD%20-%20%5BABL_104%5D%20JetPacker%20AppFunctions_Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2601" data-original-width="8583" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi92OFxAOxVMpResmBcBoUfxzgcMmVOMn3mXQabB9O-xkC7pjYxrvXS7YLTEWLIBstwuDLc0ePCC-Tf7AKq62mgAXjSYg9-VUIjKvokK6BhGHqPDSXCTQowbpj40plsP3V3Ju3ck4gzNdJmGQ6C1-twuob2UnPu7oY9B_oSwnYSkaif7lSEMwFnStzWknM/s1600/AFD%20-%20%5BABL_104%5D%20JetPacker%20AppFunctions_Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Welcome back to the blog post series "&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html" target="_blank"&gt;Build intelligent Android apps&lt;/a&gt;" where we take a basic Android app and transform it into a personalized, intelligent, and agentic experience. In our &lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-cloud-hybrid-inference.html"&gt;previous post&lt;/a&gt;,&amp;nbsp;we explored how to leverage Firebase AI Logic to build cloud-hosted and hybrid AI features.&lt;/p&gt;Traditional mobile UIs excel at focused, hands-on tasks, and the Android intelligence system is introducing complementary features to make complex, multi-step actions even easier. By supplementing traditional user interfaces, AppFunctions provide a powerful new entry point: A privileged agent on the device can access app features in the background. This can be particularly helpful when users are driving, walking or otherwise multitasking. 

&lt;p&gt;In this article, we'll show you how we designed and integrated these capabilities into our travel planning app, &lt;a href="https://github.com/android/ai-samples/tree/main/jetpacker"&gt;JetPacker&lt;/a&gt;, using Android AppFunctions. We'll explore the rationale behind our feature choices, discuss the specialized tooling we used to accelerate development, and dive into the code that makes it all work.&lt;/p&gt;

&lt;h2&gt;Designing AI-ready features: making choices that matter for your users&lt;/h2&gt;

&lt;p&gt;To select which features to provide to the intelligence system, we looked for tasks where a voice or text command is objectively faster than tapping through screens. In this side-by-side screen recording you can see this contrast perfectly: on the left, a user tapping through multiple screens to log an expense; on the right, the same task completed instantly in the background via a privileged agent.&lt;/p&gt;

&lt;div class="vertical-video-grid"&gt;
  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIr2ssY2GiOlBmFzcP-91j91VjH9QX_sOP8FcmtirYPyXZmYRzNJmfqI_GT6aXYXye8-ntylv-gTNu1Qlnbx5gHiFn9naHqt7tJOQBA3HpQ5uz8XRdavXh7b3IP3FzJb4SsbC4mClGLUHupDwIeE9Du3PNRQr0SGs2lgHZTdHXnv8TagNBRtoJsbpeE6c/s960/Comp%201.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIr2ssY2GiOlBmFzcP-91j91VjH9QX_sOP8FcmtirYPyXZmYRzNJmfqI_GT6aXYXye8-ntylv-gTNu1Qlnbx5gHiFn9naHqt7tJOQBA3HpQ5uz8XRdavXh7b3IP3FzJb4SsbC4mClGLUHupDwIeE9Du3PNRQr0SGs2lgHZTdHXnv8TagNBRtoJsbpeE6c/s1600/Comp%201.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="vertical-video-wrapper"&gt;&lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Our first choice was expense tracking. Logging a coffee expense during a trip usually takes quite a few taps—unlocking the phone, opening the app, finding the active trip, navigating to the expenses tab, tapping the add button, taking a picture of the receipt, and checking the result. By providing the &lt;code&gt;addExpense&lt;/code&gt; and &lt;code&gt;getExpenses&lt;/code&gt; features as AppFunctions, the system agent handles the heavy lifting. When the user says, "Add a five-dollar coffee expense to my Paris trip," the agent automatically searches for the correct trip ID in the background and inserts the expense, skipping the manual UI flow entirely.&lt;/p&gt;

&lt;p&gt;We also prioritized itinerary management. Finding what activity is next on a busy trip itinerary usually requires scrolling through a dense timeline view. By providing &lt;code&gt;getItinerary&lt;/code&gt; and &lt;code&gt;addItineraryEvent&lt;/code&gt; to the system, the user can simply ask, "What am I doing next in Paris?" and get an immediate answer.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRduisOXPFs0o2m-JwtESU1fUEanqH-A0eGt58MUuXs-vgN1af77M-j3ETdegzulBq-3TClrDvhO2K_8q4ep8xAlnW1y5T09ZxxHyZmTRtftA9DOmIk7ykfM_JihQ2c2fcUbEA-jCO1sgW2JnxN9qtB8IS58lbQoaIk4cPJPuPQavZNUoW2rNKo9r8g9M/s960/Comp%202.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRduisOXPFs0o2m-JwtESU1fUEanqH-A0eGt58MUuXs-vgN1af77M-j3ETdegzulBq-3TClrDvhO2K_8q4ep8xAlnW1y5T09ZxxHyZmTRtftA9DOmIk7ykfM_JihQ2c2fcUbEA-jCO1sgW2JnxN9qtB8IS58lbQoaIk4cPJPuPQavZNUoW2rNKo9r8g9M/s1600/Comp%202.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  

&lt;p&gt;Finally, we focused on hands-free note capturing. Typing out reminders or notes while walking down a busy street is difficult and unsafe. Exposing a voice note capability allows the user to say, "The flight was amazing, I saw a beautiful sunset and managed to sleep well," and the privileged agent automatically transcribes and saves it directly into the travel database&amp;nbsp;&lt;span face="Roboto, sans-serif" style="color: #073042; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;using the &lt;/span&gt;&lt;span style="color: #188038; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;addVoiceNote&lt;/span&gt;&lt;span face="Roboto, sans-serif" style="color: #073042; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt; AppFunction.&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;Android MCP powered by AppFunctions&lt;/h2&gt;This entire experience is built on Android MCP. Under this design, the app acts as a local MCP server. Rather than remote APIs, you provide your app features directly to the on-device intelligence system.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://d.android.com/ai/appfunctions"&gt;Android AppFunctions&lt;/a&gt; is the API that brings this concept to life. It reads annotated Kotlin functions and compiles them into type-safe, sandboxed tool definitions that the privileged agent can discover and invoke locally on the device.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjypEvh8lAK1myAWpnG4A0TtdIaTxP69t7g9croAJSUZ2Od6AEkhwMusN3CvdGohdvYzoh1UaCxCHb22oJzCD_4B2K8vfQzcyAIaTl8lk3TCR9T0SoMHjjaDk4GMxxPazeCfT0aF7rifm7-LAvcMhyphenhyphenryDJpOPYon7jiISKB2sMLzAwHDuKFxIv16sDXjrM/s2500/Android%20MCP%20diagram.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1406" data-original-width="2500" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjypEvh8lAK1myAWpnG4A0TtdIaTxP69t7g9croAJSUZ2Od6AEkhwMusN3CvdGohdvYzoh1UaCxCHb22oJzCD_4B2K8vfQzcyAIaTl8lk3TCR9T0SoMHjjaDk4GMxxPazeCfT0aF7rifm7-LAvcMhyphenhyphenryDJpOPYon7jiISKB2sMLzAwHDuKFxIv16sDXjrM/s1600/Android%20MCP%20diagram.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;i&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Diagram highlighting our apps, the android platform, and system agents coordinate AppFunctions.&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;p&gt;Under the Android MCP model, your app acts as a local MCP server that exposes structured tools, while the Android platform serves as the central tool registry. On the MCP client side, agent apps are registered with the intelligence system after being granted system-privileged permissions to access the registry.&lt;/p&gt;

&lt;p&gt;When a user interacts with a registered agent, its LLM determines if the request can be handled by an AppFunction, queries the platform's metadata, and executes the appropriate registered functions in the background. This local MCP client-server design gives you full control: you choose exactly which features are accessible to the agent, keeping the rest of your app's data private.&lt;/p&gt;

&lt;h2&gt;How we accelerated development with Android skills&lt;/h2&gt;

To streamline the integration process, we leveraged the &lt;a href="https://github.com/android/skills/tree/main/device-ai/appfunctions"&gt;AppFunctions development skill&lt;/a&gt;. The AppFunctions development skill is a complete development companion. It guided us through the entire lifecycle: mapping Kotlin data classes to serialize parameters, generating the necessary &lt;code&gt;Service&lt;/code&gt; entry points, refining our &lt;code&gt;KDoc&lt;/code&gt; documentation to ensure the LLM understands parameter boundaries, and setting up automated testing using ADB.

&lt;h2&gt;Providing app features to the intelligence system&lt;/h2&gt;

&lt;p&gt;Enough with the theory, let's dive into the implementation.&lt;/p&gt;

&lt;h4&gt;Configuration and dependency setup&lt;/h4&gt;

&lt;p&gt;We begin by adding the AppFunctions dependencies. One for the API and one for the Kotlin Symbol Processing compiler.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;implementation("androidx.appfunctions:appfunctions:1.0.0-alpha10")
ksp("androidx.appfunctions:appfunctions-compiler:1.0.0-alpha10")&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Modeling custom data types&lt;/h4&gt;

&lt;p&gt;Any custom object exchanged with the agent must be annotated with &lt;code&gt;@AppFunctionSerializable&lt;/code&gt;. In our &lt;a href="https://github.com/android/ai-samples/tree/main/jetpacker/android/feature/appfunctions/src/main/java/com/example/jetpacker/feature/appfunctions/TripSerializable.kt"&gt;TripSerializable.kt&lt;/a&gt; file, we define our trip data model:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@AppFunctionSerializable(isDescribedByKDoc = true)
data class TripSerializable(
    /** The trip's unique identifier. */
    val id: String,
    /** The trip's title. */
    val title: String,
    /** The trip's destination location. */
    val location: String,
    /** The trip's start date in milliseconds. */
    val startDate: Long,
    /** The trip's end date in milliseconds. */
    val endDate: Long,
    /** A list of participants. */
    val participants: List&amp;lt;String&amp;gt;,
)&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Providing features using the @AppFunction annotation&lt;/h4&gt;

&lt;p&gt;Next, the skill wrote the Kotlin functions that perform the database queries and annotate them with &lt;code&gt;@AppFunction&lt;/code&gt;. We can view this in searchTrip:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * Looks for trips based on optional filters like id, title (name), location, and dates.
 *
 * @param id The unique identifier of the trip.
 * @param title The title or name of the trip.
 * @param location The destination location.
 * @param startDate The minimum start date in milliseconds.
 * @param endDate The maximum end date in milliseconds.
 * @return A list of trips matching the filters.
 */
@AppFunction(isDescribedByKDoc = true)
suspend fun searchTrip(
    id: String? = null,
    title: String? = null,
    location: String? = null,
    startDate: Long? = null,
    endDate: Long? = null
): List&amp;lt;TripSerializable&amp;gt; {
    return withContext(Dispatchers.IO) {
    // implementation
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Since AppFunctions run on the UI thread by default, we use &lt;code&gt;withContext(Dispatchers.IO)&lt;/code&gt; to switch to a background dispatcher. Additionally, we refine our KDoc to use clear, imperative verbs and specify parameter constraints. This documentation compiles directly into the tool's schema, which the privileged agent uses to resolve parameters and handle runtime errors.&lt;/p&gt;

&lt;h4&gt;The service entry point and Hilt integration&lt;/h4&gt;

&lt;p&gt;To register these features with the intelligence system, we create an abstract base class that extends &lt;code&gt;AppFunctionService&lt;/code&gt;. We annotate it with &lt;code&gt;@AppFunctionServiceEntryPoint&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@RequiresApi(36)
@AndroidEntryPoint
@AppFunctionServiceEntryPoint(
    serviceName = "JetPackerAppFunctionService",
    appFunctionXmlFileName = "jetpacker_app_function_service"
)
abstract class BaseJetPackerAppFunctionService : AppFunctionService() {
    @Inject internal lateinit var tripDao: TripDao
    // DAOs and database references are injected here...
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;During compilation, KSP generates the final concrete service subclass, &lt;code&gt;JetPackerAppFunctionService&lt;/code&gt;, as declared with the &lt;code&gt;serviceName&lt;/code&gt; parameter. We also register &lt;code&gt;app_metadata.xml&lt;/code&gt; in the app's manifest. This file provides global operational rules for JetPacker's declared AppFunctions.&lt;/p&gt;

&lt;h2&gt;Testing and verifying your AppFunctions&lt;/h2&gt;

&lt;p&gt;Once implemented, you should verify that your AppFunctions are registered and working correctly.&lt;/p&gt;

&lt;p&gt;Running devices or emulators with Android 17 or newer, you can use ADB commands from your terminal to list and invoke your functions. Running &lt;code&gt;adb shell cmd app_function list-app-functions&lt;/code&gt; displays all registered functions for your package. You can then execute a specific function and test its database integration by running &lt;code&gt;adb shell cmd app_function execute-app-function&lt;/code&gt; while passing a raw JSON parameters string.&lt;/p&gt;

&lt;p&gt;Instead of these ADB commands, you can also use the &lt;a href="https://github.com/android/appfunctions"&gt;AppFunctions Testing Agent&lt;/a&gt; to inspect your configuration, list and execute AppFunctions, and even see how your AppFunctions behave in a real conversational flow.&lt;/p&gt;

&lt;h2&gt;Wrapping it up&lt;/h2&gt;

&lt;p&gt;When thinking about app features that can be contributed to the intelligence system using AppFunctions requires a slight shift in how we think about code and documentation. AppFunctions enable you to use this new interaction model for apps, which allows using an agent to access app features..&lt;/p&gt;

&lt;p&gt;First, the &lt;a href="https://github.com/android/skills/tree/main/device-ai/appfunctions"&gt;AppFunctions development skill&lt;/a&gt; is an essential lifecycle tool, helping you discover features, implement and refine AppFunctions for your apps. Second, KDoc comments are a compiled API asset; clear parameter descriptions directly impact the execution accuracy of the system agent. Finally, Android MCP provides local-first execution allowing apps to safely collaborate with AI agents.&lt;/p&gt;

&lt;p&gt;Contributing app features through AppFunctions makes your application ready for the intelligence system. Let us know how you are adapting your apps for the agentic era!&lt;/p&gt;

&lt;h2&gt;Learn more&lt;/h2&gt;

&lt;p&gt;Check out the other parts of this blog post series:&lt;br /&gt;&lt;b&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html"&gt;Part 1:&lt;/a&gt;&lt;/b&gt; Introduction of the app and a high-level overview.&lt;br /&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/android-on-device-inference.html"&gt;&lt;b&gt;Part 2:&lt;/b&gt;&lt;/a&gt; On-device intelligence. Deep-dive into ML Kit’s GenAI APIs and Gemini Nano to build privacy-first features like itinerary summarization, receipt parsing, and local audio processing.&lt;br /&gt;&lt;b&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-cloud-hybrid-inference.html"&gt;Part 3:&lt;/a&gt;&lt;/b&gt; Hybrid and cloud reasoning. Explore how to use Firebase AI Logic to ground LLM answers in real-world data like Google Maps and web context.&lt;br /&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-appfunctions.html"&gt;&lt;b&gt;Part 4 (this post!):&lt;/b&gt;&lt;/a&gt; System integration. Integrating with the Android intelligence system using AppFunctions. &lt;br /&gt;Part 5 (coming soon):&amp;nbsp;In-app agentic workflows. Extend the app with an end-to-end booking assistant powered by A2UI and ADK.&lt;/p&gt;

&lt;p&gt;Interested in more on Android Development? Follow Android Developers on &lt;a href="https://www.youtube.com/@AndroidDevelopers"&gt;YouTube&lt;/a&gt; or &lt;a href="https://www.linkedin.com/showcase/androiddev/"&gt;LinkedIn&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;
  All code snippets in this blog post follow the following copyright notice:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/5691330950466150364/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-appfunctions.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/5691330950466150364" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/5691330950466150364" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-appfunctions.html" rel="alternate" title="Build intelligent Android apps: Integrate into Android's intelligence system using AppFunctions" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi961epgT3N_Za_k2-pCJ30tegn7DM-Umh1LWh7Q4NxhryR5H57JB00zKQcek56ccAvEM95i6wyXWWCZZ7486_Gq1ewxPHtsMY13UVsVTmndAvkOJtHPjUXuZ3XW_yBEFtlOr2ocBFIKr0PCRZhIRs67h6bX6zDKihwcxQs8bGbYTqIp5azuBKcX4PNMMY/s72-c/AFD%20-%20%5BABL_104%5D%20JetPacker%20AppFunctions_Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-6562467341747115358</id><published>2026-07-21T06:00:00.000-07:00</published><updated>2026-07-21T09:57:02.378-07:00</updated><title type="text">Build intelligent Android apps: Introduction to Jetpacker</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigBFwd7rJO49I_puODKBWFqPbpHaGyL3CTFuZBbr0HTQConFnc3JP0dL9Rr_i6wmyW0o4Ku2bvv3SEacwpC3Vc6b7cYy0aRbZKdUDudFcraYO8zcBVkrMfbrfMP9How0J1xSi91xLnR4s5Z3s-Lp6RF2SA0gU56B9nXD0NkD_CU8MT6wbgBw1tRaMWcMo/s2469/0713%20Jetpacker%20Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigBFwd7rJO49I_puODKBWFqPbpHaGyL3CTFuZBbr0HTQConFnc3JP0dL9Rr_i6wmyW0o4Ku2bvv3SEacwpC3Vc6b7cYy0aRbZKdUDudFcraYO8zcBVkrMfbrfMP9How0J1xSi91xLnR4s5Z3s-Lp6RF2SA0gU56B9nXD0NkD_CU8MT6wbgBw1tRaMWcMo/s2469/0713%20Jetpacker%20Meta.png" style="display: none;" /&gt;
&lt;div&gt;&lt;i&gt;Posted by Jolanda Verhoef, Senior Developer Relations Engineer,&amp;nbsp;&lt;/i&gt;&lt;i&gt;Android Developer Relations&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFlbIY8mjuSzlWuS8mnGJ3v8Je-yrtFFaBHNXumMqS0rbaS32wv5HUhI4mv5pHT8ro0Rfb-duyMhK8_OeKnMyocY9s6GmC9_pgTEv6sgZoiaZpD00sODTTctYV8I4RHddKWcXAMUyTASk97cS1ysx4A2PFYB6PEeiHeN93BFgDiOTKH62ZJMig3kGP66E/s8583/0713%20Jetpacker%20Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2601" data-original-width="8583" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFlbIY8mjuSzlWuS8mnGJ3v8Je-yrtFFaBHNXumMqS0rbaS32wv5HUhI4mv5pHT8ro0Rfb-duyMhK8_OeKnMyocY9s6GmC9_pgTEv6sgZoiaZpD00sODTTctYV8I4RHddKWcXAMUyTASk97cS1ysx4A2PFYB6PEeiHeN93BFgDiOTKH62ZJMig3kGP66E/s1600/0713%20Jetpacker%20Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;p&gt;Building GenAI features in your app usually means navigating through various models, APIs and architecture choices:&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Execution location:&lt;/strong&gt; Where does your model run? On device, in the cloud, or both?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Complexity:&lt;/strong&gt; How complex is your setup? Are you doing a single inference call or do you need a more agentic flow?&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;In-app or Android System:&lt;/strong&gt; Should your feature be built into your Android app or does it fit better as an Android system integration?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this blog post series we'll navigate these choices with you. We will take you along on a journey, starting with a basic mobile app and transforming it into a &lt;b&gt;personalized&lt;/b&gt;, &lt;b&gt;intelligent&lt;/b&gt;, and &lt;b&gt;agentic&lt;/b&gt; experience.&lt;/p&gt;

&lt;h2&gt;Jetpacker: a demo travel app&lt;/h2&gt;
&lt;p&gt;Jetpacker is a &lt;b&gt;technical showcase app&lt;/b&gt; that our team built from the ground up for this year's Google I/O (built using Antigravity). At its core, Jetpacker helps users plan, explore, and enjoy their next big adventure. It shows an overview of your trips, the itinerary of each trip, and details of each event on that trip. Of course following all best practices of Android development, including a beautifully expressive Material UI design.&lt;/p&gt;&lt;div style="height: 0px; max-width: 100%; overflow: hidden; padding-bottom: 56.25%; position: relative;"&gt;
  &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" src="https://www.youtube-nocookie.com/embed/_iuXykdlTkk" style="height: 100%; left: 0; position: absolute; top: 0; width: 100%;" title="YouTube video player"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;And best of all? It's fully &lt;a href="https://github.com/android/ai-samples/tree/main/jetpacker" target="_blank"&gt;open source&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Today we are publishing a series of&lt;b&gt; technical blog posts&lt;/b&gt; diving deep into each of these features. We’ll provide detailed implementation steps, code snippets, and architectural insights to help you build your own intelligent Android applications.&lt;/p&gt;

&lt;h2&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/android-on-device-inference.html"&gt;On-device intelligence&lt;/a&gt;&lt;/h2&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7d4EqOTEFypjsqmFoZ8h-zPw3QqQkNY1F_vdbJ98vv1QJCqIE8P-reC0fttcMfNk05g3kGSLhGXVaeiOQDqARK6ptNhFe43miZgTNSmdF7V5hh6u4PhjQleWXmxDqkAf5YKPPyBU14V9z_wFfkiwVDCHN0rkLDtbZCGnb6Jq8d7Iu3YRVgDd9fcMeTiA/s1848/on-device-features.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1256" data-original-width="1848" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7d4EqOTEFypjsqmFoZ8h-zPw3QqQkNY1F_vdbJ98vv1QJCqIE8P-reC0fttcMfNk05g3kGSLhGXVaeiOQDqARK6ptNhFe43miZgTNSmdF7V5hh6u4PhjQleWXmxDqkAf5YKPPyBU14V9z_wFfkiwVDCHN0rkLDtbZCGnb6Jq8d7Iu3YRVgDd9fcMeTiA/s1600/on-device-features.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;On-device features in Jetpacker: Summarizing trip itineraries, managing expenses, and voice notes&lt;/i&gt;&lt;/div&gt;&lt;p&gt;Using an on-device model comes with &lt;b&gt;no additional cloud inference&lt;/b&gt; costs, means you don't have to worry about &lt;b&gt;internet connectivity&lt;/b&gt;, and lets users be confident that private information will be &lt;b&gt;processed locally&lt;/b&gt;, on the device, without any of their data being sent to the cloud.&lt;/p&gt;

&lt;p&gt;In Jetpacker, we chose on-device inference for three of our features:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The &lt;b&gt;trip overview&lt;/b&gt; feature transforms a messy, multi-day itinerary into a concise, actionable summary. It leverages Gemini Nano through the &lt;a href="https://developers.google.com/ml-kit/genai/prompt/android"&gt;ML Kit GenAI APIs&lt;/a&gt; to process data locally on the device. We consider this a nice-to-have feature where we don't want to incur extra cloud costs, making on-device inference the right choice.&lt;/li&gt;
  &lt;li&gt;The &lt;b&gt;expense tracker&lt;/b&gt; automatically extracts structured data from receipt images to help users track their travel spending. It uses the &lt;a href="https://developers.google.com/ml-kit/genai/prompt/android/get-started#provide-multimodal"&gt;multimodal capabilities&lt;/a&gt; of Gemini Nano 4 through the ML Kit GenAI APIs. We choose an on-device solution so that any privacy-sensitive information on the receipt images never leaves the user's device.&lt;/li&gt;
  &lt;li&gt;The &lt;b&gt;audio diary &lt;/b&gt;records, transcribes, and categorizes voice notes into relevant trip activities. It is powered by the &lt;a href="https://developers.google.com/ml-kit/genai/speech-recognition/android"&gt;ML Kit Speech Recognition&lt;/a&gt; and &lt;a href="https://developers.google.com/ml-kit/genai/prompt/android/get-started"&gt;GenAI Prompt APIs&lt;/a&gt;. We chose an on-device solution for privacy and connectivity reasons.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-cloud-hybrid-inference.html" target="_blank"&gt;Cloud &amp;amp; hybrid inference&lt;/a&gt;&lt;/h2&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFPZiA1Obbj1gQKJ6S-U4UCR-jiUjasFY3jGQPeBRS27JJD5DzDIpGseazaNR3qcXR6xtYck8RYqKd0jgHGXVnfqQiPkW7jWVgTB_Hkds5EZcQDjosBZc7Ma9A-JaRaLeVxzEpTXYwSkalIyOIt-WQ_kqdlAvpDH1nB0Ajv7FdFJJ50aBOhP7a0p_RvN4/s2722/cloud-hybrid-features.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1632" data-original-width="2722" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFPZiA1Obbj1gQKJ6S-U4UCR-jiUjasFY3jGQPeBRS27JJD5DzDIpGseazaNR3qcXR6xtYck8RYqKd0jgHGXVnfqQiPkW7jWVgTB_Hkds5EZcQDjosBZc7Ma9A-JaRaLeVxzEpTXYwSkalIyOIt-WQ_kqdlAvpDH1nB0Ajv7FdFJJ50aBOhP7a0p_RvN4/s1600/cloud-hybrid-features.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;i&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Cloud and hybrid features in Jetpacker: Museum assistant with web grounding, hybrid restaurant review drafting, and hotel support chat featuring custom-routed live translation.&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;p&gt;Sometimes your use-case requires AI models with &lt;b&gt;greater world knowledge&lt;/b&gt; or a much &lt;b&gt;larger context window&lt;/b&gt; and with greater ability in &lt;b&gt;handling complex tasks&lt;/b&gt;. In that case, we can switch from running an on-device model to using a cloud model instead.&lt;/p&gt;

&lt;p&gt;Or, if you want to get the best of both worlds, you can use hybrid inference to &lt;b&gt;dynamically choose&lt;/b&gt; either a cloud or on-device model at runtime. This allows us to &lt;b&gt;lower costs&lt;/b&gt; by moving inference to the device when it is available, but at the same time &lt;b&gt;support all Android devices&lt;/b&gt; running the app.&lt;/p&gt;

&lt;p&gt;In Jetpacker, we implemented several features using cloud or hybrid inference:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The &lt;b&gt;place Q&amp;amp;A&lt;/b&gt; feature answers user questions about specific locations by grounding responses in real-world data. It uses &lt;a href="https://firebase.google.com/docs/ai-logic"&gt;Firebase AI Logic&lt;/a&gt; integrated with &lt;a href="https://firebase.google.com/docs/ai-logic/grounding-google-maps"&gt;Google Maps&lt;/a&gt; and &lt;a href="https://firebase.google.com/docs/ai-logic/grounding-google-search"&gt;web context&lt;/a&gt;. Using a cloud model is necessary here for its greater world knowledge.&lt;/li&gt;
  &lt;li&gt;The &lt;b&gt;review drafting&lt;/b&gt; feature helps users compose detailed reviews for the places they have visited. It leverages both on-device and cloud models through Firebase AI Logic's new &lt;a href="https://firebase.google.com/docs/ai-logic/hybrid/android/get-started"&gt;Hybrid inference API&lt;/a&gt;. This is a feature we wanted to make available to all app users, so we're using a cloud model as a fallback when an on-device model is unavailable.&lt;/li&gt;
  &lt;li&gt;The &lt;b&gt;automatic chat translation&lt;/b&gt; dynamically translates chat messages in real time to facilitate seamless communication, demonstrating custom hybrid inference logic. Again, we want this feature to be available to all app users, but at the same time have some specific considerations on when to choose on-device versus cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-appfunctions.html"&gt;System integration&lt;/a&gt;&lt;/h2&gt;&lt;div style="height: 0px; max-width: 100%; overflow: hidden; padding-bottom: 56.25%; position: relative;"&gt;
  &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" src="https://www.youtube-nocookie.com/embed/qtQMH8RBYIo" style="height: 100%; left: 0; position: absolute; top: 0; width: 100%;" title="YouTube video player"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;While not a feature you see in the app itself, the Android system integration opens up the app's core capabilities directly to the Android operating system. It uses the &lt;a href="https://developer.android.com/ai/appfunctions"&gt;AppFunctions API&lt;/a&gt; to integrate with system-level intelligence.&lt;/p&gt;

&lt;h2&gt;In-app agentic workflows (coming soon!)&lt;/h2&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3YAW_TWepCinuAvHQ7i9JKfhWtf-GSggI6CtD0Qp7-nfPA7UTmmYHTAtsEybWlmiPgxZqo_fUlqc44dmF_5WWH4tlTRze8qdsm9Jc5ARwL5k_PJjU1VTcAHRE3EdxL4JHSnsCt4VCzwPaR41LM34048icLNZLE1kUhpLTeiGpDH87Bh7utPJmXS4kn_8/s1618/agentic-feature-booking-assistant%20(1).png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1618" data-original-width="844" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3YAW_TWepCinuAvHQ7i9JKfhWtf-GSggI6CtD0Qp7-nfPA7UTmmYHTAtsEybWlmiPgxZqo_fUlqc44dmF_5WWH4tlTRze8qdsm9Jc5ARwL5k_PJjU1VTcAHRE3EdxL4JHSnsCt4VCzwPaR41LM34048icLNZLE1kUhpLTeiGpDH87Bh7utPJmXS4kn_8/w209-h400/agentic-feature-booking-assistant%20(1).png" width="209" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;The booking assistant shows several in-progress flight bookings, asking the user for input before making a final booking.&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;p&gt;Agenticness introduces a higher level of&lt;b&gt; autonomy&lt;/b&gt;, enabling models to act as agents. Instead of a single inference call, an agent works towards a specific goal via an orchestration loop that allows it to &lt;b&gt;reason&lt;/b&gt;, use &lt;b&gt;tools&lt;/b&gt;, and &lt;b&gt;adapt &lt;/b&gt;its path. Depending on your requirements, these intelligent agents can run either in the cloud, directly on-device, or in a hybrid setup.&lt;/p&gt;

&lt;p&gt;For Jetpacker we added a &lt;b&gt;booking assistant&lt;/b&gt; that automates end-to-end booking workflows directly within the application to streamline reservations. It is built using &lt;a href="https://a2ui.org/"&gt;A2UI&lt;/a&gt; and &lt;a href="https://adk.dev/"&gt;ADK&lt;/a&gt; running in the cloud. The Android app functions as a front-end to the multi-agentic system running in the cloud.&lt;/p&gt;

&lt;h2&gt;Learn more&lt;/h2&gt;
&lt;p&gt;Check out the other parts of this blog post series:&lt;/p&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html"&gt;&lt;b&gt;Part 1 (this post!):&lt;/b&gt;&lt;/a&gt; Introduction of the app and a high-level overview.&lt;br /&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/android-on-device-inference.html"&gt;&lt;b&gt;Part 2:&lt;/b&gt;&lt;/a&gt; On-device intelligence. Deep-dive into ML Kit’s GenAI APIs and Gemini Nano to build privacy-first features like itinerary summarization, receipt parsing, and local audio processing.&lt;br /&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-cloud-hybrid-inference.html"&gt;&lt;b&gt;Part 3:&lt;/b&gt;&lt;/a&gt; Hybrid and cloud reasoning. Explore how to use Firebase AI Logic to ground LLM answers in real-world data like Google Maps and web context.&lt;br /&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-appfunctions.html"&gt;&lt;b&gt;Part 4:&lt;/b&gt;&lt;/a&gt; System integration. Integrating with the Android intelligence system using AppFunctions.&lt;br /&gt;Part 5 (coming soon): In-app agentic workflows. Extend the app with an end-to-end booking assistant powered by A2UI and ADK.&lt;p&gt;Interested in more on Android Development? Follow Android Developers on &lt;a href="https://www.youtube.com/@AndroidDevelopers"&gt;YouTube&lt;/a&gt; or &lt;a href="https://www.linkedin.com/showcase/androiddev/"&gt;LinkedIn&lt;/a&gt;!&lt;/p&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/6562467341747115358/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/6562467341747115358" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/6562467341747115358" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html" rel="alternate" title="Build intelligent Android apps: Introduction to Jetpacker" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigBFwd7rJO49I_puODKBWFqPbpHaGyL3CTFuZBbr0HTQConFnc3JP0dL9Rr_i6wmyW0o4Ku2bvv3SEacwpC3Vc6b7cYy0aRbZKdUDudFcraYO8zcBVkrMfbrfMP9How0J1xSi91xLnR4s5Z3s-Lp6RF2SA0gU56B9nXD0NkD_CU8MT6wbgBw1tRaMWcMo/s72-c/0713%20Jetpacker%20Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-6917221086083477701</id><published>2026-07-21T06:00:00.000-07:00</published><updated>2026-07-21T09:57:46.319-07:00</updated><title type="text">Build intelligent Android apps: On-device inference</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd7g4aJ0ZhzVcuPr3SzBJIVQ_MZT3hIXb1Ff8SVjjrvRjYzZwhgoE7IbHryS6Ds7u7if1_tmVmMdkFNAtPADXoeuRQ_64Pxfnp3oq2aHR8hbS3fDExGxE0nSiOvXPw7SonhNdjFNI2eDJfasEEMs0xjh2gZlyPq6ToimvFlaMv2-nVDz_XLnSXK1iCn4U/s2469/0625%20Building%20JetPacker%20with%20Intelligent%20On-Device%20features_Meta%20v02.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd7g4aJ0ZhzVcuPr3SzBJIVQ_MZT3hIXb1Ff8SVjjrvRjYzZwhgoE7IbHryS6Ds7u7if1_tmVmMdkFNAtPADXoeuRQ_64Pxfnp3oq2aHR8hbS3fDExGxE0nSiOvXPw7SonhNdjFNI2eDJfasEEMs0xjh2gZlyPq6ToimvFlaMv2-nVDz_XLnSXK1iCn4U/s2469/0625%20Building%20JetPacker%20with%20Intelligent%20On-Device%20features_Meta%20v02.png" style="display: none;" /&gt;&lt;div&gt;&lt;i&gt;Posted by Caren Chang, Developer Relations Engineer, Android Developer Relations&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIU-6haqWEXnugbhG5is8t1TU0tN3EkfSc7GwvHMRsMSU14k-P7q4il_nJlGk-qNP_PG3aKs1LDWNgWKqhFsG6Q16v2zeoHMvqY_PesC5ddxHRjTGgtiQ33uvOrUIPkSdUgFfBIYSkqBhcuZJTY8jbW0mOjKs8XF8DLxfyD7CjJ1Sd4FM7AUrufTnSEVw/s8582/0625%20Building%20JetPacker%20with%20Intelligent%20On-Device%20features_Blog%20v02.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2601" data-original-width="8582" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIU-6haqWEXnugbhG5is8t1TU0tN3EkfSc7GwvHMRsMSU14k-P7q4il_nJlGk-qNP_PG3aKs1LDWNgWKqhFsG6Q16v2zeoHMvqY_PesC5ddxHRjTGgtiQ33uvOrUIPkSdUgFfBIYSkqBhcuZJTY8jbW0mOjKs8XF8DLxfyD7CjJ1Sd4FM7AUrufTnSEVw/s1600/0625%20Building%20JetPacker%20with%20Intelligent%20On-Device%20features_Blog%20v02.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;p&gt;Welcome back to the blog post series "&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html" target="_blank"&gt;Build intelligent Android apps&lt;/a&gt;" where we take a basic Android app and transform it into a &lt;b&gt;personalized, intelligent, &lt;/b&gt;and &lt;b&gt;agentic &lt;/b&gt;experience. In our &lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html" target="_blank"&gt;previous post we introduced Jetpacker&lt;/a&gt;, the demo app we'll use throughout this series.&lt;/p&gt;

&lt;p&gt;In this blog post, we will share how you can use Gemini Nano through &lt;a href="https://developers.google.com/ml-kit/genai/prompt/android"&gt;ML Kit’s Prompt API&lt;/a&gt; to build intelligent on-device features.&lt;/p&gt;
&lt;div style="height: 0px; margin: 0px auto; max-width: 853px; overflow: hidden; padding-bottom: 56.25%; position: relative;"&gt;
  &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" src="https://www.youtube-nocookie.com/embed/_iuXykdlTkk" style="height: 100%; left: 0; position: absolute; top: 0; width: 100%;" title="YouTube video player"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;Building intelligent on-device features refers to the ability to process prompts and data directly on a device without sending data to a server. This offers a few advantages:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;User data can be processed &lt;b&gt;locally&lt;/b&gt; on the device, preserving user privacy&lt;/li&gt;
  &lt;li&gt;Functionality of the model is &lt;b&gt;reliable&lt;/b&gt; even with spotty or no internet connection&lt;/li&gt;
  &lt;li&gt;No additional cloud inference &lt;b&gt;cost&lt;/b&gt;, since everything runs on the user’s hardware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the benefits of on-device in mind, we identified three features to add in Jetpacker that can improve the user experience: summarizing trip itineraries, managing expenses, and capturing voice notes.&lt;/p&gt;

&lt;h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3FDrGSpGJqSapXXQ7052s1NR8rzvmmW-xbyOaAcg8bdTA6ZH7p6ZWE664FjlaoDLfREd-RlQil7gV-VjnCoq76o06haLoSxBzlIDAvM-dKvm_TCgPvqHU3ZlzBTXZ9XtAyMk26QWB8PvU5aUmzO0RBuMxqxJdC1wk7xl_1PXd1KHvuMCeHeAP9zhgSjg/s1848/Screenshot%202026-07-02%20at%2012.57.08%E2%80%AFPM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1256" data-original-width="1848" height="434" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3FDrGSpGJqSapXXQ7052s1NR8rzvmmW-xbyOaAcg8bdTA6ZH7p6ZWE664FjlaoDLfREd-RlQil7gV-VjnCoq76o06haLoSxBzlIDAvM-dKvm_TCgPvqHU3ZlzBTXZ9XtAyMk26QWB8PvU5aUmzO0RBuMxqxJdC1wk7xl_1PXd1KHvuMCeHeAP9zhgSjg/w640-h434/Screenshot%202026-07-02%20at%2012.57.08%E2%80%AFPM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;On-device features in Jetpacker: Summarizing trip itineraries, managing expenses, and voice notes&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;High quality tailored summarization of short texts&lt;/h2&gt;

&lt;p&gt;The itinerary screen gives users a quick overview of all activities for a given trip. Since this screen contains a lot of information, it can quickly become overwhelming. To help users prepare without feeling overwhelmed, we can add a ‘&lt;b&gt;Get ready for your trip&lt;/b&gt;’ section at the top.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;em&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtWrJplvxl7ymB4kMN_Tg4tYYkL7G1Ory0hSptzqsbw_xCu4I9l_4SQPQ9CUXs_Jc7qtT1KcpltBds0aYgIvXiK_-qp6fnoX3QmYnGyqGgr2d5f2uzQkyMK-_Iebwp9Ap0aJA4c8Pz4Zy01O5AM6kk_qZ4Blx_bY-_2xIxSA8DMva2LWBbCN_Hb_c37KE/s2499/Screenshot_20260702_111934.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2499" data-original-width="1183" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtWrJplvxl7ymB4kMN_Tg4tYYkL7G1Ory0hSptzqsbw_xCu4I9l_4SQPQ9CUXs_Jc7qtT1KcpltBds0aYgIvXiK_-qp6fnoX3QmYnGyqGgr2d5f2uzQkyMK-_Iebwp9Ap0aJA4c8Pz4Zy01O5AM6kk_qZ4Blx_bY-_2xIxSA8DMva2LWBbCN_Hb_c37KE/w189-h400/Screenshot_20260702_111934.png" width="189" /&gt;&lt;/a&gt;&lt;/em&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;The romantic Paris trip is summarized as a classic Parisian adventure blending art, sights, and delicious food. A tip and some useful phrases are also added.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;

&lt;p&gt;By inputting a trip itinerary and asking an LLM to summarize it, we can generate a quick summary of the trip along with packing tips and useful local phrases. This is a great use case for an on-device model for several reasons:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Performance and quality&lt;/b&gt;: Both the input and output text are relatively short. With that, we can expect the performance and quality of an on-device solution to be on par with more powerful cloud models.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Scalability&lt;/b&gt;: Shifting inference on-device allows us to scale this feature from a few users to millions without worrying about managing increasing cloud inference costs.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Low latency and reliability&lt;/b&gt;: On-device inference guarantees low latency, providing a reliable experience even when users are offline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To build with on-device, we use &lt;b&gt;Gemini Nano&lt;/b&gt;, Google’s most efficient model optimized for mobile devices. Gemini Nano was first introduced a few years ago, and is now running on over 140 million devices. The latest version of the model, &lt;a href="https://android-developers.googleblog.com/2026/04/AI-Core-Developer-Preview.html"&gt;Gemini Nano 4, is built on the architecture foundation of the recently released Gemma 4 model&lt;/a&gt;, and is further optimized for maximum battery and performance efficiency.&lt;/p&gt;

&lt;p&gt;Using ML Kit’s &lt;b&gt;Prompt API&lt;/b&gt;, we can take advantage of Gemini Nano 4’s new model capabilities to prototype our on-device features. We’ll create a prompt that includes the itinerary of a trip and ask the model to generate a summary along with any preparation tips.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3") 

// Define the configuration for Gemini Nano 4 E2B preview model
val previewFastConfig = generationConfig {
    modelConfig = modelConfig {
        releaseStage = ModelReleaseStage.PREVIEW
        preference = ModelPreference.FAST
    }
}

val geminiNano2BPreviewModel = Generation.getClient(previewFastConfig)

val tripItinerary = ...

val getReadyForYourTripSummary = geminiNano2BPreviewModel
 .generateContent("Given this trip itinerary: $tripItinerary, 
     generate the following: overall vibe, tips on how to prepare for this
     trip, and common short phrases to learn for the trip.")&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finding the optimal prompt usually requires some iteration, and the AICore app is perfect for this step in the process. After opting into the &lt;a href="https://developers.google.com/ml-kit/genai/aicore-dev-preview"&gt;developer preview option for AICore&lt;/a&gt;, we can download preview models such as Gemini Nano 4 to test prompts and see the model’s expected outputs. With a few iterations on the prompt, we were able to improve the speed of the response from 13 seconds to under 2 seconds! Check out the final code implementation and prompt &lt;a href="https://github.com/android/ai-samples/blob/40b999ef0e85693eac4de06e58335f0f5f125fa6/jetpacker/android/feature/trip/itinerary/enrichment/src/main/kotlin/com/example/jetpacker/feature/itinerary_enrichment/TripSummaryAndTipsProviderImpl.kt#L100" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaY2Q7rzlrAj2i410lc3qqtKwI3m6ufAi27R5S94LVFJKEJPnxmvShIcAWdD_Cx9lhTz9tmKW_DVcmNg0rZFBKpqYj0M9niFJwa-AurlyV2SHuErI7Z9H59Q9S936I4ErUQ_NFRNSJpUBXwDVmw6vKNVpIkBrYPJNUpCIyNXl5Z17x7jEl5Kn9BGgFuLg/s553/Screen%20Recording%202026-07-02%20at%2012.28.51%E2%80%AFPM.gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="553" data-original-width="496" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaY2Q7rzlrAj2i410lc3qqtKwI3m6ufAi27R5S94LVFJKEJPnxmvShIcAWdD_Cx9lhTz9tmKW_DVcmNg0rZFBKpqYj0M9niFJwa-AurlyV2SHuErI7Z9H59Q9S936I4ErUQ_NFRNSJpUBXwDVmw6vKNVpIkBrYPJNUpCIyNXl5Z17x7jEl5Kn9BGgFuLg/w359-h400/Screen%20Recording%202026-07-02%20at%2012.28.51%E2%80%AFPM.gif" width="359" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;The first iteration of our prompt generated way too many tokens, and optimizing it helped keep responses quick and to the point.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;

&lt;h2&gt;Local processing for sensitive user input&lt;/h2&gt;

&lt;p&gt;Next, to help users enjoy their trip even more, we’ll build a simple expense manager that takes the manual work out of sorting through receipts and calculating budgets.&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsHCjYJhDefKk1_FHnyB8mXO6XGrVWPrWkkxUikHNrWly2YqLjD8GyN-qGXOBlZCJPug-VbVgBr8awg8I-TEl6d9udKhq_zKem9Xcdb7FzFlA4B77Iko2Rbf8R0XIPB30owcMoh-7KJ1paQnzDrNHSdvwYotNxt166QqJdNAf1d8wEwIFkL9qIEYUKmoQ/s1282/7.13_BlogGif_Transparent.gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1282" data-original-width="613" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsHCjYJhDefKk1_FHnyB8mXO6XGrVWPrWkkxUikHNrWly2YqLjD8GyN-qGXOBlZCJPug-VbVgBr8awg8I-TEl6d9udKhq_zKem9Xcdb7FzFlA4B77Iko2Rbf8R0XIPB30owcMoh-7KJ1paQnzDrNHSdvwYotNxt166QqJdNAf1d8wEwIFkL9qIEYUKmoQ/w191-h400/7.13_BlogGif_Transparent.gif" width="191" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
  
&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;Taking a photo of a restaurant bill, data is parsed and shown in the expense overview screen of the app.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;Since receipts might contain sensitive information like credit card number and addresses, this is another great use case for an on-device solution. With on-device, users can be confident that private information will be processed locally on the device without any of their data being sent to the cloud.&lt;/p&gt;

&lt;p&gt;In addition, Gemini Nano 4 has improved model capabilities for multimodality, especially for image understanding tasks like OCR and visual data extraction, making it a great solution for tasks like extracting information from receipts.&lt;/p&gt;

&lt;p&gt;For this use case, the prompt will analyze an image of the receipt, and output information such as: a generated title, amount spent and category of the expense. To ensure the model outputs the information in the preferred format, we can use &lt;a href="https://developers.google.com/ml-kit/genai/prompt/android/structured-output"&gt;ML Kit’s Structured Output API&lt;/a&gt; to seamlessly output a Kotlin data object that we define.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3")
// ksp("com.google.mlkit:genai-schema-compiler:1.0.0-alpha1")

@Generable("Information extracted from an expense receipt")
data class ParsedReceipt(
  @Guide("Generated title for the expense less than 6 words. Based on restaurant or activity name.")
  val title: String,
  @Guide("Total amount of the expense. Look for values at the bottom and words like total or balance due.")
  val amount: Double,
  @Guide("Type of expense", enumValues = ["travel", "food", "shopping", "entertainment", "other"])
  val category: String,
)

val prompt = "Determine if the image is a receipt or expense. 
    If it is NOT a receipt or expense, output the text 'NOT_A_RECEIPT'.
    Otherwise, parse the receipt information."

val request = generateContentRequest(ImagePart(bitmap), TextPart(prompt)) {}
val requestWithStructuredOutput = generateTypedContentRequest(request, ParsedReceipt::class)

// Define the configuration for Gemini Nano 4 E4B preview model  
// When selecting models, you can specify which performance charactertists are most important
//  for your use case. Use ModelPreference.FULL when you want to prioritize reasoning power over speed. 
//  Use ModelPreference.FAST when complex logic is not required and latency is a priority.
val previewFullConfig = generationConfig {
    modelConfig = modelConfig {
        releaseStage = ModelReleaseStage.PREVIEW
        preference = ModelPreference.FULL
    }
}

val geminiNano4BPreviewModel = Generation.getClient(previewFullConfig)
val response = geminiNano4BPreviewModel.generateContent(requestWithStructuredOutput)
val parsedReceipt: ParsedReceipt? = response.candidates.firstOrNull()?.response&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Multimodal input&lt;/h2&gt;

&lt;p&gt;Lastly, to help users record audio memos during the trip, let’s build a fully on-device voice notes feature. Using &lt;a href="https://developers.google.com/ml-kit/genai/speech-recognition/android"&gt;ML Kit’s Speech Recognition API&lt;/a&gt;, we’ll enable users to record short voice notes that are automatically transcribed to text. With the transcribed text, we’ll use ML Kit’s Prompt API to identify which trip activity is associated with the recorded voice note, letting users easily recap their trip as they scroll through the trip’s itinerary.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnAm4XPVEJkfPmRFKJWh2sS-4rVz_eFollYxU5DWb7kAkSQdP4xhAEosziS_vpxv6yoAkvHiSp6SGYOp2_qp_cJWgfbJGnDOadaMP6Bc30a6rYnSP34sEubNAWXqsmd3cpYOoL8rCUhQn0_4GT3165aSFinlnHZjVnXYNYBAw8AdVtJpuRG2gDbi-uRII/s2499/Screenshot_20260702_115529.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2499" data-original-width="1183" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnAm4XPVEJkfPmRFKJWh2sS-4rVz_eFollYxU5DWb7kAkSQdP4xhAEosziS_vpxv6yoAkvHiSp6SGYOp2_qp_cJWgfbJGnDOadaMP6Bc30a6rYnSP34sEubNAWXqsmd3cpYOoL8rCUhQn0_4GT3165aSFinlnHZjVnXYNYBAw8AdVtJpuRG2gDbi-uRII/w189-h400/Screenshot_20260702_115529.png" width="189" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p style="text-align: center;"&gt;&lt;em&gt;The Roman holiday itinerary shows voice note extracts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://developers.google.com/ml-kit/genai/speech-recognition/android"&gt;ML Kit GenAI Speech Recognition API &lt;/a&gt;allows you to transcribe audio content to text fully on-device using two distinct modes. &lt;b&gt;Basic mode&lt;/b&gt; uses a traditional on-device speech recognition model and is available on most Android devices with API level 31 and higher. &lt;b&gt;Advanced mode&lt;/b&gt; uses Gemini Nano to offer broader language coverage and better quality, and is currently supported on Pixel 10 devices.&lt;/p&gt;

&lt;p&gt;For our feature we combine the Speech Recognition API with the ML Kit GenAI Prompt API:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3")
// implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha1")

val tripEvents = ... 

// Set up speech recognition
val speechRecognizerOptions =
    speechRecognizerOptions {
        locale = Locale.US
        preferredMode = SpeechRecognizerOptions.Mode.MODE_ADVANCED
    }
val speechRecognizer: SpeechRecognizer = SpeechRecognition.getClient(speechRecognizerOptions)

suspend fun transcribeVoiceNote(recognizer: SpeechRecognizer) {
    // Display partial text as the user is recording audio
    var partialTextResponse = ""

    // Display the full text once user is finished recording audio
    var transcription = ""

    val request: SpeechRecognizerRequest
        = speechRecognizerRequest { audioSource = AudioSource.fromMic() }
    recognizer.startRecognition(request).collect { response -&amp;gt;
        when (response) {
            is SpeechRecognizerResponse.PartialTextResponse -&amp;gt; {
                partialTextResponse = response.text
            }
            is SpeechRecognizerResponse.FinalTextResponse -&amp;gt; {
                transcription = response.text
                processAndCategorizeVoiceNote(transcription, tripEvents)
            }
        }
    }
}

fun processAndCategorizeVoiceNote(transcribedVoiceNote: String, events: List&lt;event&gt;) {
    val prompt = "Given the voice note $transcribedVoiceNote
     and the following events for this trip: $events, rewrite this transcription
     to remove filler words. Then, identify which events from the
     list this rewritten transcription matches to."

     // Utilize ML Kit's Prompt API to process voice note and tag it with the relevant trip activities
     Generation.getClient().generateContent(prompt)
}&lt;/event&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Using ML Kit’s GenAI APIs, we were able to take advantage of Gemini Nano to develop fully on-device intelligent features for the JetPacker app, and provide an improved user experience without any additional cloud costs.&lt;/p&gt;

&lt;p&gt;Check out the full source code for &lt;a href="https://github.com/android/ai-samples/tree/main/jetpacker" target="_blank"&gt;Jetpacker on Github&lt;/a&gt;, and watch the video &lt;a href="https://www.youtube.com/watch?v=_iuXykdlTkk"&gt;Build Intelligent Android apps with Google’s AI&lt;/a&gt; to learn more about how to integrate intelligent features directly into your app using on-device models, cloud-powered reasoning, and the latest agentic frameworks.&lt;/p&gt;&lt;h2&gt;Learn more&lt;/h2&gt;

&lt;p&gt;Check out the other parts of this blog post series:&lt;/p&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-introduction-jetpack.html"&gt;&lt;b&gt;Part 1:&lt;/b&gt;&lt;/a&gt; Introduction of the app and a high-level overview.&lt;br /&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/android-on-device-inference.html"&gt;&lt;b&gt;Part 2 (this post!):&lt;/b&gt;&lt;/a&gt;&amp;nbsp;On-device intelligence. Deep-dive into ML Kit’s GenAI APIs and Gemini Nano to build privacy-first features like itinerary summarization, receipt parsing, and local audio processing.&lt;br /&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-cloud-hybrid-inference.html"&gt;&lt;b&gt;Part 3:&lt;/b&gt; &lt;/a&gt;Hybrid and cloud reasoning. Explore how to use Firebase AI Logic to ground LLM answers in real-world data like Google Maps and web context.&lt;br /&gt;&lt;a href="http://android-developers.googleblog.com/2026/07/build-intelligent-android-apps-appfunctions.html"&gt;&lt;b&gt;Part 4:&lt;/b&gt;&lt;/a&gt; System integration. Integrating with the Android intelligence system using AppFunctions.&lt;br /&gt;Part 5 (coming soon): In-app agentic workflows. Extend the app with an end-to-end booking assistant powered by A2UI and ADK.

&lt;p&gt;Interested in more on Android Development? Follow Android Developers on &lt;a href="https://www.youtube.com/@AndroidDevelopers"&gt;YouTube&lt;/a&gt; or &lt;a href="https://www.linkedin.com/showcase/androiddev/"&gt;LinkedIn&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;All code snippets in this blog post follow the following copyright notice:&lt;br /&gt;
&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/6917221086083477701/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/android-on-device-inference.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/6917221086083477701" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/6917221086083477701" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/android-on-device-inference.html" rel="alternate" title="Build intelligent Android apps: On-device inference" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd7g4aJ0ZhzVcuPr3SzBJIVQ_MZT3hIXb1Ff8SVjjrvRjYzZwhgoE7IbHryS6Ds7u7if1_tmVmMdkFNAtPADXoeuRQ_64Pxfnp3oq2aHR8hbS3fDExGxE0nSiOvXPw7SonhNdjFNI2eDJfasEEMs0xjh2gZlyPq6ToimvFlaMv2-nVDz_XLnSXK1iCn4U/s72-c/0625%20Building%20JetPacker%20with%20Intelligent%20On-Device%20features_Meta%20v02.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-494275494579598458</id><published>2026-07-20T06:00:00.000-07:00</published><updated>2026-07-20T09:00:55.199-07:00</updated><title type="text">Upcoming Changes to the Nearby Connections API</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBTEW5VPkXYGqZfx-TbWnVWxTk9AQIL8sALc8flpOeFh0cKmglsMQvlLpFfLk1Hk5dGxbj96UE_vLtNjxH91AIS583psy8RmP91l0TYuP2hXJPt5c-IZGmmU66d9FNlu9T-s9myFA9_uoQ60n-uy1DK96flaQSUkjh1nN2z3jMKOL4qMPg14XOlpH122Y/s2469/Upcoming%20Changes%20to%20the%20Nearby%20Connections%20API%20_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;&lt;i&gt;Posted by Wei Wang, Engineering Manager, Android BeTo&lt;/i&gt;

&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG84rk4vo20t7pFUGFUp6Cx38qbJTZWW5Q5ztSfPOaV474gZ4mnT7qpnC6o4hKJkwR6CiD4TwPWCS0aU-w0nr70WkKrcpR2yRM5PXnMDa9t3mjgQVahNBzLijD2v23LiDj_NaMWoyVXWTV3cKXHsForureZTA1_Q5M_03ZAve7PybnhpYpGG05IS2uCv0/s8583/Upcoming%20Changes%20to%20the%20Nearby%20Connections%20API%20_Blog.png" style="clear: left; float: left; margin-bottom: 0.3em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2600" data-original-width="8583" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG84rk4vo20t7pFUGFUp6Cx38qbJTZWW5Q5ztSfPOaV474gZ4mnT7qpnC6o4hKJkwR6CiD4TwPWCS0aU-w0nr70WkKrcpR2yRM5PXnMDa9t3mjgQVahNBzLijD2v23LiDj_NaMWoyVXWTV3cKXHsForureZTA1_Q5M_03ZAve7PybnhpYpGG05IS2uCv0/s1600/Upcoming%20Changes%20to%20the%20Nearby%20Connections%20API%20_Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p style="margin-bottom: 0.3em; margin-top: 0.3em;"&gt;User privacy and transparency are core to the Android experience. To better align with these principles, we are updating the default behavior of the Nearby Connections API regarding how it interacts with device radios.&lt;/p&gt;

&lt;h2 style="margin-bottom: 0.5em; margin-top: 1.5em;"&gt;What is changing?&lt;/h2&gt;
&lt;p style="margin-bottom: 0.3em; margin-top: 0.1em;"&gt;Previously, the Nearby Connections API could automatically toggle Wi-Fi and Bluetooth radios ON to facilitate connections without explicit user intervention. Moving forward, the API will no longer automatically enable these radios for 1P and 3P applications.&lt;/p&gt;

&lt;h2 style="margin-bottom: 0.5em; margin-top: 1.5em;"&gt;What this means for developers&lt;/h2&gt;
&lt;p style="margin-bottom: 0.3em; margin-top: 0.1em;"&gt;If your app relies on Nearby Connections, you will need to update your implementation to account for these changes:&lt;/p&gt;
&lt;ul style="margin-bottom: 0.3em; margin-top: 0.1em;"&gt;
  &lt;li style="margin-bottom: 0.2em;"&gt;&lt;strong&gt;Manual Radio Management:&lt;/strong&gt; You must ensure that the necessary radios (Wi-Fi or Bluetooth) are enabled before initiating Nearby Connections tasks.&lt;/li&gt;
  &lt;li style="margin-bottom: 0.2em;"&gt;&lt;strong&gt;User Notification:&lt;/strong&gt; If the required radios are disabled, your app must now inform the user and request that they enable them manually. The API will no longer programmatically turn them on for you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 style="margin-bottom: 0.5em; margin-top: 1.5em;"&gt;Timing&lt;/h2&gt;
&lt;p style="margin-bottom: 0em; margin-top: 0.1em;"&gt;These changes are scheduled to take effect in late 2026. We recommend reviewing your connection workflows now to ensure a seamless transition for your users.&lt;/p&gt;</content><link href="http://android-developers.googleblog.com/feeds/494275494579598458/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/upcoming-changes-nearby-connections-api.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/494275494579598458" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/494275494579598458" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/upcoming-changes-nearby-connections-api.html" rel="alternate" title="Upcoming Changes to the Nearby Connections API" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG84rk4vo20t7pFUGFUp6Cx38qbJTZWW5Q5ztSfPOaV474gZ4mnT7qpnC6o4hKJkwR6CiD4TwPWCS0aU-w0nr70WkKrcpR2yRM5PXnMDa9t3mjgQVahNBzLijD2v23LiDj_NaMWoyVXWTV3cKXHsForureZTA1_Q5M_03ZAve7PybnhpYpGG05IS2uCv0/s72-c/Upcoming%20Changes%20to%20the%20Nearby%20Connections%20API%20_Blog.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-992564715214116931</id><published>2026-07-14T04:00:00.000-07:00</published><updated>2026-07-14T06:44:50.199-07:00</updated><title type="text">Android Studio Quail 2 is Stable: Multi-task with the Android Studio AI agent </title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitwUFdkGaqVNsaJ2iCtprD4WZuFjvI1rR6WX35ewxin0wbtVadUtkRb3qYG-KGEKepmtC4WFv2mSAmUBRmZ-oR5ey_-codg1_MhbagflhqgWk2MdNX6-yL8SaADve6mn3v0aJ_uh-qLizIgdImHaQ_KdJfVYqvCga_v_fyJYPHKDyhuhVklAfo145xays/s2461/QuailBlog_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitwUFdkGaqVNsaJ2iCtprD4WZuFjvI1rR6WX35ewxin0wbtVadUtkRb3qYG-KGEKepmtC4WFv2mSAmUBRmZ-oR5ey_-codg1_MhbagflhqgWk2MdNX6-yL8SaADve6mn3v0aJ_uh-qLizIgdImHaQ_KdJfVYqvCga_v_fyJYPHKDyhuhVklAfo145xays/s2461/QuailBlog_Meta.png" style="display: none;" /&gt;&lt;p&gt;Posted by Amman Asfaw, Product Manager, Android Studio&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-nTZM4cgutSVcLIdjSDqJoeiaES_FELwFC84O01Roy0P81-mAyqz3X2w4pwzAZwdhiMeUuhRSyT4euWZkWtGderw6LRu-fK6k-w8lB-9k7GMXOFBy0IzgtGmUk6QkRriFX24lchlTD0SQhbywxli4p4iZ7JzMAN80YoCdruEeruJ58bwhmuo0cj9Y_yg/s2152/QuailMovement_V1_a.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="608" data-original-width="2152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-nTZM4cgutSVcLIdjSDqJoeiaES_FELwFC84O01Roy0P81-mAyqz3X2w4pwzAZwdhiMeUuhRSyT4euWZkWtGderw6LRu-fK6k-w8lB-9k7GMXOFBy0IzgtGmUk6QkRriFX24lchlTD0SQhbywxli4p4iZ7JzMAN80YoCdruEeruJ58bwhmuo0cj9Y_yg/s1600/QuailMovement_V1_a.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Android Studio Quail 2 is now stable and ready for you to use in production, bringing a shift to your IDE with concurrent agentic workflows, natively integrated memory leak profiling, and context-aware crash remediation. Whether you are performing a sweeping architectural overhaul, tracing a memory leak, or resolving a critical production crash, Android Studio keeps you anchored in your workspace by reducing manual friction.&lt;/p&gt;
&lt;p style="margin-bottom: 12px;"&gt;Here’s a deep dive into what’s new:&lt;/p&gt;
&lt;h2 style="margin-top: 0px;"&gt;Multi-tasking with parallel chats&lt;/h2&gt;

&lt;p&gt;In Android Studio Quail 2, we've been hard at work redesigning Agent Mode from the ground up. This new architecture provides better performance, offers more flexibility for decomposing complex tasks, and improves the suite of internal tools the agent uses to do its work.&lt;/p&gt;In addition to these behind-the-scenes improvements, these changes also allow you to converse across multiple agent chats simultaneously. Waiting for the Android Studio agent to finish a task before you can ask another question or initiate a separate task in Agent Mode is a bottleneck of the past. You can multi-task seamlessly: kick off a UI refactor in one tab, fix a ProGuard rule in a second, and generate documentation in a third.&lt;br /&gt;&lt;br /&gt; You can also change which models the agent uses from chat to chat based on the requests you have. Take a look at &lt;a href="http://d.android.com/bench"&gt;Android Bench&lt;/a&gt; for an analysis of how LLMs perform Android development tasks. 

&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;strong&gt;How to use:&lt;/strong&gt; Click the "+" icon to start a new parallel conversation, and use the &lt;b&gt;History&lt;/b&gt; icon to navigate between active tasks. Alternatively, select File &amp;gt; New &amp;gt; New Agent Tab to open a conversation in a dedicated tab.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; Worktree support is currently unavailable. Exercise caution when running concurrent chats that modify the same project files, which can potentially lead to editor conflicts.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/U6T67Lbar-w" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="U6T67Lbar-w"&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p style="text-align: center;"&gt;&lt;i&gt;Run multiple agent tasks in parallel with different models of your choice.&lt;/i&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwUDucsd939pAvvfRC8VvmNkDp-1nDBMaP3TGFwdjspFgPz7_CVS-7NVzNhP278oKO3MNJL0RZy3k9aCZgmVtuqsahIZh79bGXhB026yKqPPiMYVMFkkSUgTBSLLajNObkMkke_iF6i_cIMRRQ_5Zl8zLgXWKYItToSiyLaZfok-pd-KVkAkRfup_yCsI/s3456/Screenshot%202026-06-17%20at%2012.56.57%E2%80%AFAM.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2044" data-original-width="3456" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwUDucsd939pAvvfRC8VvmNkDp-1nDBMaP3TGFwdjspFgPz7_CVS-7NVzNhP278oKO3MNJL0RZy3k9aCZgmVtuqsahIZh79bGXhB026yKqPPiMYVMFkkSUgTBSLLajNObkMkke_iF6i_cIMRRQ_5Zl8zLgXWKYItToSiyLaZfok-pd-KVkAkRfup_yCsI/s1600/Screenshot%202026-06-17%20at%2012.56.57%E2%80%AFAM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="text-align: left;"&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Use the History icon to navigate between active tasks.&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;

&lt;h2 style="margin-top: 12px;"&gt;Memory leak detection with LeakCanary&lt;/h2&gt;

&lt;p&gt;Memory leaks in Android occur when your code holds onto an object's reference long after its life cycle has ended. This prevents the Garbage Collector from reclaiming that memory, eventually leading to sluggish performance or &lt;code&gt;OutOfMemoryError&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Hunting down memory leaks can be a tedious, manual task. Starting with Android Studio Quail 2, the popular open-source leak detector &lt;a href="https://square.github.io/leakcanary/"&gt;LeakCanary&lt;/a&gt; is natively integrated directly into the Profiler as a dedicated, first-class task.&lt;/p&gt;

&lt;p&gt;This integration transforms your debugging performance by lifting and shifting the heap analysis off your resource-constrained testing phone, and onto your powerful development computer. By running the analysis on your computer, leak tracing is up to five times faster and jank-free, leaving your test app running smoothly on the device.&lt;/p&gt;

&lt;p&gt;Once a leak is detected during a profiling session:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The Profiler renders an interactive, color-coded leak trace, grouping occurrences and estimating lost memory.&lt;/li&gt;
  &lt;li&gt;You can click &lt;b&gt;Go to declaration&lt;/b&gt; on any leaking object in the trace to instantly jump to that exact line of code in your editor.&lt;/li&gt;
  &lt;li&gt;You can click &lt;b&gt;Fix with Agent&lt;/b&gt; to have the Gemini agent ingest the trace, explain the root cause of the retained reference, and write the exact code change (such as unbinding a listener or clearing a static reference) to plug the leak.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwBONeahZYC_5KBtkgQkc5vTjzmN5D-ypyOOScCRcp6Cy8CZeNHVWeNViBS6D_we7HaRy_AjIg1tptZAVEqNTeQ4IVVjoQp4_XJp45648fhiD0H5qvNmiPphikYGDNbEyus-QTVkSU9imwJm4QN0CKnWFs6JZsVkC21SXl9LXAnSndereOvE6iDWOmsEo/s1250/Leak_Canary_4e3675ccb2_ZXI2sE.webp" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="640" data-original-width="1250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwBONeahZYC_5KBtkgQkc5vTjzmN5D-ypyOOScCRcp6Cy8CZeNHVWeNViBS6D_we7HaRy_AjIg1tptZAVEqNTeQ4IVVjoQp4_XJp45648fhiD0H5qvNmiPphikYGDNbEyus-QTVkSU9imwJm4QN0CKnWFs6JZsVkC21SXl9LXAnSndereOvE6iDWOmsEo/s1600/Leak_Canary_4e3675ccb2_ZXI2sE.webp" /&gt;&lt;/a&gt;&lt;span style="text-align: left;"&gt;&lt;i&gt;Review memory leaks identified via LeakCanary through the Fix with Agent button.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;

&lt;h2 style="margin-top: 12px;"&gt;App Quality Insights agent integration&lt;/h2&gt;

&lt;p&gt;Tracking down the root cause of an app crash can require manually synthesizing stack traces, device data, and source code. However Android Studio’s App Quality Insights (AQI) is now fully integrated with Agent Mode to do the heavy lifting for you.&lt;/p&gt;

&lt;p&gt;When you click on a crash in the AQI panel, you immediately get a concise, high-level summary of the issue. If you need to dig deeper, simply click &lt;b&gt;See more&lt;/b&gt;. This opens a dedicated chat where the agent uses your selected model and pulls in local source code and the full stack trace to deliver a comprehensive explanation of the failure.&lt;/p&gt;

&lt;p&gt;With the new agent integration, you move directly from issue identification to resolution. By clicking &lt;b&gt;Fix with AI&lt;/b&gt;, the agent will analyze the issue, propose a step-by-step fix plan, and—upon your approval—apply the necessary code changes directly to your project and verify the resulting fix&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/JjgEePciHHg" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="JjgEePciHHg"&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;p style="text-align: center;"&gt;&lt;i&gt;The &lt;b&gt;Fix with AI&lt;/b&gt; button triggering the agent to analyze the issue, then propose the fix&lt;/i&gt;&lt;/p&gt;

&lt;h2 style="margin-top: 12px;"&gt;Quality &amp;amp; stability improvements&lt;/h2&gt;

&lt;p&gt;Beyond new features, we’ve continued our focus on quality by addressing numerous bugs and incorporating the latest stability and performance improvements from the IntelliJ platform, making this a significant enhancement for your daily development.&lt;/p&gt;

&lt;h2 style="margin-top: 12px;"&gt;Get Started&lt;/h2&gt;

&lt;p&gt;Ready to dive in and accelerate your development? &lt;a href="https://developer.android.com/studio"&gt;Download&lt;/a&gt; Android Studio Quail 2 and start exploring these new features today! As always, your feedback is crucial to us. &lt;a href="https://developer.android.com/studio/known-issues"&gt;Check known issues&lt;/a&gt;, &lt;a href="https://developer.android.com/studio/report-bugs"&gt;report bugs&lt;/a&gt;, and be part of our vibrant community on &lt;a href="https://www.linkedin.com/showcase/androiddev/posts/?feedView=all"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://medium.com/androiddevelopers"&gt;Medium&lt;/a&gt;, &lt;a href="https://www.youtube.com/c/AndroidDevelopers/videos"&gt;YouTube&lt;/a&gt;, or &lt;a href="https://twitter.com/androidstudio"&gt;X&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;</content><link href="http://android-developers.googleblog.com/feeds/992564715214116931/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/android-studio-quail-2-stable-features.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/992564715214116931" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/992564715214116931" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/android-studio-quail-2-stable-features.html" rel="alternate" title="Android Studio Quail 2 is Stable: Multi-task with the Android Studio AI agent " type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitwUFdkGaqVNsaJ2iCtprD4WZuFjvI1rR6WX35ewxin0wbtVadUtkRb3qYG-KGEKepmtC4WFv2mSAmUBRmZ-oR5ey_-codg1_MhbagflhqgWk2MdNX6-yL8SaADve6mn3v0aJ_uh-qLizIgdImHaQ_KdJfVYqvCga_v_fyJYPHKDyhuhVklAfo145xays/s72-c/QuailBlog_Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-8846032960796184778</id><published>2026-07-08T06:00:00.000-07:00</published><updated>2026-07-08T08:59:12.713-07:00</updated><title type="text">Evolving how LLMs are measured for Android: the next era of Android Bench</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCAy4lIbOAOrygTMaHZB8q4NarDrLRsqALfsmer5urQX7G_MaRDTw51uMh77Ks2knIuWM-zaEel63Dk2IlCVGD9IxLFy0B68KxwxsvDZzVDaEWaM4Bg8xJYinunaXS_fonxBw7-R4_qSplI4MJU7RDDaYlbq7nRXZoht5lFZVC7ErLEWHdWA6B2KgJvrk/s2469/Bench%20July%20releas%20V01_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCAy4lIbOAOrygTMaHZB8q4NarDrLRsqALfsmer5urQX7G_MaRDTw51uMh77Ks2knIuWM-zaEel63Dk2IlCVGD9IxLFy0B68KxwxsvDZzVDaEWaM4Bg8xJYinunaXS_fonxBw7-R4_qSplI4MJU7RDDaYlbq7nRXZoht5lFZVC7ErLEWHdWA6B2KgJvrk/s2469/Bench%20July%20releas%20V01_Meta.png" style="display: none;" /&gt;
&lt;div&gt;&lt;i&gt;Posted by Zoe Lopez-Latorre, Senior Developer Relations Engineer, Android&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi49z_u9zPMjp-zyQ1yIpzLgDumtzUwZoprtIgPXv_kpF05e87KklDEguaKSJVhvV8dZJ7aVr98p-MG3FR4Sk37rcYTS91J3ADUQot-c-xnOuyIZ411VO4Hp43Yp7V_TwF6zO6RmAJpw51ZHPGbHfOwZxWgQ62SQeXblULcSc0RjMcZbLHGUZGgHzU6pEo/s8583/Bench%20July%20releas%20V01_Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2601" data-original-width="8583" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi49z_u9zPMjp-zyQ1yIpzLgDumtzUwZoprtIgPXv_kpF05e87KklDEguaKSJVhvV8dZJ7aVr98p-MG3FR4Sk37rcYTS91J3ADUQot-c-xnOuyIZ411VO4Hp43Yp7V_TwF6zO6RmAJpw51ZHPGbHfOwZxWgQ62SQeXblULcSc0RjMcZbLHGUZGgHzU6pEo/s1600/Bench%20July%20releas%20V01_Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;p&gt;Back in March, we introduced &lt;a href="http://d.android.com/bench"&gt;Android Bench&lt;/a&gt;—our LLM leaderboard for real-world Android development tasks. Our goal was to provide transparency around model capabilities in Android development and to encourage model improvements, to give you more helpful AI options for your everyday workflow. Since then, we have enhanced the benchmark based on your feedback, including evaluating &lt;a href="https://x.com/AndroidDev/status/2064482677500080549"&gt;open-weight models&lt;/a&gt; and adding cost and efficiency dimensions to the leaderboard.&lt;/p&gt;

&lt;p&gt;But AI capabilities are ever-evolving, and measurement needs to follow suit. As part of our July release, we have adopted the &lt;a href="https://www.harborframework.com/"&gt;Harbor framework&lt;/a&gt;, which includes an updated version of the benchmarking agent used to evaluate models.&lt;/p&gt;

Along with this change to our evaluation, in this July release we’re adding 8 new models (&lt;b&gt;Claude Fable 5, Claude Sonnet 5, Claude Opus 4.8, GLM 5.2, Kimi K2.7 Code, MiniMax M3, Qwen 3.7 Plus and Qwen 3.7 Max&lt;/b&gt;) to the leaderboard. We’re also sharing opportunities for you, the Android developer community, to contribute to the benchmark. 

&lt;h2 style="margin-top: 10px;"&gt;Upgrading our methodology with the Harbor framework&lt;/h2&gt;

&lt;p&gt;When we designed Android Bench, we anchored our methodology on leading industry standards available at the time. We used mini-swe-agent v1, a general-purpose benchmarking agent, and adapted it to the nuances of Android development to provide a baseline measurement for the capabilities of models for common Android development tasks.&lt;/p&gt;

&lt;p&gt;To continue providing you with state-of-the-art evaluations that accurately measure the latest model capabilities on Android development, we are standardizing our benchmark to the &lt;a href="https://www.harborframework.com/"&gt;Harbor framework&lt;/a&gt;. Harbor defines standards and integrations that make it easy for anyone to run the benchmark, evaluate their preferred set-up, or share results – providing you with additional transparency and visibility.&lt;/p&gt;

&lt;p&gt;This upgrade enables us to more rigorously evaluate models and their capabilities, and we re-ran the benchmark on all models to establish an updated baseline. This means there is a minor shift in scoring, but you will still be able to view historical scores within &lt;a href="http://d.android.com/bench/archive"&gt;the archive&lt;/a&gt; on our website.&lt;/p&gt;

&lt;p&gt;We want to ensure Android Bench is helpful for you, so we will continuously update it as our evaluations and the industry mature.&lt;/p&gt;

&lt;h2 style="margin-top: 10px;"&gt;Expanding the leaderboard with 8 new models&lt;/h2&gt;

&lt;p&gt;As part of our commitment to keeping the leaderboard fresh, we have added Claude Fable 5, Claude Sonnet 5, Claude Opus 4.8, GLM 5.2, Kimi K2.7 Code, MiniMax M3, Qwen 3.7 Plus and Qwen 3.7 Max to the Android Bench leaderboard.&lt;/p&gt;

&lt;p&gt;You will see that &lt;b&gt;Claude Fable 5&lt;/b&gt; is at the top of the leaderboard with a score of 84.5, followed by &lt;b&gt;GPT 5.5&lt;/b&gt; with 80.2, with &lt;b&gt;Claude Sonnet 5&lt;/b&gt; in 3rd with a score of 76.2.&lt;/p&gt;

&lt;p&gt;When just comparing Open-weight models,&lt;b&gt; GLM 5.2&lt;/b&gt; is at the top with 72.2, followed by &lt;b&gt;Kimi K2.7 Code&lt;/b&gt; with a score of 70.4.&lt;/p&gt;

&lt;p&gt;You can check out model performance and efficiency metrics on the updated leaderboard to see how these new and previous models navigate Android-specific challenges like Jetpack Compose migrations, wearable networking, and platform API updates.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQCbY3Td_I5gR8bC4uFSBTe4Sl-XuArNNdFU-27JP6-kwHycXt9AMpWfkLqjUIK37Zw18Tel6a7yOS9x0L_NabxBgYd9KIJKZ6dTLl6VxxJI4M7Zstqj12wvOFtF8LjnYrCIWnhCDdeGsgpQvFpFX8VOoSO0dFJcOW_gRc6eX7mXDq80sOwQAlQWNhlQg/s1999/image1.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="890" data-original-width="1999" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQCbY3Td_I5gR8bC4uFSBTe4Sl-XuArNNdFU-27JP6-kwHycXt9AMpWfkLqjUIK37Zw18Tel6a7yOS9x0L_NabxBgYd9KIJKZ6dTLl6VxxJI4M7Zstqj12wvOFtF8LjnYrCIWnhCDdeGsgpQvFpFX8VOoSO0dFJcOW_gRc6eX7mXDq80sOwQAlQWNhlQg/s1600/image1.png" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;h2&gt;Opening Android Bench to community contributions&lt;/h2&gt;

&lt;p&gt;From the beginning, we’ve valued an open and transparent approach, which is why we made our original methodology and test harness publicly available on GitHub. You’ve asked for a way to provide feedback on our dataset, so now we’re taking collaboration a step further by giving you, the Android developer community, a chance to shape Android Bench.&lt;/p&gt;

&lt;p&gt;Starting today, you can contribute to Android Bench in two ways:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Design and &lt;a href="https://github.com/android-bench/community-dataset"&gt;submit your own Android development tasks&lt;/a&gt; to evaluate how models handle the scenarios that matter to you.&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/android-bench/community-results"&gt;Run and share benchmark evaluations&lt;/a&gt; firsthand, testing your preferred models against our dataset or your own custom tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will be reviewing the submitted tasks and will be assessing if they get added to the benchmark. We hope to build a benchmark that truly reflects the diverse, day-to-day realities of the global Android developer community.&lt;/p&gt;

&lt;h2 style="margin-top: 10px;"&gt;Looking ahead&lt;/h2&gt;

&lt;p&gt;With more and more options for agentic development, maintaining a cutting-edge benchmark ensures that the AI assistance you rely on keeps getting smarter, more helpful, and more effective. Head over to our &lt;a href="https://github.com/android-bench/android-bench"&gt;GitHub repository&lt;/a&gt; to check out the tasks. We invite you to submit a task to our team for review, and you can check out &lt;a href="https://hub.harborframework.com/datasets/android-bench/android-bench/latest"&gt;Harbor Hub&lt;/a&gt; to explore the dataset or submit evaluations.&lt;/p&gt;

&lt;p&gt;As always, you can find the &lt;a href="http://d.android.com/bench"&gt;updated leaderboard&lt;/a&gt;, or read the &lt;a href="http://d.android.com/bench/methodology"&gt;methodology&lt;/a&gt; on our website.&lt;/p&gt;
  &lt;span style="display: none !important; visibility: hidden;"&gt;
    Android Bench, LLM leaderboard, Harbor framework, Android development, Claude Fable 5, GPT 5.5, Claude Sonnet 5, GLM 5.2, Kimi K2.7 Code, MiniMax M3, Qwen 3.7 Plus, Qwen 3.7 Max, AI benchmarking, Jetpack Compose migration, wearable networking, mobile AI agent, Zoe Lopez-Latorre, model evaluation, open-weight models, developer community contributions.
&lt;/span&gt;
  &lt;/div&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/8846032960796184778/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/android-bench-llm-measurement.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8846032960796184778" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8846032960796184778" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/android-bench-llm-measurement.html" rel="alternate" title="Evolving how LLMs are measured for Android: the next era of Android Bench" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCAy4lIbOAOrygTMaHZB8q4NarDrLRsqALfsmer5urQX7G_MaRDTw51uMh77Ks2knIuWM-zaEel63Dk2IlCVGD9IxLFy0B68KxwxsvDZzVDaEWaM4Bg8xJYinunaXS_fonxBw7-R4_qSplI4MJU7RDDaYlbq7nRXZoht5lFZVC7ErLEWHdWA6B2KgJvrk/s72-c/Bench%20July%20releas%20V01_Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-8962875207066256340</id><published>2026-07-06T06:00:00.000-07:00</published><updated>2026-07-06T09:05:49.653-07:00</updated><title type="text">Google Play launches the first Indie Games Fund in Africa</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVaj2uWBON3o1zwwUkgNlLg-ZaLaCDp6myrMrmYMlLIl2zA6438CvmUIPQ8We2FfLSrdwTpcKA_JTGs8gnSibQ2k8b8fb6f-h61WRd8v0WLyyrFCV0YqpVix-1HsVj5g2uuofXmDmjqyWh5IzkmcqfqXthM8dGhQhw06U34XRB5xon72Fq0SEndEifDN8/s2048/IGFund26_Metadata%20Card.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVaj2uWBON3o1zwwUkgNlLg-ZaLaCDp6myrMrmYMlLIl2zA6438CvmUIPQ8We2FfLSrdwTpcKA_JTGs8gnSibQ2k8b8fb6f-h61WRd8v0WLyyrFCV0YqpVix-1HsVj5g2uuofXmDmjqyWh5IzkmcqfqXthM8dGhQhw06U34XRB5xon72Fq0SEndEifDN8/s2048/IGFund26_Metadata%20Card.png" style="display: none;" /&gt;&lt;div&gt;&lt;name content="IMG" twitter:image=""&gt;&lt;i&gt;Posted by Steph Pio, Strategic Partnerships Manager, Google Play EMEA&lt;/i&gt;&lt;/name&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;name content="IMG" twitter:image=""&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;em&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj86YrBhsnBplvegJfEidJDWTSlkZ8i8WT_TpXfsiaamFA3ILGZKZgz9AkX3-JJTvYTO3qcyJdDnn0GakXbA3GvrKvqucP5n67-XtPAigihdacSOJ1D448iiIyF7gjY68vBmXAAAvtZRISJbhZWhxjx4_mPD92R4KqgEg3xk46WO0qJtm-xQkGMShiHbKs/s4209/IGFund26_Blogger%20Header.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj86YrBhsnBplvegJfEidJDWTSlkZ8i8WT_TpXfsiaamFA3ILGZKZgz9AkX3-JJTvYTO3qcyJdDnn0GakXbA3GvrKvqucP5n67-XtPAigihdacSOJ1D448iiIyF7gjY68vBmXAAAvtZRISJbhZWhxjx4_mPD92R4KqgEg3xk46WO0qJtm-xQkGMShiHbKs/s16000/IGFund26_Blogger%20Header.png" /&gt;&lt;/a&gt;&lt;/em&gt;&lt;/div&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/name&gt;
&lt;p&gt;Sub-Saharan Africa is home to some of the world’s most creative storytelling. To help bring those stories to a global audience, today, we’re proud to announce the debut of Google Play’s Indie Games Fund in Africa.&lt;/p&gt;

&lt;p&gt;The region’s unique creativity has fueled a vibrant game development scene, helping drive what is quickly becoming one of the most exciting, resilient, and fast-growing gaming markets. It’s a space defined by immense talent. However, access to capital is a persistent hurdle, and a significant investment gap often holds back incredibly promising local studios.&lt;/p&gt;

&lt;p&gt;With this inaugural fund, we’re committing $1 million USD to help address that gap. This fund will empower 10 indie game studios across Sub-Saharan Africa to scale their businesses and realize their full potential.&lt;/p&gt;

&lt;h3&gt;Funding and support for selected studios&lt;/h3&gt;

&lt;p&gt;This program is designed to drive long-term growth, where it can make the biggest impact. Selected studios will receive a share of the $1 million fund, with individual investments ranging from $50,000 to $200,000 to help elevate their games. Alongside this financial backing, recipients will benefit from dedicated mentorship and hands-on technical support. Together, these awards are designed to help them scale their businesses and reach a global audience.&lt;/p&gt;

&lt;h3&gt;Who can apply?&lt;/h3&gt;

&lt;p&gt;The program is open to indie game developers based in Sub-Saharan Africa (see the &lt;a href="https://rsvp.withgoogle.com/events/africa-indie-games-fund-2026/terms"&gt;list of eligible countries&lt;/a&gt;) who have launched a game—whether it’s on Google Play, another mobile platform, PC, or console.&lt;/p&gt;

&lt;p&gt;Review the &lt;a href="https://rsvp.withgoogle.com/events/africa-indie-games-fund-2026/terms"&gt;eligibility criteria&lt;/a&gt; and &lt;a href="https://rsvp.withgoogle.com/events/africa-indie-games-fund-2026/home"&gt;apply now&lt;/a&gt;. Applications close at 12 noon UTC on July 31, 2026.&lt;/p&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/8962875207066256340/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/Indie-Games-Fund-Africa.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8962875207066256340" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8962875207066256340" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/07/Indie-Games-Fund-Africa.html" rel="alternate" title="Google Play launches the first Indie Games Fund in Africa" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVaj2uWBON3o1zwwUkgNlLg-ZaLaCDp6myrMrmYMlLIl2zA6438CvmUIPQ8We2FfLSrdwTpcKA_JTGs8gnSibQ2k8b8fb6f-h61WRd8v0WLyyrFCV0YqpVix-1HsVj5g2uuofXmDmjqyWh5IzkmcqfqXthM8dGhQhw06U34XRB5xon72Fq0SEndEifDN8/s72-c/IGFund26_Metadata%20Card.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-7579148346442003913</id><published>2026-06-29T13:00:00.000-07:00</published><updated>2026-06-29T15:56:50.754-07:00</updated><title type="text">Eclipsa Video: HDR That Looks Right on Every Screen</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGg9E8BsBcgigJ3Pwhp0Wbd85wffhQKw9jT9eW4_IJHtJsxtaqBqZoWIc4agLIZu9h2eWFEnMgipcv2PnMM2UC9tsZOJp3AMjsOX1KQRoisg5IKTRS20hFOIvJmlViYFz-QOh3-KdyFRIgUaiKs2ehjrJBd9W_yW13aP4xgRQovNCEAviajCLWFTTVrjs/s2469/Eclipsa%20Video%20V01%20White_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGg9E8BsBcgigJ3Pwhp0Wbd85wffhQKw9jT9eW4_IJHtJsxtaqBqZoWIc4agLIZu9h2eWFEnMgipcv2PnMM2UC9tsZOJp3AMjsOX1KQRoisg5IKTRS20hFOIvJmlViYFz-QOh3-KdyFRIgUaiKs2ehjrJBd9W_yW13aP4xgRQovNCEAviajCLWFTTVrjs/s2469/Eclipsa%20Video%20V01%20White_Meta.png" style="display: none;" /&gt;&lt;div&gt;&lt;i&gt;Posted by Tibian Elsheikh, Product Manager, Android Core Graphics and Jeffrey Jose, Product Manager, Android Core Graphics&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0slfG8CUVGmPiAUHIXkeIVZGveJMOvf1TorUdONiRYV1THM80OzIIjGV5-bOboEhNz7FB4sTYx72ySEjFhQ4oW97-sLZ4scOX2Sb5BBU9qPMvOXvq2XRj098K7ElBnvy4k68jKELpDZ7vd4NIs2Hud2w14re18dOx7dksdFXRBR_Nd8yOiBrw8cLr_kM/s8583/Eclipsa%20Video%20V02_Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2601" data-original-width="8583" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0slfG8CUVGmPiAUHIXkeIVZGveJMOvf1TorUdONiRYV1THM80OzIIjGV5-bOboEhNz7FB4sTYx72ySEjFhQ4oW97-sLZ4scOX2Sb5BBU9qPMvOXvq2XRj098K7ElBnvy4k68jKELpDZ7vd4NIs2Hud2w14re18dOx7dksdFXRBR_Nd8yOiBrw8cLr_kM/s1600/Eclipsa%20Video%20V02_Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;We’ve all been there: You’re scrolling through your favorite social media feed in a dim room, and suddenly an HDR video pops up. It’s so intensely bright that you have to squint, or maybe you find yourself turning down your screen brightness just to read the caption. Other times, a video that looks vibrant on your phone looks flat, dark, or washed out when you watch it on your living room TV.&amp;nbsp;&lt;/p&gt;&lt;p&gt;While High Dynamic Range (HDR) technology was designed to make videos look richer and more lifelike, the lack of unified industry guidelines means that the exact same clip can render in unexpected and jarring ways depending on the display you’re using.&lt;/p&gt;

&lt;p&gt;To solve this, we’re introducing Eclipsa Video—a new standard built to make your favorite videos look consistent, balanced, and comfortable on every screen. Eclipsa Video builds on the open &lt;a href="https://github.com/SMPTE/st2094-50"&gt;SMPTE ST 2094-50 specification&lt;/a&gt;, which Google developed in collaboration with Apple and NBCUniversal.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;i&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLDY0gLjHQYTZZfRzikfPu8P3jZkXhq6Wqo1GFj3CvBh9YaboIDUstPcnV94Qan8nVkXXBlXLm5vSktLM_q9DJIIn_jyeW9LyZchI5Fpm6AD7A5XD3ZRslzBFhJLAvRj589ukW0etBNCg7004SjySw_SYsGkg6dQ8AtgfofOZeFTx8R3H7xWfwAuA-Rqc/s1066/Eclipsa_9-16_Transparent%20(2).gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1066" data-original-width="600" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLDY0gLjHQYTZZfRzikfPu8P3jZkXhq6Wqo1GFj3CvBh9YaboIDUstPcnV94Qan8nVkXXBlXLm5vSktLM_q9DJIIn_jyeW9LyZchI5Fpm6AD7A5XD3ZRslzBFhJLAvRj589ukW0etBNCg7004SjySw_SYsGkg6dQ8AtgfofOZeFTx8R3H7xWfwAuA-Rqc/w225-h400/Eclipsa_9-16_Transparent%20(2).gif" width="225" /&gt;&lt;/a&gt;&lt;/div&gt;Sudden brightness spikes during feed scrolling—fixed with Eclipsa Video.&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;p&gt;&lt;/p&gt;

&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;More consistency, comfort, and creative control&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;Eclipsa Video moves past individual display guesswork. Instead of leaving it up to your device to interpret a video’s brightness on its own, our format carries precise guidelines that tell compatible displays exactly how to render the image. &lt;br /&gt;&lt;p&gt;Designed to scale with your hardware, Eclipsa Video provides three core benefits:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;A consistent baseline:&lt;/strong&gt; Eclipsa Video introduces a shared rulebook for screens. It establishes a consistent benchmark for normal brightness—known as the &lt;b&gt;HDR reference white&lt;/b&gt;. This ensures standard text, app interfaces, and standard-range colors remain vibrant and readable without causing uncomfortable screen glare.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Adaptive headroom:&lt;/strong&gt; Screens have different physical brightness limits, or "headroom." Eclipsa Video guides how displays handle highlights dynamically. Bright details remain brilliant on a premium television, while being scaled intelligently on a mobile screen to prevent sudden blinding transitions.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Preserved creative intent:&lt;/strong&gt; Rather than applying a single static setting to an entire video, Eclipsa Video carries adaptive, frame-by-frame instructions. Think of it as a set of digital notes from the creator traveling with the video, ensuring the exact colors, contrast, and mood they graded are preserved on your display.&lt;/li&gt;&lt;/ul&gt;

&lt;div class="separator" style="clear: both;"&gt;&lt;img border="0" data-original-height="1080" data-original-width="2200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirgS5TsogRUxWbypUiFlWIRuL8nQhdagvc7UHVFjoDG00SjqSrMniKFEys-EzgcrHKi6Am5BrtALEs7px1oaaJ5ciaO7hP0_49i8RuD7uCckjW7jYWrSoFkDlob6dJhL42MPLiBQqAjaPMOMJDEjZjDgvVe0P28fw13RlMNSiMEAlx5XFXCr8o6L8SRo0/s1600/Eclpsa%20Blog%20post%20image-AlphaB.png" /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Eclipsa Video preserves true highlight detail on any screen you watch.&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;Built natively into Android 17&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Starting with Android 17, support for Eclipsa Video is built directly into the platform. This means a more comfortable, true-to-life HDR experience is coming natively to the phones, tablets, and TVs you rely on every day. The video you capture carries its creative intent with it, and the video you watch is shown exactly the way it was meant to be seen.&lt;/p&gt;

&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;Guidelines for developers &amp;amp; creators&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;We’re inviting the developer and creator ecosystem to help build a more reliable HDR environment:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Get started with implementation:&lt;/strong&gt; Learn how to configure playback and capture in your apps with our &lt;a href="https://developer.android.com/media/platform/integrate-eclipsa-video"&gt;official guide&lt;/a&gt;.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;ExoPlayer &amp;amp; Media3 integration:&lt;/strong&gt; Standard playback handling built directly into &lt;a href="https://developer.android.com/media/media3/exoplayer"&gt;Jetpack Media3,&lt;/a&gt; allowing ExoPlayer to support Eclipsa Video metadata automatically with no additional player configuration.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Explore open source tools:&lt;/strong&gt; View and inspect &lt;a href="https://github.com/SMPTE/st2094-50"&gt;SMPTE ST 2094-50&lt;/a&gt; metadata and dynamic gain curves in real time using &lt;a href="https://webmproject.github.io/hdr-explorer/"&gt;HDR Explorer&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;What’s next&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Eclipsa Video is rolling out now, and you’ll see more apps and devices supporting it over time. Because it’s an open standard, any app developer or hardware manufacturer can integrate it to elevate the viewing experience.&lt;/p&gt;

&lt;p&gt;Try out the new tools in Android 17, explore the open-source metadata, and let us know what you think on our developer channels. We can’t wait to see what you create.&lt;/p&gt;

&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;Notes &amp;amp; Availability&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p style="text-align: left;"&gt;&lt;strong&gt;1. Device Compatibility:&lt;/strong&gt; Eclipsa Video playback and capture are supported natively on devices running Android 17 (API level 37) and above with HDR displays passing Eclipsa Compliance tests.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;strong&gt;2. Developer Resources:&lt;/strong&gt; The &lt;a href="https://github.com/SMPTE/st2094-50"&gt;SMPTE ST 2094-50 Specification&lt;/a&gt; is openly accessible for technical evaluation.&lt;/p&gt;</content><link href="http://android-developers.googleblog.com/feeds/7579148346442003913/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/eclipsa-video-hdr-review.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7579148346442003913" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7579148346442003913" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/eclipsa-video-hdr-review.html" rel="alternate" title="Eclipsa Video: HDR That Looks Right on Every Screen" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGg9E8BsBcgigJ3Pwhp0Wbd85wffhQKw9jT9eW4_IJHtJsxtaqBqZoWIc4agLIZu9h2eWFEnMgipcv2PnMM2UC9tsZOJp3AMjsOX1KQRoisg5IKTRS20hFOIvJmlViYFz-QOh3-KdyFRIgUaiKs2ehjrJBd9W_yW13aP4xgRQovNCEAviajCLWFTTVrjs/s72-c/Eclipsa%20Video%20V01%20White_Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-6455593066614791646</id><published>2026-06-24T07:00:00.000-07:00</published><updated>2026-06-24T10:19:34.133-07:00</updated><title type="text">Expanded billing choice and lower fees on Google Play</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUB5FJxvJIARbdD14jKJu4Jg0uzjczgDxybt5NlviqF_vL91B0GzqNHTcURyCT1nUJgc22LmhvXBk_E2UOXvLqXN_dZfs0YrlbMrl3ZJ_CYcn4W4qoTUhU5k0Y8DhoXltMRMUGQN7uzj6pH4qV1dtRCR6tAKpjmH3Ys_94xqHgR6SfHMpAplFgz8ClGG8/s8533/Apps%20Experience_Play%20Blog%20MetadataCard__2048x1323.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUB5FJxvJIARbdD14jKJu4Jg0uzjczgDxybt5NlviqF_vL91B0GzqNHTcURyCT1nUJgc22LmhvXBk_E2UOXvLqXN_dZfs0YrlbMrl3ZJ_CYcn4W4qoTUhU5k0Y8DhoXltMRMUGQN7uzj6pH4qV1dtRCR6tAKpjmH3Ys_94xqHgR6SfHMpAplFgz8ClGG8/s8533/Apps%20Experience_Play%20Blog%20MetadataCard__2048x1323.jpg" style="display: none;" /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Posted by Paul Feng, Vice President, Google Play Eng, Product, UX&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0NArBxSwBOPGYLZKJ4BxhB3rjkTq6RrZ6XBJk2e57TVQ_mSCJ1nw5JAegk0dmX-MEW0ArHvvr2pX8zdXKuJjIXsTgDx7i9W-EoRtS0rHLeGPjMnOvryY2f02czLEBxANuCYYa9ryEr46_6xJ9PQNkHL1MWh-hEHwZAbCGYj-JcdCunZGva5WpFFHCtYA/s4210/Blogger%20Header%20asset%20-%204209%20x%201253%20px.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1254" data-original-width="4210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0NArBxSwBOPGYLZKJ4BxhB3rjkTq6RrZ6XBJk2e57TVQ_mSCJ1nw5JAegk0dmX-MEW0ArHvvr2pX8zdXKuJjIXsTgDx7i9W-EoRtS0rHLeGPjMnOvryY2f02czLEBxANuCYYa9ryEr46_6xJ9PQNkHL1MWh-hEHwZAbCGYj-JcdCunZGva5WpFFHCtYA/s16000/Blogger%20Header%20asset%20-%204209%20x%201253%20px.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;At Google Play, we are committed to delivering the best possible experience to users, while ensuring developers have the tools and adaptability to succeed. Guided by this commitment, &lt;a href="https://android-developers.googleblog.com/2026/03/a-new-era-for-choice-and-openness.html"&gt;earlier this year&lt;/a&gt; we announced updates to our business model introducing more billing flexibility, lower fees, and new programs to help your business thrive. &lt;br /&gt;&lt;br /&gt;With some of these changes rolling out soon, the breakdown below outlines what is coming, where to find more information, key dates, and how to get started.

&lt;h2&gt;More billing flexibility&lt;/h2&gt;

Google Play’s billing system safely, efficiently, and intuitively handles the complexities of taxes, compliance, and subscriptions across 195+ markets with 300+ local payment methods. However, we understand there are situations where your business needs more flexibility, and that's why we're offering you more options in how you handle digital commerce.&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicLIK5NuRI6Rf-N_scGYqy-xAMyFOrJRo-nJOjqBYQW3Fizevf5Mk3mKnNRlJWdEWKKQ3oM_whpPuVOABM9Nf8bZwkfGQ_12p4mgQDvO40ornXa_1OxyP_4okmNfbcOyXdq47nx7o11Q_D7BRe5nRBGt2tNWFhe_eAEIgFC-kFdZH8K8j0gfeWZUAuS1Y/s8000/MM6_Offer%20alt%20billing.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="4500" data-original-width="8000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicLIK5NuRI6Rf-N_scGYqy-xAMyFOrJRo-nJOjqBYQW3Fizevf5Mk3mKnNRlJWdEWKKQ3oM_whpPuVOABM9Nf8bZwkfGQ_12p4mgQDvO40ornXa_1OxyP_4okmNfbcOyXdq47nx7o11Q_D7BRe5nRBGt2tNWFhe_eAEIgFC-kFdZH8K8j0gfeWZUAuS1Y/s16000/MM6_Offer%20alt%20billing.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;

&lt;br /&gt;&lt;br /&gt;Building from existing programs, the new billing choice program is available to all developers globally who provide digital services or content to users within the United Kingdom and the European Economic Area, alongside programs in the United States. Following this initial phase, we will continue expanding availability to additional markets. You will find the global release schedule at the bottom of this post.&lt;br /&gt;&lt;br /&gt;Through these programs, developers can offer an alternative billing system or link users to their own website for purchases, alongside Google Play’s billing. You may also design your own choice screen in accordance with our UX guidelines, as an alternative to Google Play’s default version.&lt;br /&gt;&lt;br /&gt;Please find all the details in the &lt;a href="https://support.google.com/googleplay/android-developer/answer/17161464"&gt;program page here&lt;/a&gt;.

&lt;h2&gt;Lower, separate fees&lt;/h2&gt;To enable this new level of flexibility, we're separating our service fee from the billing fee. This starts on June 30, 2026, beginning with the United States, European Economic Area, and United Kingdom.&lt;br /&gt;&lt;br /&gt;Regardless of whether you use Google Play's billing system, alternative billing, or external web links, the service fee starts at 10% on your first $1M (USD) in annual earnings. This 10% service fee also applies to all auto-renewing subscriptions. For all other transactions, the rates in the table below applies:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaTaAgjv7m9xtS4DS25hgDQ6oMIQWBw-GQ0bDMv4D_J-W5r7njfSvs7EnSwnJNIZ9oOIqW0w8KqoA4tTOQ2kC_l4K1YsrGt9Dp-4PFKBJGoACzfZPCjE2KBB0PGBjpaWBCguanfdhd-86iPZ3nDL_tZsk-lSYINiyQAreP8HKzBuShqq0BepijI3X6LT0/s8000/MM6%20rate%20card%20without%20border.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="4500" data-original-width="8000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaTaAgjv7m9xtS4DS25hgDQ6oMIQWBw-GQ0bDMv4D_J-W5r7njfSvs7EnSwnJNIZ9oOIqW0w8KqoA4tTOQ2kC_l4K1YsrGt9Dp-4PFKBJGoACzfZPCjE2KBB0PGBjpaWBCguanfdhd-86iPZ3nDL_tZsk-lSYINiyQAreP8HKzBuShqq0BepijI3X6LT0/s16000/MM6%20rate%20card%20without%20border.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

For other transactions, the service fee will be determined by whether the transacting user's install is new or existing relative to the regional rollout date:&lt;div&gt;&amp;nbsp;

&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;New installs&lt;/b&gt;:&amp;nbsp;A transaction from a user whose first-time install or first update of the app from Google Play occurred on or after the date that the new fee structure launched in their region.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Existing installs&lt;/b&gt;:&amp;nbsp;A transaction from a user whose first-time install or first update of the app from Google Play occurred before the date that the new fee structure launches in their market.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;For transactions that use Google Play’s billing system, an additional billing fee applies. In the United States, United Kingdom, and the European Economic Area, the billing fee is set at 5%. We'll announce billing fee details for other markets soon. For transactions processed via alternative billing or external web links, the billing fee does not apply. &lt;br /&gt;&lt;br /&gt;Review&lt;a href="https://support.google.com/googleplay/android-developer/answer/16954621?hl=en"&gt; this Help Center article&lt;/a&gt; to understand how these rates apply to your business.

&lt;h2&gt;Games Level Up and Apps Experience program guidelines&lt;/h2&gt;We are also excited to announce even more opportunities for partners who deliver exceptional user experiences across the Android ecosystem: the revamped &lt;a href="https://play.google.com/console/about/levelup/"&gt;Games Level Up&lt;/a&gt; and the new &lt;a href="https://play.google.com/console/about/programs/appsexperience/"&gt;Apps Experience&lt;/a&gt; program. Detailed guidelines are now available on the respective program websites.&lt;br /&gt;&lt;br /&gt;Apps and games that meet all requirements are eligible for a new program rate card with reduced rates. See the table below for details:&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6Zf6OFaB1B8MD7DeLJ-znJQUcA3ozQYDUEKzxiJb-32f_zk8bn6Cyi-WbwDPND0osW6FmmaUlfi1ji25thN3kZYXb747mD_KaE6pUf3faA5blqHNFH7qRlp0aNgVvS-bNNLg8L3QTizxXOU0mmblc8RyapiRanHcdocW92FchSLuJnw1HUSYbY2oJfNI/s8000/MM6%20rate%20card%20with%20border.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="4500" data-original-width="8000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6Zf6OFaB1B8MD7DeLJ-znJQUcA3ozQYDUEKzxiJb-32f_zk8bn6Cyi-WbwDPND0osW6FmmaUlfi1ji25thN3kZYXb747mD_KaE6pUf3faA5blqHNFH7qRlp0aNgVvS-bNNLg8L3QTizxXOU0mmblc8RyapiRanHcdocW92FchSLuJnw1HUSYbY2oJfNI/s16000/MM6%20rate%20card%20with%20border.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;

Visit the &lt;a href="https://play.google.com/console/about/levelup/"&gt;Games Level Up&lt;/a&gt; and &lt;a href="https://play.google.com/console/about/programs/appsexperience/"&gt;Apps Experience&lt;/a&gt; program websites, review the guidelines, and start preparing your games and apps ahead of September 30, 2026, when the program rate cards officially become available.

&lt;h2&gt;Global release schedule&lt;/h2&gt;

Evolving our business model requires technical infrastructure and alignment with local regulations, so these updates will roll out on a staggered timeline. To help you plan, here is the previously announced release schedule for each update across all markets:&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIGtrW01aFRzy0gj7_mHMrJ1TrWHkan3S0aF7HmjhM3QGdpkb9xjJudKp02b6i3jGGjRyE7PYGVPwxIhrM4CdLs_A-P70ugCns-G5x05x3PnAqD7VweBHg7-06bUl4T98OPuGpEXjrAjbwMObraQn8K3uCnr3tr505Os8Keu3H_i4wbWaZNoixFv6_vYw/s8000/MM6%20Release%20Schedule.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="4500" data-original-width="8000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIGtrW01aFRzy0gj7_mHMrJ1TrWHkan3S0aF7HmjhM3QGdpkb9xjJudKp02b6i3jGGjRyE7PYGVPwxIhrM4CdLs_A-P70ugCns-G5x05x3PnAqD7VweBHg7-06bUl4T98OPuGpEXjrAjbwMObraQn8K3uCnr3tr505Os8Keu3H_i4wbWaZNoixFv6_vYw/s16000/MM6%20Release%20Schedule.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Here is a quick recap of the resources available to help you get started:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Review the &lt;a href="https://support.google.com/googleplay/android-developer/answer/17161464"&gt;&lt;b&gt;billing choice program&lt;/b&gt;&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Learn more about &lt;a href="https://support.google.com/googleplay/android-developer/answer/16954621?hl=en"&gt;&lt;b&gt;Google Play's lower service fees&lt;/b&gt;&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Explore detailed guidelines on the &lt;a href="https://play.google.com/console/about/levelup/"&gt;&lt;b&gt;Games Level Up&lt;/b&gt;&lt;/a&gt; and &lt;a href="https://play.google.com/console/about/programs/appsexperience/"&gt;&lt;b&gt;Apps Experience&lt;/b&gt;&lt;/a&gt; program websites.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We look forward to building the next generation of Google Play experiences together.&lt;/p&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/6455593066614791646/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/play-expanded-billing.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/6455593066614791646" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/6455593066614791646" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/play-expanded-billing.html" rel="alternate" title="Expanded billing choice and lower fees on Google Play" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUB5FJxvJIARbdD14jKJu4Jg0uzjczgDxybt5NlviqF_vL91B0GzqNHTcURyCT1nUJgc22LmhvXBk_E2UOXvLqXN_dZfs0YrlbMrl3ZJ_CYcn4W4qoTUhU5k0Y8DhoXltMRMUGQN7uzj6pH4qV1dtRCR6tAKpjmH3Ys_94xqHgR6SfHMpAplFgz8ClGG8/s72-c/Apps%20Experience_Play%20Blog%20MetadataCard__2048x1323.jpg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-5772221969599763917</id><published>2026-06-18T07:00:00.000-07:00</published><updated>2026-07-15T10:02:26.669-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Featured"/><category scheme="http://www.blogger.com/atom/ns#" term="Latest news"/><title type="text">Android developer verification: Building a safer ecosystem together</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2JeeSz9AeQDASycrf2ssGmJn2yQGvGFjyU29jKSs5hFtYySX9X5wDw4Pb63DF3co77osfiLeYj6LGt-_1v66X3svzCOdWAZz3w9Q2WKF28T4qZ4tCbiTEsP88lIZ44Ua6mLfg6VIQL_k3PVWlU4vDnJkTc9mJkdz188lH-smTL3oA47Yongl1w8sf4RY/s1235/260317_ADV%20Blog_Metadata.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2JeeSz9AeQDASycrf2ssGmJn2yQGvGFjyU29jKSs5hFtYySX9X5wDw4Pb63DF3co77osfiLeYj6LGt-_1v66X3svzCOdWAZz3w9Q2WKF28T4qZ4tCbiTEsP88lIZ44Ua6mLfg6VIQL_k3PVWlU4vDnJkTc9mJkdz188lH-smTL3oA47Yongl1w8sf4RY/s1235/260317_ADV%20Blog_Metadata.png" style="display: none;" /&gt;&lt;div&gt;&lt;i&gt;Posted by Matthew Forsythe, Director Product Management, Android App Safety&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4_MWnkCTsO9zdnVQqFu2Aep5Q_GMvQvuXoGn-H_LXNpOYIVYFqbHi0R0iKpChOEJ-GB0p_7fLCiK_IGETshue4Fjd3tjyg95M3i92-DzdZpND5GPhr9jeBuj620YHAhPJ6CLdDXD8jsA1XyyYiBCS4p4eoZizZnA0DHKpwJqDUq-agwXl_GbtLrKdM5Y/s4210/260317_ADV%20Blog_Header.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1254" data-original-width="4210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4_MWnkCTsO9zdnVQqFu2Aep5Q_GMvQvuXoGn-H_LXNpOYIVYFqbHi0R0iKpChOEJ-GB0p_7fLCiK_IGETshue4Fjd3tjyg95M3i92-DzdZpND5GPhr9jeBuj620YHAhPJ6CLdDXD8jsA1XyyYiBCS4p4eoZizZnA0DHKpwJqDUq-agwXl_GbtLrKdM5Y/s16000/260317_ADV%20Blog_Header.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;July 15, 2026: Updated Play Console requirements for Play developers&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;To meet Android developer verification and &lt;a href="https://support.google.com/googleplay/android-developer/answer/17125096"&gt;updated Play Console Requirements&lt;/a&gt;, Play developers must &lt;a href="https://support.google.com/googleplay/android-developer/answer/16984799"&gt;register their Play apps&lt;/a&gt; in Play Console. While 99% of apps on Play have been registered automatically, you should check your &lt;a href="https://play.google.com/console/u/0/developers/5700313618786177705/android-developer-verification"&gt;Play Console Home page&lt;/a&gt; to register any remaining apps by September 30, 2026 to avoid global removal from Google Play and ensure a seamless user installation experience. &lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"&gt;You can also use Play Console to register apps you distribute outside of Google Play to ensure they can be installed on certified Android devices.&lt;/blockquote&gt;&lt;span id="docs-internal-guid-afed0f58-7fff-2f52-4264-5e75e9454885"&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div&gt;Last year, we introduced &lt;a href="https://developer.android.com/developer-verification"&gt;Android developer verification&lt;/a&gt; to strengthen ecosystem security and stop malicious actors from hiding behind anonymity to release harmful apps. Millions of apps have been registered since the verification launched in March, covering nearly all installs on Google Play and a large majority of installs from outside of Google Play. We appreciate the feedback and partnership from industry leaders, developers, and Android communities that helped us design this experience and drive strong adoption.&lt;h2 style="margin-top: 12px;"&gt;Initial launch across seven stores and four countries&lt;/h2&gt;

&lt;p&gt;These new developer verification protections will take effect on September 30, 2026, starting with users in Brazil, Indonesia, Singapore, and Thailand.&lt;/p&gt;

&lt;p&gt;This rollout is an &lt;b&gt;industry-wide effort to create a safer ecosystem&lt;/b&gt;. We will begin by verifying app installations from the following stores:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Google (Google Play)&lt;/li&gt;
    &lt;li&gt;Honor (HONOR App Market)&lt;/li&gt;
    &lt;li&gt;OPlus (OPPO App Market)&lt;/li&gt;
    &lt;li&gt;Samsung (Galaxy Store)&lt;/li&gt;
    &lt;li&gt;Transsion (Palm Store)&lt;/li&gt;
    &lt;li&gt;vivo (V-Appstore)&lt;/li&gt;
    &lt;li&gt;Xiaomi (GetApps)&lt;/li&gt;
&lt;/ul&gt;

&lt;p style="margin-bottom: 4px;"&gt;Following this initial phase with our partners, we will expand these protections globally for all apps on certified Android devices in 2027.&lt;/p&gt;&lt;h2 style="margin-top: 12px;"&gt;Automate your workflow with new APIs&lt;/h2&gt;

&lt;p&gt;To further streamline app registration, we are&lt;b&gt; launching a suite of developer-requested APIs&lt;/b&gt; to help you register apps in bulk or directly through your continuous integration and deployment (CI/CD) pipelines. The Android Developer ID Status API will let you check if a package name has already been registered, and the Android Developer Console API will let you register and manage package names directly within your development environment. Both APIs also support OAuth delegation, allowing third-party platforms, like Android app stores, to perform these operations natively on your behalf.&lt;/p&gt;

We'll launch these APIs over the next few months.&lt;h2 style="margin-top: 12px;"&gt;What’s next&lt;/h2&gt;

&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;strong&gt;June 2026:&lt;/strong&gt; Starting this month, we are rolling out a new &lt;a href="https://support.google.com/android/answer/17065026"&gt;system service&lt;/a&gt; that will be automatically installed on most Android devices. This service will be used later this year to verify developer registration.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;July 2026:&lt;/strong&gt; We’ll launch the Android Developer ID Status API globally and begin early access for the Android Developer Console API. Early access also starts for &lt;a href="https://developer.android.com/developer-verification/guides/limited-distribution"&gt;limited distribution accounts&lt;/a&gt; on Android Developer Console. This new type of Android developer account is designed for students, hobbyists, and learners and lets you share your apps to up to 20 devices without a government-issued ID or a fee.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;August 2026:&lt;/strong&gt;&amp;nbsp;Limited distribution accounts and the new Android Developer Console API will launch globally. We’ll also launch an &lt;a href="https://android-developers.googleblog.com/2026/03/android-developer-verification.html"&gt;advanced flow&lt;/a&gt; for installing apps from unverified developers, which includes security checkpoints to resist coercion scams, while allowing power users to maintain the ability to &lt;a href="https://developer.android.com/developer-verification/guides/faq#sideload-apps"&gt;sideload apps&lt;/a&gt; from unverified developers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;September 30, 2026:&lt;/strong&gt; App registration becomes required for &lt;b&gt;participating stores in Brazil, Indonesia, Singapore, and Thailand&lt;/b&gt;. Unregistered apps can be sideloaded with Android Debug Bridge (adb) or advanced flow.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;2027 and beyond:&lt;/strong&gt; After incorporating the feedback from our partners, users, and developer community, we’ll expand the Android verification requirement globally.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFUMAeS0ew75nme5xUK0qAQraK0-WpiUXp1B6m1yJFMqOrHUo7AyMMEfO-aYq9mZ6vy7GYPcBxRByKGQNgRbS99uW1b5hwbViEmIbGFVsLqhw7e-LSF_dozTAlKb7D1n_0Rc42S5MxzpxI5rrbSdDIQMVt6SXEErcnI-HrA0McFfL_BMoe2xMJtG9UU6I/s960/ABL_83_Blog%20in%20line%20asset%20-%20ADV%20July.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFUMAeS0ew75nme5xUK0qAQraK0-WpiUXp1B6m1yJFMqOrHUo7AyMMEfO-aYq9mZ6vy7GYPcBxRByKGQNgRbS99uW1b5hwbViEmIbGFVsLqhw7e-LSF_dozTAlKb7D1n_0Rc42S5MxzpxI5rrbSdDIQMVt6SXEErcnI-HrA0McFfL_BMoe2xMJtG9UU6I/s1600/ABL_83_Blog%20in%20line%20asset%20-%20ADV%20July.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style="margin-top: 12px;"&gt;Get started with Android developer verification&lt;/h2&gt;

&lt;p&gt;If you distribute apps in Brazil, Indonesia, Singapore, or Thailand via the stores listed above, please ensure your verification is complete by the September deadline.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;strong&gt;Google Play developers:&lt;/strong&gt; Most Play developers are already verified, and over 99% of their apps have been registered. Go to your &lt;a href="https://play.google.com/console/developers/app-list"&gt;Play Console Home page&lt;/a&gt; to see your app’s verification status, and &lt;a href="https://support.google.com/googleplay/android-developer/answer/16984799"&gt;register apps&lt;/a&gt; you want to continue distributing that weren't automatically registered.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Developers who distribute only outside of Google Play:&lt;/strong&gt;&amp;nbsp;Sign up for the &lt;a href="https://android.google.com/developerconsole/developers"&gt;Android Developer Console&lt;/a&gt; today to register your apps.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Students and hobbyists:&lt;/strong&gt;&amp;nbsp;Sign up &lt;a href="https://google.qualtrics.com/jfe/form/SV_4N7NGE06NjJJdl4"&gt;here&lt;/a&gt; for early access to limited distribution accounts to help us refine the feature with your feedback.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;

Thank you for helping us build a safer Android ecosystem. Stay tuned for more updates as we approach September and the 2027 global rollout.&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/5772221969599763917/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/android-developer-verification.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/5772221969599763917" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/5772221969599763917" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/android-developer-verification.html" rel="alternate" title="Android developer verification: Building a safer ecosystem together" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2JeeSz9AeQDASycrf2ssGmJn2yQGvGFjyU29jKSs5hFtYySX9X5wDw4Pb63DF3co77osfiLeYj6LGt-_1v66X3svzCOdWAZz3w9Q2WKF28T4qZ4tCbiTEsP88lIZ44Ua6mLfg6VIQL_k3PVWlU4vDnJkTc9mJkdz188lH-smTL3oA47Yongl1w8sf4RY/s72-c/260317_ADV%20Blog_Metadata.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-6921297495746094343</id><published>2026-06-17T10:00:00.000-07:00</published><updated>2026-07-16T09:53:34.323-07:00</updated><title type="text">Building a Mixed-Reality Tour Guide with Android XR, the Geospatial API, and Gemini</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKrortZT9X64_5gun79eaNo1niWelmj6Mixfrw4eBLKkec02_w-el6vVXR8IuyPA40B4lB22yEdCK5KNVOZ3DwG3sja7MJArx60irN7gP9P7rnzMjx8sejJeE6puifztBfMv_mExAuAjKkE3rjW1PRulfU0wTfIVLtmb9lEUW4L9hhFme1ArGmV09GuXM/s320/MM%20Android%20XR%20Geospatial%20V02_Meta%20(1).png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKrortZT9X64_5gun79eaNo1niWelmj6Mixfrw4eBLKkec02_w-el6vVXR8IuyPA40B4lB22yEdCK5KNVOZ3DwG3sja7MJArx60irN7gP9P7rnzMjx8sejJeE6puifztBfMv_mExAuAjKkE3rjW1PRulfU0wTfIVLtmb9lEUW4L9hhFme1ArGmV09GuXM/s320/MM%20Android%20XR%20Geospatial%20V02_Meta%20(1).png" style="display: none;" /&gt;&lt;div&gt;&lt;i&gt;Posted by Coco Fatus, UX Designer, Alon Hetzroni, UX Engineer, Azin Mehrnoosh, Product Manager Android XR&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTa2M7znb9EjsONU5iM1tvB_KPswY-yT7pqYZ2gZmJGk9Z6WONXgDOsTj9vvTPD8a38-XvPm7HafuF1-nChC7dix2CQfnTpH6T-YdPhaL85A7rRugnlwwtPtwH-Z5WWSFVNYXCclOOL5DtNbNqRLX-ZJVAIrRDxYs8pgfWS0O0O2P_e-W6TjYH_RjnCuM/s8000/MM%20Android%20XR%20Geospatial%20V02_Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2442" data-original-width="8000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTa2M7znb9EjsONU5iM1tvB_KPswY-yT7pqYZ2gZmJGk9Z6WONXgDOsTj9vvTPD8a38-XvPm7HafuF1-nChC7dix2CQfnTpH6T-YdPhaL85A7rRugnlwwtPtwH-Z5WWSFVNYXCclOOL5DtNbNqRLX-ZJVAIrRDxYs8pgfWS0O0O2P_e-W6TjYH_RjnCuM/s16000/MM%20Android%20XR%20Geospatial%20V02_Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=1KOO2lqsdaA"&gt;At this year's Google I/O&lt;/a&gt;, we announced an update for spatial experiences: the &lt;a href="https://developer.android.com/reference/kotlin/androidx/xr/arcore/Geospatial"&gt;Geospatial API&lt;/a&gt; is now available as a preview in &lt;a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/arcore"&gt;ARCore for Jetpack XR&lt;/a&gt;. By bringing Google's Visual Positioning System (VPS) to Android XR, Android XR enables anchoring digital content to the physical world with sub-meter accuracy and precise orientation in supported areas.* To explore what the Geospatial API could unlock, our team built a demo: the XR Geospatial Tour.&lt;/p&gt;

&lt;p&gt;Imagine walking into a new city, putting on a pair of wired XR glasses (like the upcoming XREAL Project Aura), and instantly having a knowledgeable, local guide showing you around. You don't need to stare down at a 2D map—instead, 3D models gently guide your path, and an intelligent voice tells you about the historical landmarks right in front of you. We combined the &lt;a href="https://developer.android.com/reference/kotlin/androidx/xr/arcore/Geospatial"&gt;Geospatial APIs&lt;/a&gt;, &lt;a href="https://firebase.google.com/docs/ai-logic"&gt;Gemini API using Firebase AI Logic&lt;/a&gt;, &lt;a href="https://ai.google.dev/gemini-api/docs/maps-grounding"&gt;Google Maps Grounding&lt;/a&gt;, and &lt;a href="https://developer.android.com/develop/xr/jetpack-xr-sdk"&gt;Jetpack XR SDK&lt;/a&gt; to create a hands-free, immersive walking tour experience.&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/HpQLXX19boI" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="HpQLXX19boI"&gt;&lt;/iframe&gt;
  
&lt;p style="font-size: 0.85em; font-style: italic; line-height: 1.5; margin: 0px 0px 24px;"&gt;*Disclaimer: Video and Tour Guide application are for demonstration purposes only. Some sequences have been shortened. Any hardware depicted may be under development; final product details may differ.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Let’s walk through the implementation details and show how we tied these APIs together to build a world-scale spatial experience.&lt;/p&gt;

&lt;h3 style="text-align: left;"&gt;1. Pinpointing the User with ARCore Geospatial API (VPS)&lt;/h3&gt;
&lt;p style="text-align: left;"&gt;Enhance your navigation experience on XR by combining the power of GPS with the precision of VPS. The accuracy and precise orientation that comes with VPS allows 3D waypoints to align with the physical world.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;This is why the Geospatial API on Android XR can help you build custom experiences. By using advanced computer vision, VPS tries to provide a &lt;a href="https://developer.android.com/reference/kotlin/androidx/xr/runtime/math/GeospatialPose"&gt;GeospatialPose&lt;/a&gt; (including latitude, longitude, and heading) that is more accurate than GPS.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Here's how we retrieve the user's Geospatial pose by mapping the device's orientation to a Geospatial coordinate:&lt;/p&gt;
&lt;pre&gt;&lt;div style="text-align: left;"&gt;// Retrieve the current geospatial pose from the ARCore session&lt;/div&gt;&lt;code&gt;&lt;div style="text-align: left;"&gt;val result = geospatial.createGeospatialPoseFromPose(arDevice.state.value.devicePose)&lt;/div&gt;&lt;div style="text-align: left;"&gt;if (result is CreateGeospatialPoseFromPoseSuccess) {&lt;/div&gt;&lt;div style="text-align: left;"&gt;    val pose = result.pose&lt;/div&gt;&lt;div style="text-align: left;"&gt;    Log.d("VPS", "Accurate Location: ${pose.latitude}, ${pose.longitude}")&lt;/div&gt;&lt;div style="text-align: left;"&gt;}&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style="text-align: left;"&gt;Because the entire experience relies on this accuracy, we monitor the horizontalAccuracy and orientationYawAccuracy until they meet our thresholds. If the user is indoors or in an unrecognized area, we prompt them to "walk to an outdoor public space and look around".&lt;/p&gt;

&lt;h3 style="text-align: left;"&gt;2. Crafting the Itinerary with Gemini API &amp;amp; Google Maps Grounding&lt;/h3&gt;
&lt;p style="text-align: left;"&gt;Once we have a location, we use the &lt;a href="https://firebase.google.com/docs/ai-logic"&gt;Gemini API using Firebase AI Logic&lt;/a&gt; to prompt the Gemini model to act as a local tour guide. We pass the user's coordinates to the model and ask it to output a structured JSON response containing nearby walking tours:&lt;/p&gt;

&lt;pre&gt;&lt;div style="text-align: left;"&gt;   val configForTools = ToolConfig(&lt;/div&gt;&lt;code&gt;&lt;div style="text-align: left;"&gt;      functionCallingConfig = null,&lt;/div&gt;&lt;div style="text-align: left;"&gt;      retrievalConfig = retrievalConfig {&lt;/div&gt;&lt;div style="text-align: left;"&gt;        latLng = FirebaseLatLng(pose.latitude, pose.longitude)&lt;/div&gt;&lt;div style="text-align: left;"&gt;        languageCode = "en"&lt;/div&gt;&lt;div style="text-align: left;"&gt;      }&lt;/div&gt;&lt;div style="text-align: left;"&gt;    )&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;    val responseJsonSchema = Schema.obj(&lt;/div&gt;&lt;div style="text-align: left;"&gt;      mapOf(&lt;/div&gt;&lt;div style="text-align: left;"&gt;        "locationIntro" to Schema.string(),&lt;/div&gt;&lt;div style="text-align: left;"&gt;        "tours" to Schema.array(&lt;/div&gt;&lt;div style="text-align: left;"&gt;          Schema.obj(&lt;/div&gt;&lt;div style="text-align: left;"&gt;            mapOf(&lt;/div&gt;&lt;div style="text-align: left;"&gt;              "title" to Schema.string(),&lt;/div&gt;&lt;div style="text-align: left;"&gt;              "description" to Schema.string(),&lt;/div&gt;&lt;div style="text-align: left;"&gt;              "stops" to Schema.array(&lt;/div&gt;&lt;div style="text-align: left;"&gt;                Schema.obj(&lt;/div&gt;&lt;div style="text-align: left;"&gt;                  mapOf(&lt;/div&gt;&lt;div style="text-align: left;"&gt;                    "name" to Schema.string(),&lt;/div&gt;&lt;div style="text-align: left;"&gt;                    "detailedName" to Schema.string(),&lt;/div&gt;&lt;div style="text-align: left;"&gt;                    "description" to Schema.string()&lt;/div&gt;&lt;div style="text-align: left;"&gt;                  )&lt;/div&gt;&lt;div style="text-align: left;"&gt;                )&lt;/div&gt;&lt;div style="text-align: left;"&gt;              )&lt;/div&gt;&lt;div style="text-align: left;"&gt;            )&lt;/div&gt;&lt;div style="text-align: left;"&gt;          )&lt;/div&gt;&lt;div style="text-align: left;"&gt;        )&lt;/div&gt;&lt;div style="text-align: left;"&gt;      )&lt;/div&gt;&lt;div style="text-align: left;"&gt;    )&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;    val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(&lt;/div&gt;&lt;div style="text-align: left;"&gt;      modelName = "gemini-3.5-flash",&lt;/div&gt;&lt;div style="text-align: left;"&gt;      tools = listOf(Tool.googleMaps()),&lt;/div&gt;&lt;div style="text-align: left;"&gt;      generationConfig = generationConfig {&lt;/div&gt;&lt;div style="text-align: left;"&gt;        responseMimeType = "application/json"&lt;/div&gt;&lt;div style="text-align: left;"&gt;        responseSchema = responseJsonSchema&lt;/div&gt;&lt;div style="text-align: left;"&gt;      }&lt;/div&gt;&lt;div style="text-align: left;"&gt;    )&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;   val result = model.generateContent("The user is at latitude ${pose.latitude} and longitude ${pose.longitude}. Generate exactly 3 diverse tours near this location (e.g., historical, food, nature). All tour ideas should be walking distance only.")&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style="text-align: left;"&gt;Large Language Models are great at generating rich descriptions, but they can sometimes hallucinate exact latitude/longitude coordinates. To solve this, we used &lt;a href="https://ai.google.dev/gemini-api/docs/maps-grounding"&gt;Google Maps Grounding&lt;/a&gt; to ground the AI.&lt;/p&gt;

&lt;h3 style="text-align: left;"&gt;3. A Voice to Guide You: Gemini 2.5 TTS&lt;/h3&gt;
&lt;p style="text-align: left;"&gt;To make the tour guide feel truly present, we implemented dynamic voiceovers.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Using the gemini-2.5-flash-tts model, we can configure our model generation config to natively return audio data instead of just text! Here’s how you can request the ResponseModality.AUDIO:&lt;/p&gt;

&lt;pre&gt;&lt;div style="text-align: left;"&gt;val ttsModel = Firebase.ai(backend = GenerativeBackend.googleAI())&lt;/div&gt;&lt;code&gt;&lt;div style="text-align: left;"&gt;    .generativeModel(&lt;/div&gt;&lt;div style="text-align: left;"&gt;        modelName = "gemini-2.5-flash-tts",&lt;/div&gt;&lt;div style="text-align: left;"&gt;        generationConfig = generationConfig {&lt;/div&gt;&lt;div style="text-align: left;"&gt;            // Instruct the model to return Audio&lt;/div&gt;&lt;div style="text-align: left;"&gt;            responseModalities = listOf(ResponseModality.AUDIO)&lt;/div&gt;&lt;div style="text-align: left;"&gt;        }&lt;/div&gt;&lt;div style="text-align: left;"&gt;    )&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;val response = ttsModel.generateContent("Say in a neutral but positive voice:\n$prompt")&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;// Extract the raw audio bytes from the response&lt;/div&gt;&lt;div style="text-align: left;"&gt;val audioBytes = response.candidates.firstOrNull()?.content?.parts&lt;/div&gt;&lt;div style="text-align: left;"&gt;    ?.filterIsInstance&amp;lt;InlineDataPart&amp;gt;()&lt;/div&gt;&lt;div style="text-align: left;"&gt;    ?.firstOrNull { it.mimeType.contains("audio") }?.inlineData&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h3 style="text-align: left;"&gt;4. Bringing it to Life in 3D with Jetpack XR&lt;/h3&gt;
&lt;p style="text-align: left;"&gt;The final piece of the puzzle is rendering this data in the user's field of view. The Jetpack XR SDK makes it intuitive to transition from  a 2D Android UI to spatial computing.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;We used Jetpack Compose for XR to build spatial components. To represent points of interest along the tour, we built a Composable called InfoSphere, which contains a GltfModel of a 3D orb that floats in space and can be interacted with to reveal information.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Using Jetpack XR SDK, we can place 3D models alongside the Compose UI using &lt;a href="https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/SpatialBox.composable"&gt;SpatialBox&lt;/a&gt; and &lt;a href="https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/SceneCoreEntity.composable"&gt;SceneCoreEntity&lt;/a&gt;. We also used &lt;a href="https://developer.android.com/reference/androidx/xr/scenecore/InteractableComponent"&gt;InteractableComponent&lt;/a&gt; to respond to user taps.&lt;/p&gt;
&lt;pre&gt;&lt;div style="text-align: left;"&gt;@Composable&lt;/div&gt;&lt;code&gt;&lt;div style="text-align: left;"&gt;fun InfoSphere(&lt;/div&gt;&lt;div style="text-align: left;"&gt;    content: InfoBubbleContent,&lt;/div&gt;&lt;div style="text-align: left;"&gt;    session: Session,&lt;/div&gt;&lt;div style="text-align: left;"&gt;    sphereModel: GltfModel,&lt;/div&gt;&lt;div style="text-align: left;"&gt;    isSelected: Boolean,&lt;/div&gt;&lt;div style="text-align: left;"&gt;    onClick: () -&amp;gt; Unit&lt;/div&gt;&lt;div style="text-align: left;"&gt;) {&lt;/div&gt;&lt;div style="text-align: left;"&gt;    // SpatialBox lets us arrange 3D components and SpatialPanels together&lt;/div&gt;&lt;div style="text-align: left;"&gt;    SpatialBox(&lt;/div&gt;&lt;div style="text-align: left;"&gt;        SubspaceModifier&lt;/div&gt;&lt;div style="text-align: left;"&gt;            .offset(x = 2.dp, y = 1.dp, z = (-3).dp) // Positioned in 3D space&lt;/div&gt;&lt;div style="text-align: left;"&gt;    ) {&lt;/div&gt;&lt;div style="text-align: left;"&gt;        // Smoothly animate the visibility of our 2D Compose UI Panel&lt;/div&gt;&lt;div style="text-align: left;"&gt;        AnimatedSpatialVisibility(visible = isSelected) {&lt;/div&gt;&lt;div style="text-align: left;"&gt;            SpatialPanel {&lt;/div&gt;&lt;div style="text-align: left;"&gt;                InfoBubble(content) // Regular 2D Compose UI&lt;/div&gt;&lt;div style="text-align: left;"&gt;            }&lt;/div&gt;&lt;div style="text-align: left;"&gt;        }&lt;/div&gt;&lt;div style="text-align: left;"&gt;        // Render our interactive 3D sphere&lt;/div&gt;&lt;div style="text-align: left;"&gt;        SceneCoreEntity(&lt;/div&gt;&lt;div style="text-align: left;"&gt;            factory = {&lt;/div&gt;&lt;div style="text-align: left;"&gt;                GltfModelEntity.create(session, sphereModel).also { entity -&amp;gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;                    // Make the 3D model respond to user taps&lt;/div&gt;&lt;div style="text-align: left;"&gt;                    entity.addComponent(InteractableComponent.create(session) { inputEvent -&amp;gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;                        if (inputEvent.action == InputEvent.Action.UP) {&lt;/div&gt;&lt;div style="text-align: left;"&gt;                            onClick()&lt;/div&gt;&lt;div style="text-align: left;"&gt;                        }&lt;/div&gt;&lt;div style="text-align: left;"&gt;                    })&lt;/div&gt;&lt;div style="text-align: left;"&gt;                }&lt;/div&gt;&lt;div style="text-align: left;"&gt;            }&lt;/div&gt;&lt;div style="text-align: left;"&gt;        )&lt;/div&gt;&lt;div style="text-align: left;"&gt;    }&lt;/div&gt;&lt;div style="text-align: left;"&gt;}&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style="text-align: left;"&gt;By combining &lt;a href="https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/animation/AnimatedSpatialVisibility.composable"&gt;AnimatedSpatialVisibility&lt;/a&gt; for traditional Compose UI surfaces with SceneCoreEntity 3D elements, we're able to seamlessly blend data into the physical world.&lt;/p&gt;

&lt;h3 style="text-align: left;"&gt;Explore what’s possible with Android XR today&lt;/h3&gt;
&lt;p style="text-align: left;"&gt;Building the XR Geospatial Tour app showed us that the barrier to entry for world-scale spatial experiences is lower than ever for Android developers. With the Geospatial API now available in preview on Android XR, your apps can seamlessly understand the physical world around them. By combining &lt;a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/ui-compose"&gt;Compose for XR&lt;/a&gt;’s APIs with the high-precision location data of VPS and the generative capabilities of Gemini, we can create experiences that understand both where the user is and what they are looking at.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;To help you get hands-on with Android XR, we are thrilled to open applications for the &lt;a href="https://developer.android.com/develop/xr/catalyst"&gt;Android XR Developer Catalyst Program&lt;/a&gt;, which includes XREAL Project Aura. Starting today, you can apply to get access to an XREAL Project Aura devkit or our display glasses devkit over the coming months! &lt;/p&gt;

&lt;footer style="font-size: 0.85em; font-style: italic; line-height: 1.5; margin-top: 35px;"&gt;
  &lt;p style="margin: 0px 0px 8px; text-align: left;"&gt;*Disclaimer: Available on select devices. Internet connection required. Works on compatible apps and surfaces. Results may vary.&lt;/p&gt;
  &lt;p style="margin: 0px;"&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/footer&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/6921297495746094343/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/android-xr-geospatial-api-gemini.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/6921297495746094343" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/6921297495746094343" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/android-xr-geospatial-api-gemini.html" rel="alternate" title="Building a Mixed-Reality Tour Guide with Android XR, the Geospatial API, and Gemini" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKrortZT9X64_5gun79eaNo1niWelmj6Mixfrw4eBLKkec02_w-el6vVXR8IuyPA40B4lB22yEdCK5KNVOZ3DwG3sja7MJArx60irN7gP9P7rnzMjx8sejJeE6puifztBfMv_mExAuAjKkE3rjW1PRulfU0wTfIVLtmb9lEUW4L9hhFme1ArGmV09GuXM/s72-c/MM%20Android%20XR%20Geospatial%20V02_Meta%20(1).png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-8580547527446050357</id><published>2026-06-16T06:00:00.000-07:00</published><updated>2026-06-16T12:44:08.241-07:00</updated><title type="text">Android 17 is here</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV7zuuXjulHty999mGDWY1kfL8Q9SXjYYWn-7JTpMfVdNP78eb5fW9shOpvVdEqK0WnNp7AhdO0qc7pXAaqcfTwXgOGsfZyqcQv8wyD-9niWBpZuP6ZAPHBSetWenN2lMlRS5wi2d71-n8RCYqrLsFhUCEvM7KeoGLnNaDbiyOZQ0vvyr0O580nXK4Vas/s2048/Metadata%20-%20Static.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV7zuuXjulHty999mGDWY1kfL8Q9SXjYYWn-7JTpMfVdNP78eb5fW9shOpvVdEqK0WnNp7AhdO0qc7pXAaqcfTwXgOGsfZyqcQv8wyD-9niWBpZuP6ZAPHBSetWenN2lMlRS5wi2d71-n8RCYqrLsFhUCEvM7KeoGLnNaDbiyOZQ0vvyr0O580nXK4Vas/s2048/Metadata%20-%20Static.png" style="display: none;" /&gt;&lt;div&gt;&lt;i&gt;Posted by Matthew McCullough, VP of Product Management, Android Developer&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5KPJZylMSUXRpKFRUd6oM4fNdEoDRdJzdkzg69P_BVUuIDtXqCqTid6hGH40CoHRw7-f50HsT6rISArklGH982MM4K1jKU16SSymes4JPoE4qOZ5s1lLnkbInpUpdJGu5erAYmSgiefzkkOX_ng3AUJKOzzwC1WMTjk2DxLNia8R1C-ErWc7jT4VP8ew/s4209/Blogger%20Hero%20-%20White.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5KPJZylMSUXRpKFRUd6oM4fNdEoDRdJzdkzg69P_BVUuIDtXqCqTid6hGH40CoHRw7-f50HsT6rISArklGH982MM4K1jKU16SSymes4JPoE4qOZ5s1lLnkbInpUpdJGu5erAYmSgiefzkkOX_ng3AUJKOzzwC1WMTjk2DxLNia8R1C-ErWc7jT4VP8ew/s16000/Blogger%20Hero%20-%20White.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Today we're releasing Android 17 and making it available on most supported Pixel devices. Look for new devices running Android 17 in the coming months.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjaHGBWXu3yvdXZ-wYQgN6DjN5TEMRIYDJvQDZTOybRZFWsAMhqhl14b9UZmrlXlEIRDioqRc8m3xRjOnQHJPoICkVpCho4qrmKihPbu_SB7dGVNKwlAaX6eWdjLF4VUdGyzGfxtW0ziFggj63e778VVo38qpMKar4E1wuw0MiPCBvBdrTTXCgI1XD04Q/s1080/AfD-Android-17.gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1080" data-original-width="1080" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjaHGBWXu3yvdXZ-wYQgN6DjN5TEMRIYDJvQDZTOybRZFWsAMhqhl14b9UZmrlXlEIRDioqRc8m3xRjOnQHJPoICkVpCho4qrmKihPbu_SB7dGVNKwlAaX6eWdjLF4VUdGyzGfxtW0ziFggj63e778VVo38qpMKar4E1wuw0MiPCBvBdrTTXCgI1XD04Q/s320/AfD-Android-17.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;Android 17 marks the start of our transition to an intelligence system, putting your apps at the center. It's shifting to an adaptive-first development standard by introducing mandatory large-screen resizability, all while delivering next-generation privacy, security, media, camera, and performance. We'll cover all that in this post, as well as how we're bringing together next generation tools, libraries, and agent skills to help your apps embrace the opportunity.&lt;/p&gt;

&lt;p&gt;Throughout the past year, from our Canary channel to our Beta releases, we’ve collaborated with you in the developer community to build a platform you and your users can trust. To that end, this moment marks the availability of the source code at the &lt;a href="https://source.android.com/"&gt;Android Open Source Project&lt;/a&gt; (AOSP). This allows you to &lt;a href="https://cs.android.com/"&gt;examine the source code&lt;/a&gt; for a deeper understanding of how Android works.&lt;/p&gt;

&lt;p&gt;Let's dive deeper into Android 17.&lt;/p&gt;

&lt;h3&gt;An intelligence system&lt;/h3&gt;

&lt;p&gt;With deep integration between hardware, software and AI, we’re transforming Android from an operating system to an intelligence system. It's about delivering new helpful experiences that anticipate user needs, and it brings more opportunities for engagement with your apps. To that end, Android 17 expands the capabilities of AppFunctions, a platform API with a corresponding Jetpack library. It allows you to contribute your app's unique capabilities as orchestratable "tools" for Android MCP, the on-device equivalent of the &lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt;. AI agents and assistants (like Google Gemini) can discover and execute AppFunctions to perform workflows on behalf of the user with direct access to the app's local state.&lt;/p&gt;

&lt;p&gt;The Jetpack library, currently in alpha, makes adding AppFunctions as easy as annotating a class and adding KDoc comments.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * A note app's [AppFunction]s.
 */
class NoteFunctions(
    private val noteRepository: NoteRepository
) {
    /**
     * Adds a new note to the app.
     *
     * @param appFunctionContext The execution context.
     * @param title The title of the note.
     * @param content The note's content.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createNote(
        appFunctionContext: AppFunctionContext,
        title: String,
        content: String
    ): Note {
        return noteRepository.createNote(title, content)
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We’ve also launched an &lt;a href="http://github.com/android/skills/tree/main/on-device/appfunctions"&gt;AppFunctions agent skill&lt;/a&gt; that analyzes your app’s key workflows, automatically generates the required Kotlin code, optimizes your KDocs for LLM tool-calling, and provides ADB commands for testing and debugging.&lt;/p&gt;

&lt;p&gt;The Gemini integration is currently in a private preview with trusted testers, but you can begin preparing your apps now. In addition to ADB commands to execute your AppFunctions, we've provided a &lt;a href="http://github.com/android/appfunctions/releases/initial"&gt;test agent app&lt;/a&gt; that includes an interface to discover and execute your app functions and simulate an AI agent integration. Join our integration early access program at &lt;a href="http://goo.gle/eap-af"&gt;goo.gle/eap-af&lt;/a&gt; for a chance to be among the first apps to deploy AppFunctions to production.&lt;/p&gt;

&lt;h3&gt;Adaptive-first&lt;/h3&gt;
&lt;p&gt;Your users no longer rely on a single form factor; they transition between phones, foldables, tablets, laptops, automotive displays, and immersive XR environments. Now, with over &lt;a href="https://developer.android.com/blog/posts/adaptive-development-for-the-expanding-android-ecosystem"&gt;580 million large screen devices&lt;/a&gt; in the hands of users and the &lt;a href="https://blog.google/products-and-platforms/platforms/android/meet-googlebook/"&gt;forthcoming launch of Googlebooks&lt;/a&gt;, the next generation of ChromeOS built on the Android stack, adaptive is no longer just a technical goal. It’s a massive opportunity to reach highly engaged users, which is one of the reasons we're shifting to an &lt;a href="https://developer.android.com/adaptive-apps"&gt;adaptive-first development standard&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;No resizability/orientation restrictions on large screens&lt;/h2&gt;
&lt;p&gt;To ensure apps deliver a premium experience across all form factors, including mobile devices running in desktop mode on connected displays, Android 17 (API level 37) removes the developer opt-out for orientation and resizability restrictions on &lt;a href="https://developer.android.com/guide/topics/large-screens"&gt;large screen devices&lt;/a&gt; (sw &amp;gt; 600 dp) for apps targeting API level 37. The system will ignore legacy manifest attributes and runtime APIs, including screenOrientation, setRequestedOrientation(), resizeableActivity=false, and aspect ratio constraints (minAspectRatio/maxAspectRatio). Games (based on &lt;a href="https://support.google.com/googleplay/android-developer/answer/9859673?hl=en"&gt;app category&lt;/a&gt; in Google Play) remain exempt. Your app must be ready to adapt to any window size, respect the user's preferred device posture, and support free-form windowing natively.&lt;/p&gt;

&lt;h2&gt;Next-gen multitasking: App Bubbles, Bubble Bar, and desktop interactive PiP&lt;/h2&gt;
&lt;p&gt;Android 17 introduces powerful new windowing capabilities that redefine how users multitask, demanding even greater layout flexibility from your apps:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;App Bubbles:&lt;/strong&gt; Moving beyond the messaging bubbles API, users can now transform any app into a floating bubble by long-pressing its icon on the launcher. This feature is available across phones, foldables, and tablets, enabling lightweight multitasking for any workflow.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;The Bubble Bar:&lt;/strong&gt; On large screens (tablets and foldables), the system taskbar now includes a dedicated Bubble Bar to organize, transition between, and dock these floating app bubbles.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Desktop interactive PiP:&lt;/strong&gt; In desktop environments, Android 17 introduces interactive Picture-in-Picture (PiP). Unlike traditional PiP windows which are read-only, these pinned windows remain fully interactive while staying always-on-top of other application windows.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg12FRQ31sUiyMj_ZalamTRI4VyI2tMXYKEoRy6b-u0Het272IDbRhznXot7b8AvFJEX-ubw_-pNxyS5JTKPUTBj1CNXwIYkTE906vembUcHeyGzE4Lb72WRyGNF7dOP_aBssNeCplOjEnKAc3d3hkak81LOpG0g9Hlep0AvC11MjdJ1MkqAp7ViUCu2bw/s1600/Bubbles%20(1).gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1600" data-original-width="1544" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg12FRQ31sUiyMj_ZalamTRI4VyI2tMXYKEoRy6b-u0Het272IDbRhznXot7b8AvFJEX-ubw_-pNxyS5JTKPUTBj1CNXwIYkTE906vembUcHeyGzE4Lb72WRyGNF7dOP_aBssNeCplOjEnKAc3d3hkak81LOpG0g9Hlep0AvC11MjdJ1MkqAp7ViUCu2bw/s16000/Bubbles%20(1).gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: center;"&gt;&lt;i&gt;App Bubbles and Bubble Bar in action&lt;/i&gt;&lt;/p&gt;

&lt;h2&gt;Activity recreation updates&lt;/h2&gt;
&lt;p&gt;To prevent disruptive state loss and stutter, Android 17 updates the default behavior for Activity recreation. The system will no longer restart activities by default for typical configuration changes that do not require a full UI redraw (including &lt;a href="https://developer.android.com/reference/kotlin/android/content/pm/ActivityInfo#config_keyboard"&gt;CONFIG_KEYBOARD&lt;/a&gt;, &lt;a href="https://developer.android.com/reference/kotlin/android/content/pm/ActivityInfo#config_keyboard_hidden"&gt;CONFIG_KEYBOARD_HIDDEN&lt;/a&gt;, &lt;a href="https://developer.android.com/reference/kotlin/android/content/pm/ActivityInfo#config_navigation"&gt;CONFIG_NAVIGATION&lt;/a&gt;, &lt;a href="https://developer.android.com/reference/kotlin/android/content/pm/ActivityInfo#config_touchscreen"&gt;CONFIG_TOUCHSCREEN&lt;/a&gt;, and &lt;a href="https://developer.android.com/reference/kotlin/android/content/pm/ActivityInfo#config_color_mode"&gt;CONFIG_COLOR_MODE&lt;/a&gt;).&lt;br /&gt;
Instead, running activities will receive these updates via onConfigurationChanged(), enabling smooth transitions. If your application explicitly relies on a full restart to reload resources for these changes, you must now explicitly opt-in using the new &lt;a href="https://developer.android.com/reference/kotlin/android/R.attr#recreateonconfigchanges"&gt;android:recreateOnConfigChanges&lt;/a&gt; manifest attribute.&lt;/p&gt;

&lt;h2&gt;Continue On&lt;/h2&gt;
&lt;p&gt;Android 17 adds Continue On to help users seamlessly transition a task between Android devices. The user sees a suggestion for the most recently opened app from their mobile device in their tablet taskbar, providing a one-tap affordance to launch the app and deep-link where they left off. Continue on can support app-to-web transitions, including falling back to using the web if the app isn't installed.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc8K42DCZ0VTYpFhTlEazp9_AthhqYdm786k1NFolZrP7HwXk2QlF7UV1CU7ECK9N-CiHSfSbH_E2_cXwL3zUuesP-shpa1nau5QmVWDOQeErnCMtvZUw_wwAHNewZZ5S3811f0n_FNoX4U9kyptZQONM_eDB1AAHaoFjMFgTCC7G1d0X2iRo1MN8sev0/s1920/Continue%20On.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1200" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc8K42DCZ0VTYpFhTlEazp9_AthhqYdm786k1NFolZrP7HwXk2QlF7UV1CU7ECK9N-CiHSfSbH_E2_cXwL3zUuesP-shpa1nau5QmVWDOQeErnCMtvZUw_wwAHNewZZ5S3811f0n_FNoX4U9kyptZQONM_eDB1AAHaoFjMFgTCC7G1d0X2iRo1MN8sev0/s16000/Continue%20On.png" /&gt;&lt;/a&gt;&lt;i&gt;Handoff Suggestion on a Tablet&lt;/i&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;&lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class MyHandoffActivity : Activity() {

    ...

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Do stuff
    ...
    // Enable handoff
    setHandoffEnabled(true, null)
  }

  // Override and implement onHandoffActivityDataRequested
  override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
    // Create and return handoff data
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Go adaptive-first with Jetpack Compose&lt;/h2&gt;
&lt;p&gt;To help you adapt your apps to meet the new Android 17 requirements, we've launched the &lt;a href="https://github.com/android/skills/tree/main/jetpack-compose/adaptive"&gt;Jetpack Compose adaptive skill&lt;/a&gt;. This AI-powered developer workflow helps you implement the best adaptive practices:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Adaptive navigation:&lt;/strong&gt; Automatically transition between bottom navigation bars on mobile and edge-anchored navigation rails on large screens using NavigationSuiteScaffold from the Material 3 Adaptive library.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Multi-pane layouts:&lt;/strong&gt; Implement list-detail and supporting pane layouts natively using Navigation 3 Scenes (ListDetailSceneStrategy and SupportingPaneSceneStrategy) instead of fragile fragment transactions.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;FlexBox &amp;amp; Grid APIs:&lt;/strong&gt; Utilize Compose 1.11's dynamic layout components to easily adjust row and column spans on the fly, ensuring your content always fills the space beautifully.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Advanced non-touch input:&lt;/strong&gt; Leverage Compose 1.11's enhanced trackpad and mouse support, including native focus rings and new APIs (like TrackpadInjectionScope and performTrackpadInput) to easily test and deliver a true "laptop-class" experience on Googlebooks and Desktop Mode.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Dynamic window states:&lt;/strong&gt; Leverage Compose's reactive state model to seamlessly adapt your UI when the app transitions from full screen to a floating App Bubble or an interactive Desktop PiP window, ensuring a premium experience even at minimal dimensions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Android is Compose-first&lt;/h2&gt;
&lt;p&gt;Compose offers the easiest way to build adaptive apps, and that's just one of the &lt;a href="https://developer.android.com/develop/ui/compose/first#why-compose-first"&gt;many reasons&lt;/a&gt; we believe that all Android UI should be built with Compose. To that end, &lt;a href="https://developer.android.com/develop/ui/compose/first"&gt;Android development is now Compose-first&lt;/a&gt;. All new Android APIs, libraries, tools, and developer guidance will be built exclusively for Jetpack Compose. Legacy View components (in the android.widget package) and View-based Jetpack libraries (like Fragments, RecyclerView, and ViewPager) are now in maintenance mode. They will receive only critical bug fixes, and no new features.&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;&lt;br /&gt;
    Ready to migrate? Use our AI-driven &lt;a href="https://developer.android.com/develop/ui/compose/migrate/migrate-xml-views-to-jetpack-compose"&gt;XML to Compose Migration Skill&lt;/a&gt; to automatically analyze your legacy View layouts and convert them into highly-adaptive Compose code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;Performance &amp;amp; efficiency&lt;/h3&gt;
&lt;p&gt;App performance means a smooth user interface, fast app start times, and efficient multitasking; Android 17 has impactful improvements in all of these areas.&lt;/p&gt;

&lt;h2&gt;App memory limits&lt;/h2&gt;
&lt;p&gt;Memory usage is one of the silent foundations of overall performance. When a foreground app or service grows unchecked, memory management spikes CPU and battery utilization and eventually leads to the termination of other well-behaved cached apps and background jobs, ultimately forcing slower cold starts and impaired multitasking.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Starting in Android 17, the system will enforce strict app memory limits based on a device's total RAM, abruptly terminating offending processes. New things to help you navigate these tighter requirements:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;R8 Optimizer:&lt;/strong&gt; The R8 optimizer significantly reduces your app's bytecode memory footprint by shrinking classes, methods, and fields into shorter names, and stripping out unused code and resources. Use R8 in full mode along with the new &lt;a href="https://developer.android.com/topic/performance/app-optimization/r8-configuration-analyzer"&gt;R8 configuration analyzer&lt;/a&gt; to make sure your app is getting the most from R8.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQePgjeISaotpA-miDPKel-qgAYtepLjMMBaiKZQqTf_iYRTJurn_iAFdC7utLnKRKAh9OhSjF_D83skA2PPg7xts0ORX7aVxBkoax6b9uEPqTlGiY_sh8Xv7U1pr0h4Nm8FLo-h3IJD8FhTJc-gOtpBwyLCnDBUPRJAuaaBjsIOhvUmTXFSna0ykksak/s2048/R8%20Configuration%20Analyzer.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="397" data-original-width="2048" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQePgjeISaotpA-miDPKel-qgAYtepLjMMBaiKZQqTf_iYRTJurn_iAFdC7utLnKRKAh9OhSjF_D83skA2PPg7xts0ORX7aVxBkoax6b9uEPqTlGiY_sh8Xv7U1pr0h4Nm8FLo-h3IJD8FhTJc-gOtpBwyLCnDBUPRJAuaaBjsIOhvUmTXFSna0ykksak/s16000/R8%20Configuration%20Analyzer.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="color: #0000ee;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0000ee;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;The R8 Configuration Analyzer&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;LeakCanary in Android Studio Panda:&lt;/strong&gt; The profiler now features native LeakCanary integration as a dedicated task, fully integrated with your IDE and source code.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;ApplicationExitInfo:&lt;/strong&gt; If your app is terminated by these limits, getDescription() from ApplicationExitInfo will return "MemoryLimiter:AnonSwap".&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;On-Device Anomaly Detection:&lt;/strong&gt; Part of ProfilingManager, you can leverage trigger-based profiling using TRIGGER_TYPE_ANOMALY to automatically capture heap dumps when the memory limit is reached.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;val profilingManager = applicationContext
   .getSystemService(ProfilingManager::class.java)

val triggers = ArrayList&amp;lt;ProfilingTrigger&amp;gt;().apply {
  add(ProfilingTrigger.Builder(
    ProfilingTrigger.TRIGGER_TYPE_ANOMALY).build())
}
profilingManager.addProfilingTriggers(triggers)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And, we're working to surface more in-field memory metrics to you within Google Play Console.&lt;/p&gt;

&lt;h2&gt;Generational garbage collection&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://developer.android.com/about/versions"&gt;Android 17&lt;/a&gt; introduces more frequent, less resource-intensive young-generation collections to &lt;a href="https://developer.android.com/guide/platform#art"&gt;ART&lt;/a&gt;'s Concurrent Mark-Compact garbage collector (GC). By separating short-lived objects from stable, long-lived ones, the system runs frequent, lightweight "young-generation" sweeps rather than expensive full-heap scans, drastically reducing CPU usage, power drain, and UI stutter. Our testing has shown significant improvements in GC interference with application threads and a reduction in the maximum memory resident set size (RSS). ART improvements are also available to over a billion devices running Android 12 (API level 31) and higher through Google Play System updates.&lt;/p&gt;

&lt;h2&gt;Lock-Free MessageQueue&lt;/h2&gt;
&lt;p&gt;For apps targeting SDK 37 or higher, the core &lt;a href="https://developer.android.com/reference/android/os/MessageQueue"&gt;&lt;b&gt;android.os.MessageQueue&lt;/b&gt;&lt;/a&gt; now implements a lock-free architecture, significantly reducing missed frames, improving app startup time, and radically improving the performance of busy queues in multithreaded scenarios. Note: This can break apps that use reflection on private &lt;a href="https://developer.android.com/reference/android/os/MessageQueue"&gt;&lt;b&gt;MessageQueue&lt;/b&gt;&lt;/a&gt; fields and methods.&amp;nbsp; The &lt;a href="https://developer.android.com/reference/android/os/TestLooperManager#peekWhen()"&gt;&lt;b&gt;peekWhen&lt;/b&gt;&lt;/a&gt; and &lt;b&gt;&lt;a href="https://developer.android.com/reference/android/os/TestLooperManager#poll()"&gt;poll&lt;/a&gt; &lt;/b&gt;APIs have been added to &lt;a href="https://developer.android.com/reference/android/os/TestLooperManager"&gt;&lt;b&gt;TestLooperManager&lt;/b&gt;&lt;/a&gt; for instrumentation testing without relying on &lt;a href="https://developer.android.com/reference/android/os/MessageQueue"&gt;&lt;b&gt;MessageQueue&lt;/b&gt;&lt;/a&gt; internals.&lt;/p&gt;

&lt;h2&gt;Static final fields now truly final&lt;/h2&gt;
&lt;p&gt;Starting from Android 17, apps targeting SDK 37 or higher won’t be able to modify “static final” fields, allowing the runtime to apply performance optimizations more aggressively. An attempt to do so via reflection (or deep reflection) will lead to an IllegalAccessException being thrown. Modifying them via JNI’s &lt;b&gt;&lt;code&gt;SetStatic&amp;lt;Type&amp;gt;Field&lt;/code&gt;&lt;/b&gt; methods family will immediately crash the application.&lt;/p&gt;

&lt;h2&gt;Custom notification view restrictions&lt;/h2&gt;
&lt;p&gt;To reduce memory usage we are further restricting the size of &lt;a href="https://developer.android.com/develop/ui/views/notifications/custom-notification"&gt;custom notification views&lt;/a&gt;. This update closes a loophole that allows apps to bypass existing limits using URIs. This behavior is gated by the target SDK version and takes effect for apps targeting API 37 and higher.&lt;/p&gt;

&lt;h3&gt;Privacy &amp;amp; Security&lt;/h3&gt;
&lt;p&gt;Maintaining user trust is at the heart of the Android ecosystem. Android 17 introduces robust features that protect sensitive data while simplifying user experiences.&lt;/p&gt;

&lt;h2&gt;Privacy-preserving choices&lt;/h2&gt;
&lt;p&gt;Historically, apps required broad, permanent permissions to access information like contacts, precise location and media files. Android 17 continues the shift toward privacy-preserving choices that grant temporary, session-based access only to the data the user explicitly selects:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;System-Level Contact Picker:&lt;/strong&gt; Utilizing &lt;code&gt;ACTION_PICK_CONTACTS&lt;/code&gt;, apps can request temporary access only to specific fields (e.g., email or phone number) chosen by the user, eliminating the need for the broad &lt;code&gt;READ_CONTACTS&lt;/code&gt; permission. It also fully supports work/personal profile separation.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Customizable Photo Picker aspect ratio:&lt;/strong&gt;&amp;nbsp;Using&lt;b&gt;&lt;code&gt;PhotoPickerUiCustomizationParams&lt;/code&gt;&lt;/b&gt;, you can customize the system photo picker to show thumbnails in portrait mode. This is perfect for apps that always display photos and videos in portrait such as video based social media apps.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;System-rendered Location Button:&lt;/strong&gt; A new system-rendered location button that you can embed in your app grants precise location access for the current session only.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;EyeDropper API:&lt;/strong&gt; A new system-level API, &lt;code&gt;ACTION_OPEN_EYE_DROPPER&lt;/code&gt;, allows your app to create a system-powered eyedropper enabling the user to select color from any pixel on the display. This provides a secure, privacy-preserving color-picking experience that eliminates the need for broad, sensitive screen capture or media projection permissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;val eyeDropperLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -&amp;gt;
   if (result.resultCode == Activity.RESULT_OK) {
       val color = result.data?.getIntExtra(Intent.EXTRA_COLOR, Color.BLACK)
       // Use the picked color in your app
   }
}
fun launchColorPicker() {
   val intent = Intent(Intent.ACTION_OPEN_EYE_DROPPER)
   eyeDropperLauncher.launch(intent)
}&lt;/code&gt;&lt;/pre&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8m_oR9WymjE9G26nGUCqdhS9GrBd6FXN3ujWbjq7ECD6OMGhS4xUApWkAWpPpRef7lwLhsRE2jYL9FADoF_FX2eMXD-0hp9JVaCzrDhfU8RYJ9qv-Ds9YIwyQK7yHKidW0oOtX1rpg2pG9x2yNp3UkGJDPqUlHX7hiLb-bvDue67FPZK1O-22SuXbO8I/s1267/Eyedropper%20Tester.webp" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="713" data-original-width="1267" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8m_oR9WymjE9G26nGUCqdhS9GrBd6FXN3ujWbjq7ECD6OMGhS4xUApWkAWpPpRef7lwLhsRE2jYL9FADoF_FX2eMXD-0hp9JVaCzrDhfU8RYJ9qv-Ds9YIwyQK7yHKidW0oOtX1rpg2pG9x2yNp3UkGJDPqUlHX7hiLb-bvDue67FPZK1O-22SuXbO8I/w640-h360/Eyedropper%20Tester.webp" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 style="text-align: center;"&gt;&lt;span id="docs-internal-guid-0ea8e748-7fff-dc26-5289-d5a9513c6997" style="font-weight: normal;"&gt;&lt;span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;i&gt;Picking a color from anywhere on the screen with the system EyeDropper&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h2&gt;Local network access&lt;/h2&gt;
&lt;p&gt;Apps targeting Android 17 now either require the &lt;code&gt;&lt;a href="https://developer.android.com/reference/kotlin/android/Manifest.permission#access_local_network"&gt;ACCESS_LOCAL_NETWORK&lt;/a&gt;&lt;/code&gt; runtime permission or the use of system-mediated, privacy-preserving device pickers for local network communication, such as talking to smart home devices or casting receivers. Because &lt;code&gt;ACCESS_LOCAL_NETWORK&lt;/code&gt;  falls under the existing &lt;code&gt;&lt;a href="https://developer.android.com/reference/android/Manifest.permission_group#NEARBY_DEVICES"&gt;NEARBY_DEVICES&lt;/a&gt;&lt;/code&gt; permission group, users who have already granted other &lt;code&gt;&lt;a href="https://developer.android.com/reference/android/Manifest.permission_group#NEARBY_DEVICES"&gt;NEARBY_DEVICES&lt;/a&gt;&lt;/code&gt; permissions will not be prompted again. &lt;/p&gt;

&lt;h2&gt;SMS OTP protection&lt;/h2&gt;
&lt;p&gt;Android 17 expands SMS one-time-password (OTP) protection by delaying access to SMS messages for three hours:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;WebOTP Format: &lt;a href="https://developer.android.com/about/versions/17/behavior-changes-all#sms-otp-all-apps"&gt;Delayed for all apps that are not the intended recipient (domain mismatch)&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Standard SMS OTP: &lt;a href="https://developer.android.com/about/versions/17/behavior-changes-17#sms-otp-protection"&gt;Delayed for all apps targeting SDK 37+&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Exemptions: Default SMS, assistant, and connected companion apps are exempt. Apps are strongly encouraged to migrate to the &lt;a href="https://developer.android.com/identity/sms-retriever"&gt;SMS Retriever&lt;/a&gt; or &lt;a href="https://developers.google.com/identity/sms-retriever/user-consent/overview"&gt;SMS User Consent APIs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Post-Quantum Cryptography (PQC)&lt;/h2&gt;
&lt;p&gt;Android 17 is ready for the next generation of cryptographic security:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Keystore Integration: Supported devices can generate ML-DSA (Module-Lattice-Based Digital Signature Algorithm) keys in secure hardware to produce quantum-safe signatures, exposed via standard JCA APIs.&lt;/li&gt;
  &lt;li&gt;Hybrid APK Signing: Introducing the v3.2 APK Signature Scheme, which combines classical signatures with ML-DSA signatures to secure app delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Safer native dynamic code loading&amp;nbsp;&lt;/h2&gt;
If your app targets SDK 37 or higher, the Safer Dynamic Code Loading (DCL) protection &lt;a href="https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading"&gt;introduced in Android 14&lt;/a&gt; for DEX and JAR files now extends to native libraries. All native files loaded using System.load must be marked as read-only. Otherwise, the system throws UnsatisfiedLinkError

&lt;h2&gt;Smarter password protection for physical inputs&lt;/h2&gt;
&lt;p&gt;With Android 17, we're making it safer to enter passwords, PINs, and other secrets when using a physical keyboard by no longer showing the last typed character by default.&lt;/p&gt;
&lt;p&gt;Users can still easily customize these display settings to match their preferences (availability may vary by device manufacturer).&lt;/p&gt;
&lt;p&gt;These enhanced privacy protections are automatically supported byAndroid's built-in SDK components and will be supported in Compose 1.12 for SecureTextFields. &lt;/p&gt;

&lt;h3&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFjWXyRLybiLVAIrIm1_60XHXhPmpB1QEph7AuqsGHs-NihIDRFbUgBh32gUKxo30173W-RpEInX9hmYFVnW5V8ZqtM3n_CzxlT0B0PVQr0LSOuOi7x2kZgN_jHRRlYJ7bYInZllvUGNoA_SrXkNi5wwHvUghUcnl0Gsgx_-ts4QEHq_KdbEYgWCg92xA/s798/Hide%20First%20Letter.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="449" data-original-width="798" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFjWXyRLybiLVAIrIm1_60XHXhPmpB1QEph7AuqsGHs-NihIDRFbUgBh32gUKxo30173W-RpEInX9hmYFVnW5V8ZqtM3n_CzxlT0B0PVQr0LSOuOi7x2kZgN_jHRRlYJ7bYInZllvUGNoA_SrXkNi5wwHvUghUcnl0Gsgx_-ts4QEHq_KdbEYgWCg92xA/s16000/Hide%20First%20Letter.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Smarter password protection for physical inputs&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;Media and camera features that empower creators and delight users
&lt;/h2&gt;&lt;p&gt;Android 17 introduces new &lt;a href="https://blog.google/products-and-platforms/platforms/android/android-17-creator-features/"&gt;creator features&lt;/a&gt; that give access to pro-quality cameras and media, all while improving the experience for consumers.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://developer.android.com/media/platform/integrate-eclipsa-video"&gt;Eclipsa Video&lt;/a&gt;: HDR video standard built upon the &lt;a href="https://github.com/SMPTE/st2094-50"&gt;SMPTE ST 2094-50 specification&lt;/a&gt; that introduces new metadata to help devices adapt content for their display headroom and ambient light conditions, as well as improve the simultaneous display of standard and HDR content.&lt;/li&gt;
  &lt;li&gt;RAW14 image format: New support for the &lt;a href="https://developer.android.com/reference/kotlin/android/graphics/ImageFormat#raw14"&gt;RAW14 image format&lt;/a&gt; provides a way for your professional camera app to capture the highest level of detail and color depth from compatible camera sensors.&lt;/li&gt;
  &lt;li&gt;Vendor-defined camera extensions: Vendor-defined extensions enable hardware partners to define and implement custom camera extension modes, providing access to the best and latest camera features.&lt;/li&gt;
  &lt;li&gt;Extended HE-AAC software encoder: A new system-provided Extended HE-AAC software encoder, supports both low and high bitrates using unified speech and audio coding, providing significantly better audio quality for voice messages in low-bandwidth conditions, including support for loudness metadata.&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://developer.android.com/guide/topics/media/media-formats#video-formats"&gt;Versatile Video Coding (H.266)&lt;/a&gt;:  Enables OEMs to add codec support by defining the &lt;a href="https://developer.android.com/guide/topics/media/media-formats#video-formats"&gt;video/vvc&lt;/a&gt; MIME type in &lt;a href="https://developer.android.com/reference/android/media/MediaFormat"&gt;&lt;code&gt;MediaFormat&lt;/code&gt;&lt;/a&gt;, adding new VVC profiles in &lt;a href="https://developer.android.com/reference/android/media/MediaCodecInfo"&gt;&lt;code&gt;MediaCodecInfo&lt;/code&gt;&lt;/a&gt;, and integrating support into &lt;a href="https://developer.android.com/reference/android/media/MediaExtractor"&gt;&lt;code&gt;MediaExtractor&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Camera device type: New APIs that query the underlying device type to identify if a camera is built-in hardware, an external USB webcam, or a virtual camera.&lt;/li&gt;
  &lt;li&gt;Constant Quality for Video Recording: &lt;a href="https://developer.android.com/reference/android/media/MediaRecorder#setVideoEncodingQuality(int)"&gt;&lt;code&gt;SetVideoEncodingQuality&lt;/code&gt;&lt;/a&gt; in &lt;a href="https://developer.android.com/reference/android/media/MediaRecorder"&gt;&lt;code&gt;MediaRecorder&lt;/code&gt;&lt;/a&gt; configures a constant quality (CQ) mode for video encoders to ensure uniform visual fidelity across the entire video.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Better support for hearing aids&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Bluetooth LE Audio hearing aid support: Android now includes a specific device category for Bluetooth Low Energy (BLE) Audio hearing aids with the new &lt;a href="https://developer.android.com/reference/android/media/AudioDeviceInfo#TYPE_BLE_HEARING_AID"&gt;&lt;code&gt;AudioDeviceInfo.TYPE_BLE_HEARING_AID&lt;/code&gt;&lt;/a&gt; constant, so your app can distinguish hearing aids from regular headsets to provide a tailored experience for users with assistive listening devices.&lt;/li&gt;
  &lt;li&gt;Granular audio routing for hearing aids: Android 17 allows users to independently manage where specific system sounds are played. They can choose to route notifications, ringtones, and alarms to connected hearing aids or the device's built-in speaker, helping to avoid unwanted in-ear interruptions while maintaining a Bluetooth connection for hearing aid management apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;CameraX and  Media3&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://developer.android.com/jetpack/androidx/releases/camerax"&gt;CameraX&lt;/a&gt; and &lt;a href="https://developer.android.com/jetpack/androidx/releases/media3"&gt;Media3&lt;/a&gt; have been updated for Android 17. They are there to do the heavy lifting, smoothing the rough edges of media development and simplifying building reliable camera capture,  smooth media playback, and creative and complex editing experiences. &lt;/p&gt;

&lt;p&gt;We've released an &lt;a href="https://github.com/android/skills/tree/main/camera"&gt;agent skill&lt;/a&gt; that can migrate legacy Android camera implementations (Camera1 or raw Camera2 APIs) to CameraX.&lt;/p&gt;
  
&lt;p&gt;Note: You'll need to update your CameraX version to either 1.5.2 or 1.6.0+ to avoid a crash related to an added dynamic range mode on Android 17 devices.&lt;/p&gt;

&lt;h3&gt;Get your apps, libraries, tools, and game engines ready!&lt;/h3&gt;
&lt;p&gt;If you develop an Android SDK, library, tool, or game engine, it's critical to prepare any necessary updates now to prevent your downstream app and game developers from being blocked by compatibility issues and allow them to target the latest SDK features. Please let your downstream developers know if updates are needed to fully support Android 17.&lt;/p&gt;

&lt;p&gt;Testing involves installing your production app or a test app making use of your library or engine using Google Play or other means onto a device or emulator running Android 17 Beta 4. Work through all your app's flows and look for functional or UI issues. Each release of Android contains platform changes that improve privacy, security, and overall user experience; review the app impacting behavior changes for apps &lt;a href="https://developer.android.com/about/versions/17/behavior-changes-all"&gt;running on&lt;/a&gt; and &lt;a href="https://developer.android.com/about/versions/17/behavior-changes-17"&gt;targeting&lt;/a&gt; Android 17 to focus your testing, including the following:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Resizability on large screens: Once you target Android 17 (SDK 37), you can no longer opt out of maintaining orientation, resizability and aspect ratio constraints &lt;a href="https://developer.android.com/about/versions/17/changes/ff-restrictions-ignored"&gt;on large screens&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Dynamic code loading: If your app targets SDK 37 or higher, the Safer Dynamic Code Loading (DCL) protection &lt;a href="https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading"&gt;introduced in Android 14 &lt;/a&gt;for DEX and JAR files now extends to native libraries. All native files loaded using System.load() must be marked as read-only. Otherwise, the system throws UnsatisfiedLinkError.&lt;/li&gt;
  &lt;li&gt;Enable CT by default: &lt;a href="https://developer.android.com/privacy-and-security/security-config#CertificateTransparencySummary"&gt;Certificate transparency (CT)&lt;/a&gt; is enabled by default. (On Android 16, CT is available but apps had to &lt;a href="https://developer.android.com/privacy-and-security/security-config#certificateTransparency"&gt;opt in&lt;/a&gt;.)&lt;/li&gt;
  &lt;li&gt;Local network protections: Apps targeting SDK 37 or higher have &lt;a href="https://developer.android.com/privacy-and-security/local-network-permission#android-17-enforcement"&gt;local network access blocked by default&lt;/a&gt;. Switch to using privacy preserving pickers if possible, and use the new &lt;a href="https://developer.android.com/reference/kotlin/android/Manifest.permission#access_local_network"&gt;&lt;b&gt;&lt;code&gt;ACCESS_LOCAL_NETWORK&lt;/code&gt;&lt;/b&gt;permission for broad, persistent access.&lt;/li&gt;
  &lt;li&gt;Background audio hardening: Starting in Android 17, the audio framework enforces &lt;a href="https://developer.android.com/about/versions/17/changes/bg-audio"&gt;restrictions on background audio interactions&lt;/a&gt; including audio playback, &lt;a href="https://developer.android.com/media/optimize/audio-focus"&gt;audio focus&lt;/a&gt; requests, and &lt;a href="https://developer.android.com/reference/android/media/AudioManager#adjustStreamVolume(int,%20int,%20int)"&gt;volume change&lt;/a&gt; APIs. Based on your feedback, we’ve made some changes since beta 2, including targetSDK gating while-in-use FGS enforcement and exempting alarm audio. Full details available in the &lt;a href="https://developer.android.com/about/versions/17/changes/bg-audio"&gt;updated guidance&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;NPU access declaration: Apps targeting Android 17 that need to directly access the NPU must declare&amp;nbsp;&lt;a href="https://developer.android.com/reference/kotlin/android/content/pm/PackageManager#feature_neural_processing_unit"&gt;FEATURE_NEURAL_PROCESSING_UNIT&lt;/a&gt; in their manifest to avoid being blocked from accessing the NPU. This includes apps that use the &lt;a href="https://ai.google.dev/edge/litert/next/npu"&gt;LiteRT NPU delegate&lt;/a&gt;, vendor-specific SDKs, as well as the deprecated &lt;a href="https://developer.android.com/ndk/guides/neuralnetworks"&gt;NNAPI&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Get started with Android 17&lt;/h3&gt;
&lt;p&gt;Your Pixel device should get Android 17 shortly if you haven't already been on the Android Beta. If you don’t have a Pixel device, you can &lt;a href="https://developer.android.com/about/versions/17/get#on_emulator"&gt;use the 64-bit system images with the Android Emulator&lt;/a&gt; in Android Studio. If you are currently on Android 17 Beta 4.1 and have not yet taken an Android 17 QPR1 beta, you can opt out of the program and you will then be offered the release version of Android 17 over the air.&lt;/p&gt;
&lt;h3&gt;Getting the Android 17 beta on partner devices&lt;/h3&gt;
&lt;p&gt;Android 17 is available in beta on handset, tablet, and foldable form factors &lt;a href="https://developer.android.com/about/versions/17/devices"&gt;from partners&lt;/a&gt; including Honor, iQOO, Lenovo, OnePlus, OPPO, Realme, Sharp, vivo, and Xiaomi.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy5cwRcpdR2j-1KMzQPpsxvIODRLlVkaFNQEIQoNaPQa4X4rgEna5imminlwFdcSJ3xihXdUSFouOC0-ZKyK1A53cBmoaU03au-FjfsqkPXm0tPLtOaWT_7z8tqnMmQjFOr-YIKeP3BMVq8Hmd7yH0zllW1aFMuiW6AAAcDUVL7aIyCAIZUs0d_0VMdF4/s1653/android-17-beta-partners.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="624" data-original-width="1653" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy5cwRcpdR2j-1KMzQPpsxvIODRLlVkaFNQEIQoNaPQa4X4rgEna5imminlwFdcSJ3xihXdUSFouOC0-ZKyK1A53cBmoaU03au-FjfsqkPXm0tPLtOaWT_7z8tqnMmQjFOr-YIKeP3BMVq8Hmd7yH0zllW1aFMuiW6AAAcDUVL7aIyCAIZUs0d_0VMdF4/s16000/android-17-beta-partners.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;

&lt;p&gt;For the best development experience with Android 17, we recommend that you use the latest Canary build of &lt;a href="https://developer.android.com/studio/preview"&gt;Android Studio Quail&lt;/a&gt;. Once you’re set up, here are some of the things you should do:&lt;/p&gt;
&lt;p&gt;Test your current app for compatibility, learn whether your app is &lt;a href="https://developer.android.com/about/versions/17/behavior-changes-all"&gt;affected by changes in Android 17&lt;/a&gt;, and install your app onto a device or &lt;a href="https://developer.android.com/studio/run/emulator"&gt;Android Emulator&lt;/a&gt; running Android 17 and extensively test it.&lt;/p&gt;

&lt;p&gt;Thank you again to everyone who participated in our Android developer preview and beta program. We're looking forward to seeing how your apps take advantage of the updates in Android 17, and have plans to bring you updates in a fast-paced release cadence going forward.&lt;/p&gt;
&lt;p&gt;For complete information on Android 17 please visit the &lt;a href="https://developer.android.com/about/versions/17"&gt;Android 17 developer site&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;</content><link href="http://android-developers.googleblog.com/feeds/8580547527446050357/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/Android-17.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8580547527446050357" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8580547527446050357" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/Android-17.html" rel="alternate" title="Android 17 is here" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV7zuuXjulHty999mGDWY1kfL8Q9SXjYYWn-7JTpMfVdNP78eb5fW9shOpvVdEqK0WnNp7AhdO0qc7pXAaqcfTwXgOGsfZyqcQv8wyD-9niWBpZuP6ZAPHBSetWenN2lMlRS5wi2d71-n8RCYqrLsFhUCEvM7KeoGLnNaDbiyOZQ0vvyr0O580nXK4Vas/s72-c/Metadata%20-%20Static.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-3515307535587922001</id><published>2026-06-15T06:00:00.000-07:00</published><updated>2026-06-22T12:52:22.553-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android XR"/><category scheme="http://www.blogger.com/atom/ns#" term="Developer Preview 4"/><title type="text">What’s New in Android XR: Tooling, Engine Support, and Ecosystem Updates</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqvV2dCRWK9vrpSo1I7Ac_cwY4toddOPpsMksbhxXAj-Hq9t21P8UKshJzt7YHwnNoqJBqZznxKxTx2082zSoK24KRwOh-_7cWvog23nPER5IEZuGwPuMwfG4XSg2cXQT7yC1jeo3yBhpcHQJ_QEg6P3Li_uQ2zgI1I0BERqkoYg2p5_n6H6_H5-VSDDM/s2049/MM_AndroidXR_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqvV2dCRWK9vrpSo1I7Ac_cwY4toddOPpsMksbhxXAj-Hq9t21P8UKshJzt7YHwnNoqJBqZznxKxTx2082zSoK24KRwOh-_7cWvog23nPER5IEZuGwPuMwfG4XSg2cXQT7yC1jeo3yBhpcHQJ_QEg6P3Li_uQ2zgI1I0BERqkoYg2p5_n6H6_H5-VSDDM/s2049/MM_AndroidXR_Meta.png" style="display: none;" /&gt;&lt;div&gt;&lt;i&gt;Posted by Stevan Silva, Group Product Manager, and Vinny DaSilva, Developer Relations Engineer, Android XR&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp8kd1bgx3ffvUcC2yZv7vN9fA0YNF8jZ-dWQlzOMsBbtAIVgAAUiEKx9Mplb2UbbKy6RW2UrJmhtY_TO9skOOw6V5_NEe-3-aOHSDSyDiLQLdOyFkluWF9VcZzXWfnLk9JY3YrMZ4QR21KGzUsbNOxFk2YSh8BUzdQi4QA38s36xxWwuj7_V4UxaZzWo/s4210/MM_AndroidXR_Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1254" data-original-width="4210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp8kd1bgx3ffvUcC2yZv7vN9fA0YNF8jZ-dWQlzOMsBbtAIVgAAUiEKx9Mplb2UbbKy6RW2UrJmhtY_TO9skOOw6V5_NEe-3-aOHSDSyDiLQLdOyFkluWF9VcZzXWfnLk9JY3YrMZ4QR21KGzUsbNOxFk2YSh8BUzdQi4QA38s36xxWwuj7_V4UxaZzWo/s16000/MM_AndroidXR_Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;From augmented overlays to fully immersive environments, the Android XR ecosystem is expanding rapidly, with the Samsung Galaxy XR already available today. Alongside the latest updates from &lt;a href="https://developer.android.com/blog/posts/updates-to-the-android-xr-sdk-introducing-developer-preview-4"&gt;Google I/O&lt;/a&gt; and this week's Augmented World Expo (AWE), we are rolling out new tooling, broader engine support, and ecosystem resources to help you build and scale experiences for Android XR.&lt;/p&gt;

&lt;p&gt;To get a quick look at what’s new, check out our video recap!&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/otzSN5pSNZk" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="otzSN5pSNZk"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Ready to dive deeper? Let’s jump into the major updates that will streamline your XR development workflow.&lt;/p&gt;

&lt;h2&gt;Build, Prototype, and Iterate with Developer Preview 4&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.android.com/blog/posts/updates-to-the-android-xr-sdk-introducing-developer-preview-4"&gt;Developer Preview 4 of the Android XR SDK&lt;/a&gt; delivers the APIs and tools you need to design and build right from your laptop. This update includes the specific libraries required to target both immersive and augmented experiences. Check out the video below for a comprehensive breakdown of the latest in Android XR:&lt;/p&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/1KOO2lqsdaA" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="1KOO2lqsdaA"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;To test all of these interactions without needing physical hardware, you can emulate  and iterate on your code entirely within &lt;a href="https://developer.android.com/studio/preview"&gt;Android Studio&lt;/a&gt;. Check out our tooling deep dive to see how you can use XR emulator today:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/saRE0t11KJY" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="saRE0t11KJY"&gt;&lt;/iframe&gt;

&lt;h2 style="text-align: left;"&gt;Extending your mobile apps for intelligent eyewear&lt;/h2&gt;

&lt;p style="text-align: left;"&gt;Building for audio and display glasses doesn't mean starting from scratch. With the &lt;a href="https://developer.android.com/develop/xr/jetpack-xr-sdk#jetpack-projected"&gt;Jetpack Projected library&lt;/a&gt;, you can take your existing mobile app to create a complementary augmented experience. The new release includes a &lt;a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/glasses/check-availability"&gt;Device Availability API&lt;/a&gt; that hooks into standard Android Lifecycle states, allowing your app to natively adapt its behavior based on whether the glasses are being worn.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;To accelerate your development journey, use &lt;a href="https://developer.android.com/tools/agents"&gt;Android CLI&lt;/a&gt; and the &lt;a href="https://github.com/android/skills"&gt;display glasses skill&lt;/a&gt; to extend your mobile app into an augmented experience. The skill is packed with specialized knowledge of Jetpack Compose Glimmer, enabling it to build your UI using our recommended design patterns.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;We’ve also updated &lt;a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer"&gt;Jetpack Compose Glimmer&lt;/a&gt; to optimize text legibility on optical see-through displays and provide touchpad-optimized navigation components.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;See how it looks in action: Developers at &lt;a href="https://play.google.com/store/apps/details?id=com.naver.labs.translator"&gt;NAVER Papago&lt;/a&gt; are already exploring how to seamlessly bring their mobile experience directly to display glasses.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/bYvAvQs3f8o" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="bYvAvQs3f8o"&gt;&lt;/iframe&gt;


&lt;p style="text-align: left;"&gt;To learn how to leverage these tools, watch this session on extending mobile apps for AI glasses:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/83CF7AhozJ8" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="83CF7AhozJ8"&gt;&lt;/iframe&gt;&lt;/div&gt;

&lt;h3 style="text-align: left;"&gt;Building global, location-based immersive experiences&lt;/h3&gt;

&lt;p style="text-align: left;"&gt;For developers focused on immersive experiences, Developer Preview 4 brings modern, Kotlin-first architectural upgrades across our core perception libraries. We have also introduced an early preview of the Geospatial API for wired XR glasses. By combining &lt;a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/arcore"&gt;ARCore for Jetpack XR&lt;/a&gt; with Google's Visual Positioning System (VPS), you can anchor digital content to high-precision real-world locations.&lt;/p&gt;

&lt;h3 style="text-align: left;"&gt;Leverage the Platforms You Know with Expanded Engine Support&lt;/h3&gt;

&lt;p style="text-align: left;"&gt;We want you to build using the ecosystems and workflows you already know best. To make it easier to bring your existing XR experiences over to Android XR, we are thrilled to introduce &lt;a href="https://developer.android.com/blog/posts/android-xr-updates-for-unity-unreal-and-godot"&gt;official support for Unreal Engine and Godot&lt;/a&gt; alongside our existing &lt;a href="https://unity.com/blog/unity-android-xr-wired-glasses-support"&gt;Unity's support for wired XR glasses&lt;/a&gt;.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;With this expansion, we are introducing the &lt;a href="https://developer.android.com/develop/xr/engine-hub"&gt;Android XR Engine Hub&lt;/a&gt;, a desktop tool for Windows that shortens iteration cycles by bringing real-time testing directly into your engines viewport. Catch the full breakdown of our engine updates here:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/nmbBWSX8l54" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="nmbBWSX8l54"&gt;&lt;/iframe&gt;

&lt;h3 style="text-align: left;"&gt;Apply Today for the Android XR Developer Catalyst Program&lt;/h3&gt;

&lt;p style="text-align: left;"&gt;In addition to providing the platform, we want to fuel your innovation directly through ecosystem resources. The &lt;a href="https://developer.android.com/develop/xr/engine-hub"&gt;Android XR Developer Catalyst Program&lt;/a&gt; is designed to support developers with access to pre-release hardware, including display glasses, and wired XR glasses.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Accepted developers will receive resources, support forums, and launch guidance to prepare their apps for Google Play. Applications are open right now, so don't wait to &lt;a href="https://developer.android.com/develop/xr/catalyst"&gt;submit your project ideas&lt;/a&gt;.&lt;/p&gt;

&lt;h3 style="text-align: left;"&gt;Start Building!&lt;/h3&gt;

&lt;p style="text-align: left;"&gt;The ecosystem is growing rapidly, and the tools are ready for you to explore. Samsung Galaxy XR is available now, and you can dive in today with &lt;a href="https://developer.android.com/blog/posts/updates-to-the-android-xr-sdk-introducing-developer-preview-4"&gt;Developer Preview 4 of the Android XR SDK&lt;/a&gt;. If you don’t have hardware yet, check out the tools and to get started with the &lt;a href="http://google.com/url?sa=j&amp;amp;url=http%3A%2F%2Fgoo.gle%2Fxr-setup&amp;amp;uct=1765473974&amp;amp;usg=L4MkW244XAfYytuJciS39GjuDv0.&amp;amp;opi=73833047&amp;amp;source=chat"&gt;XR Emulator in Android Studio&lt;/a&gt;.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;For a complete look at all of our technical sessions, browse the full &lt;a href="https://youtube.com/playlist?list=PLWz5rJ2EKKc-feGl0F3rXtUste_8TkvZJ&amp;amp;si=zggz4T3eiQmH5xL2"&gt;Android XR Playlist on YouTube&lt;/a&gt; to see what else is possible. We can’t wait to see what you build!&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/3515307535587922001/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/what-is-new-android-xr.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/3515307535587922001" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/3515307535587922001" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/what-is-new-android-xr.html" rel="alternate" title="What’s New in Android XR: Tooling, Engine Support, and Ecosystem Updates" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqvV2dCRWK9vrpSo1I7Ac_cwY4toddOPpsMksbhxXAj-Hq9t21P8UKshJzt7YHwnNoqJBqZznxKxTx2082zSoK24KRwOh-_7cWvog23nPER5IEZuGwPuMwfG4XSg2cXQT7yC1jeo3yBhpcHQJ_QEg6P3Li_uQ2zgI1I0BERqkoYg2p5_n6H6_H5-VSDDM/s72-c/MM_AndroidXR_Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-2391142730873344786</id><published>2026-06-09T06:00:00.000-07:00</published><updated>2026-06-09T17:19:04.176-07:00</updated><title type="text">Top 3 updates for Android developer productivity</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVRZrq_G4uVlVKLwXHoXqLsp3SGb-2GJbHfNRNmjfSPuZ9gUrLJ8_fyNTDP-_jsJowwajpxaLPFd8047rF7B5IpSE8-gXFtwVx3x4WpEqWLX3Cm-bKo9tof1j5yTLT66FmzpEnod7EK8_3vUDNZv12uDz1lnfZ5O8iOQqxfWgH0oOYXd3CXvG4IUJuRfU/s4097/MM_Dev%20Productivity_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVRZrq_G4uVlVKLwXHoXqLsp3SGb-2GJbHfNRNmjfSPuZ9gUrLJ8_fyNTDP-_jsJowwajpxaLPFd8047rF7B5IpSE8-gXFtwVx3x4WpEqWLX3Cm-bKo9tof1j5yTLT66FmzpEnod7EK8_3vUDNZv12uDz1lnfZ5O8iOQqxfWgH0oOYXd3CXvG4IUJuRfU/s4097/MM_Dev%20Productivity_Meta.png" style="display: none;" /&gt;&lt;div&gt;&lt;i&gt;Posted by Simona Milanovic, Developer Relations Engineer&lt;/i&gt;&lt;/div&gt;&lt;p class="post-author"&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjux_TC0rxXOwY28_pZlUZ5rOLTSjuCXAfcGOd_auXXQ1D91clcsNSmIYs939dNNL7ymPVs1Q2PTFa_FwzBnlbcnNavO6MlwlCv9U2XPUDU-5I_HeVfeS72JoCHrkmGO3bXjXpJtJK8H7glEX6hfKn78-GynO8w9RqT-N-EE37oyA2rFxy6JukihWgndFE/s8419/MM_Dev%20Productivity_Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2507" data-original-width="8419" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjux_TC0rxXOwY28_pZlUZ5rOLTSjuCXAfcGOd_auXXQ1D91clcsNSmIYs939dNNL7ymPVs1Q2PTFa_FwzBnlbcnNavO6MlwlCv9U2XPUDU-5I_HeVfeS72JoCHrkmGO3bXjXpJtJK8H7glEX6hfKn78-GynO8w9RqT-N-EE37oyA2rFxy6JukihWgndFE/s16000/MM_Dev%20Productivity_Blog.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Every year, Google I/O brings new announcements and resources across ecosystems and products, including Android development. As development shifts toward AI and agent-assisted tooling, we’ve expanded our offerings to better support you, however you decide to build for Android.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;div style="height: 0px; overflow: hidden; padding-bottom: 56.25%; position: relative; width: 97.2%;"&gt;
    &lt;iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/7fQhKxQGy5A" style="border: 0; height: 100%; left: 0; position: absolute; top: 0; width: 100%;" width="320" youtube-src-id="7fQhKxQGy5A"&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p style="text-align: left;"&gt;To help you stay up to date, here is a summary of the&lt;b&gt; top 3 announcements for Android Developer Productivity at I/O&lt;/b&gt;.&lt;/p&gt;

&lt;h2 style="text-align: left;"&gt;1. Android CLI is now stable&lt;/h2&gt;&lt;p style="text-align: left;"&gt;&lt;a href="https://developer.android.com/tools/agents/android-cli" style="color: #1155cc; text-decoration: underline;"&gt;Android CLI&lt;/a&gt; is now &lt;strong&gt;stable at version 1.0&lt;/strong&gt;, with more capabilities and integrations.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;The latest version of Android CLI introduces many new features, like programmatic version lookup and support for Journeys, and bridging capability to allow agents to &lt;strong&gt;integrate directly with Android Studio&lt;/strong&gt;, via the &lt;a href="https://developer.android.com/tools/agents/android-cli#studio-check" style="color: #1155cc; font-family: monospace; text-decoration: underline;"&gt;studio command&lt;/a&gt;.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Running Android Studio alongside the agent and Android CLI enables more efficient navigation in your project, more precise output, and access to &lt;strong&gt;Android Studio’s unique tooling&lt;/strong&gt;, such as performance profilers, Compose Previews, and Android Device Streaming.&lt;/p&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsMNSFKeo81-n949Gxy89kxE4j9xTtoJXnyEYGULxkjQXjndkMpdDzO74Xr2rvtuJuEooGeZeMJPf_H1UJC4YljU-jrBswJOMgsQBPm-_CO2Z2EYntVE3osq8maf2chHJHB8WvRVvvf_14TxkpARGAOGAUsqYQ-vWZtm2iUhanT-Zz3GDD2HQrQk1Jpcg/s1948/1_agy-android-studio.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1552" data-original-width="1948" height="510" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsMNSFKeo81-n949Gxy89kxE4j9xTtoJXnyEYGULxkjQXjndkMpdDzO74Xr2rvtuJuEooGeZeMJPf_H1UJC4YljU-jrBswJOMgsQBPm-_CO2Z2EYntVE3osq8maf2chHJHB8WvRVvvf_14TxkpARGAOGAUsqYQ-vWZtm2iUhanT-Zz3GDD2HQrQk1Jpcg/w640-h510/1_agy-android-studio.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Android CLI now integrates seamlessly with Android Studio&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p style="text-align: left;"&gt;Additionally, Google Antigravity now officially supports Android development, with the &lt;strong&gt;Android resources bundle&lt;/strong&gt;, which includes the Android CLI and skills.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;You can either install the bundle during onboarding after installation, or later from the &lt;strong&gt;Settings &amp;gt; Customizations &amp;gt; Build With Google Plugins&lt;/strong&gt; menu. This provides Antigravity with all the powerful tools and knowledge of Android CLI to enable it to perform core tasks—from creating projects to deploying your app on a new virtual device—much more easily and efficiently.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg5lVac9WbZ_qdkjNLaQto2LX4c0tFD9zF3QIjtGcFXePDigzX7G8xAAQdo8YX6yt7U38-meDeTRQ1TCK-a7YUvjDk6D88ZfTNOQLI-6Xza52AugLbgEyg24kIzUR67lC9k3iX8H_gxk7JUYpHxSiHAJgQkFqN0CiXD8i5k4CE8Px308kNtVbKCYegJtI/s1948/1_agy-android-cli.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1552" data-original-width="1948" height="510" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhg5lVac9WbZ_qdkjNLaQto2LX4c0tFD9zF3QIjtGcFXePDigzX7G8xAAQdo8YX6yt7U38-meDeTRQ1TCK-a7YUvjDk6D88ZfTNOQLI-6Xza52AugLbgEyg24kIzUR67lC9k3iX8H_gxk7JUYpHxSiHAJgQkFqN0CiXD8i5k4CE8Px308kNtVbKCYegJtI/w640-h510/1_agy-android-cli.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Google Antigravity now offers the Android resources bundle&lt;/i&gt;&lt;/div&gt;

&lt;/div&gt;&lt;p style="text-align: left;"&gt;&lt;span style="text-align: center;"&gt;Android CLI is now available through more package managers: like &lt;/span&gt;&lt;code style="text-align: center;"&gt;npm&lt;/code&gt;&lt;span style="text-align: center;"&gt; and &lt;/span&gt;&lt;code style="text-align: center;"&gt;homebrew&lt;/code&gt;&lt;span style="text-align: center;"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="text-align: center;"&gt;For more information, check out the &lt;/span&gt;&lt;a href="https://android-developers.googleblog.com/2026/05/android-cli-stable-1-0-agent-development.html" style="color: #1155cc; text-align: center;"&gt;Android CLI blog post&lt;/a&gt;&lt;span style="text-align: center;"&gt; and &lt;/span&gt;&lt;a href="https://developer.android.com/tools/agents/android-cli" style="color: #1155cc; text-align: center;"&gt;official documentation.&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;h2 style="text-align: left;"&gt;2. Android skills keep growing&lt;/h2&gt;&lt;p style="text-align: left;"&gt;To help models gain expertise for specific development patterns that follow our best practices, we are continuing to &lt;strong&gt;expand our repository of Android skills&lt;/strong&gt;, available through &lt;a href="https://developer.android.com/tools/agents/android-cli#skills-add" style="color: #1155cc; text-decoration: underline;"&gt;Android CLI&lt;/a&gt; and &lt;a href="https://github.com/android/skills" style="color: #1155cc; text-decoration: underline;"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Android skills ground LLMs in &lt;strong&gt;specialized workflows and domain knowledge,&lt;/strong&gt; for the most common and more complex user journeys they might struggle with. We’ve shipped a fresh &lt;strong&gt;new batch of skills,&lt;/strong&gt; with now more than 17 skills for areas such as:&lt;/p&gt;&lt;ul style="line-height: 1.6; padding-left: 24px;"&gt;&lt;li style="text-align: left;"&gt;Adaptive UI&lt;/li&gt;&lt;li style="text-align: left;"&gt;Display Glasses and Jetpack Compose Glimmer for XR&lt;/li&gt;&lt;li style="text-align: left;"&gt;Migration to CameraX&lt;/li&gt;&lt;li style="text-align: left;"&gt;Perfetto SQL and Trace Analysis&lt;/li&gt;&lt;li style="text-align: left;"&gt;Jetpack Compose Styles API&lt;/li&gt;&lt;li style="text-align: left;"&gt;AppFunctions&lt;/li&gt;&lt;li style="text-align: left;"&gt;Verified email retrieval with Android Credential Manager&lt;/li&gt;&lt;li style="text-align: left;"&gt;Engage SDK integration&lt;/li&gt;&lt;li style="text-align: left;"&gt;Testing setup&lt;/li&gt;&lt;li style="text-align: left;"&gt;Wear OS Jetpack Compose Material3&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" data-original-height="405" data-original-width="720" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOV9PePtO9nHxegfJn96Lsab3Z1fD7FEsjdQ9EQ2vzNOc9es2_S6h8twazy_ief9YVabhkOUWu7xJHr-hxINrva44O7QDpt3z96UtGXbvJYtAARj4tVWK3SPuFVr2in-MSdyCdpY5aOdqRbBjtw06-n365vZv8_Or8YCDrj6FQyoVl6xxKibEJF4Nh3io/s16000/2_android_skills_dev_keynote.gif" /&gt;&lt;i&gt;Android skills keep growing&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left;"&gt;You can browse skills and install using the Android CLI commands:&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;pre style="background-color: #f1f3f4; border-radius: 4px; color: #188038; font-family: monospace; line-height: 1.5; padding: 10px;"&gt;&lt;div style="text-align: left;"&gt;android skills list&lt;/div&gt;&lt;div style="text-align: left;"&gt;android skills add –skill=&amp;lt;skill-name&amp;gt;&lt;/div&gt;&lt;/pre&gt;

&lt;p style="text-align: left;"&gt;For more information, check out the &lt;a href="https://developer.android.com/tools/agents/android-skills" style="color: #1155cc; text-decoration: underline;"&gt;official documentation.&lt;/a&gt;&lt;/p&gt;

&lt;h2 style="text-align: left;"&gt;3. Android Bench adds new models&lt;/h2&gt;&lt;p style="text-align: left;"&gt;Earlier this year, we launched &lt;a href="https://developer.android.com/bench" style="color: #1155cc; text-decoration: underline;"&gt;Android Bench&lt;/a&gt; - our leaderboard for &lt;strong&gt;testing LLMs on real-world Android development&lt;/strong&gt; challenges and tasks, with the goal of accelerating model improvements, so you have more helpful options for AI assistance.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb0KK5bxvuZazJH0qRgHNv7cHl9uhVwZIZprnwGTBufcU7KXLpFJzNO4tCaCJLjh4mrZIqmTuFSMyRadcJxyTsWty65oLaKwi_8L_jAWHERsWYJ6hbZf5qVoDHJCZb-i0U40B3Xz8nRg-nvFYD8cf-nFx7PPG7ffBL-w4bS9RTQx_GOdQ7RXWjUN5RTbI/s2618/AndroidBenchLeaderboard.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1488" data-original-width="2618" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb0KK5bxvuZazJH0qRgHNv7cHl9uhVwZIZprnwGTBufcU7KXLpFJzNO4tCaCJLjh4mrZIqmTuFSMyRadcJxyTsWty65oLaKwi_8L_jAWHERsWYJ6hbZf5qVoDHJCZb-i0U40B3Xz8nRg-nvFYD8cf-nFx7PPG7ffBL-w4bS9RTQx_GOdQ7RXWjUN5RTbI/s16000/AndroidBenchLeaderboard.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Latest results from Android Bench leaderboard&lt;/i&gt;&lt;/div&gt;

&lt;p style="text-align: left;"&gt;You asked us to evaluate open models. So, at I/O, we added more commonly used ones, including our local model &lt;strong&gt;Gemma 4&lt;/strong&gt;, to the leaderboard. We also added the latest models including &lt;strong&gt;Gemini 3.5 Flash.&lt;/strong&gt;&lt;/p&gt;

&lt;p style="text-align: left;"&gt;We are also working on increasing the difficulty of challenges we’re giving LLMs, including creating long running tasks, to continue encouraging improvements. These tasks will be coming soon to Android Bench. Check out the &lt;a href="https://developer.android.com/bench" style="color: #1155cc;"&gt;Android Bench leaderboard&lt;/a&gt; to see the latest results.&lt;/p&gt;

&lt;h2 style="text-align: left;"&gt;Android development anywhere&lt;/h2&gt;&lt;p style="text-align: left;"&gt;By expanding our AI-assisted Android development offerings to Antigravity, through Android CLI and Android skills, and solidifying with the pro capabilities and production grade polish of Android Studio, we’re &lt;strong&gt;supporting Android developers wherever they choose to build.&lt;/strong&gt;&lt;/p&gt;

&lt;p style="text-align: left;"&gt;Have fun bringing your ideas to life faster and easier than ever before - we’re excited to see what you build in this new era of agentic development.&lt;/p&gt;&lt;p style="text-align: left;"&gt;Check out the full &lt;a href="https://www.youtube.com/playlist?list=PLWz5rJ2EKKc-XnEzj1_CBClxpkGwYQeLy"&gt;Developer productivity at Google I/O 2026 YouTube playlist&lt;/a&gt; for more information.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/2391142730873344786/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/android-developer-productivity-updates.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2391142730873344786" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/2391142730873344786" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/android-developer-productivity-updates.html" rel="alternate" title="Top 3 updates for Android developer productivity" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVRZrq_G4uVlVKLwXHoXqLsp3SGb-2GJbHfNRNmjfSPuZ9gUrLJ8_fyNTDP-_jsJowwajpxaLPFd8047rF7B5IpSE8-gXFtwVx3x4WpEqWLX3Cm-bKo9tof1j5yTLT66FmzpEnod7EK8_3vUDNZv12uDz1lnfZ5O8iOQqxfWgH0oOYXd3CXvG4IUJuRfU/s72-c/MM_Dev%20Productivity_Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-8402705196179189955</id><published>2026-06-08T06:00:00.000-07:00</published><updated>2026-06-08T09:51:11.835-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><category scheme="http://www.blogger.com/atom/ns#" term="ProfilingManager"/><title type="text">Datadog delivers millions of in-depth performance insights with ProfilingManager</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/a/AVvXsEh92CmF7Hos-AKsEmr3k9Va10fhbed32pj4r9wxbUAlpyAIh2GV0KhvsRYzkmATQgflpHYdfAgdFkRfq1ki2G7ty5wKfzoaoyYknCOEjb6Auz7r0Zcfk0tR6VCX-3o3L9fpcs419uI5iNdBiOtno7ughGWD0SGJ5n3sfWPEB7ZJ9M_HQFDLhBQ_hv3HFQ8" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/a/AVvXsEh92CmF7Hos-AKsEmr3k9Va10fhbed32pj4r9wxbUAlpyAIh2GV0KhvsRYzkmATQgflpHYdfAgdFkRfq1ki2G7ty5wKfzoaoyYknCOEjb6Auz7r0Zcfk0tR6VCX-3o3L9fpcs419uI5iNdBiOtno7ughGWD0SGJ5n3sfWPEB7ZJ9M_HQFDLhBQ_hv3HFQ8" style="display: none;" /&gt;
&lt;p style="margin-bottom: 20px;"&gt;Posted by Alice Yuan, Developer Relations Engineer at Google, Arti Arutiunov, Product Manager at Datadog and Nikita Ogorodnikov, Staff Software Engineer at Datadog&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="margin-bottom: 20px;"&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjICmOZHTF4gmgXj1G4r5Fp48jM_W4fN9tjxbdnesvaxjUsuwmrftmILW-CErt5cXGcZp93UGtLy8fBehhZxwZ2oxtjQLNb269jHfkNA3XBHnn9JIVZbApeatdCi9gX6ylK7-5A-DzQ3VSRi8hJCNp_8699CzeD9H0y26Tl-6DO8FIafh9UQFyrpa_C9DA" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/a/AVvXsEjICmOZHTF4gmgXj1G4r5Fp48jM_W4fN9tjxbdnesvaxjUsuwmrftmILW-CErt5cXGcZp93UGtLy8fBehhZxwZ2oxtjQLNb269jHfkNA3XBHnn9JIVZbApeatdCi9gX6ylK7-5A-DzQ3VSRi8hJCNp_8699CzeD9H0y26Tl-6DO8FIafh9UQFyrpa_C9DA=s16000" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;
  Performance regressions are notoriously hard to reproduce, making regressions a massive bottleneck for mobile developers. Although signals like ANR rates indicate what issues occur in production, pinpointing the specific line of code that resulted in the performance issue has historically necessitated exhaustive manual reproduction or speculative trial-and-error experimentation.
&lt;/p&gt;

&lt;p&gt;Datadog collaborated with Google to mitigate this frustration by integrating the ProfilingManager API (available on Android 15+ devices) into its Real User Monitoring (RUM) and Continuous Profiling platforms. This integration transforms the debugging workflow, allowing developers to move beyond surface-level symptoms to being able to detect the &lt;em&gt;why&lt;/em&gt; behind a performance bottleneck.
&lt;/p&gt;

By leveraging this system-level API, Datadog now processes millions of production profiles weekly across the globe according to Datadog internal data of June 2026. It provides engineering teams with a new level of visibility into real-world performance, all while maintaining a low runtime overhead for production-scale performance monitoring.

&lt;h3 style="text-align: left;"&gt;The impact of ProfilingManager&lt;/h3&gt;&lt;p&gt;
  ProfilingManager is a system service introduced in Android 15 that enables apps to programmatically collect performance data such as call stack samples, field traces and memory heap dumps directly from production environments. This capability shifts the engineering paradigm from reactive manual reproduction to proactive field analysis.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWVOhdnTTwX9DT3ROPHDLHKm1aJ8Z0vo5wYsHTULe7oRBqsi2-pTblEC1ggNuVXdd5rCZv6RooG4dsdOqMM_8URLUxierH3KjujbTyVSFrqNIs01zMqb_o7uXFeYECms5s_CkX1WvAPaQeO5W9bpnvD4S4BNN0mH9qbanuTukvCg8LTozhNEhY0CQ0o0Q/s1280/AANDDM_DataDog_Quote_01.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="ProfilingManager is a highly performant solution for code-level insights.  Of the solutions we evaluated, it has the lowest runtime overhead,  gives deep visibility into Java, Kotlin, and C++ traces, and opens the door to gather memory profiles and system-level traces during critical moments like ANRs and out-of-memory (OOM) errors. Yi Lu, Senior Engineer at Datadog" border="0" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWVOhdnTTwX9DT3ROPHDLHKm1aJ8Z0vo5wYsHTULe7oRBqsi2-pTblEC1ggNuVXdd5rCZv6RooG4dsdOqMM_8URLUxierH3KjujbTyVSFrqNIs01zMqb_o7uXFeYECms5s_CkX1WvAPaQeO5W9bpnvD4S4BNN0mH9qbanuTukvCg8LTozhNEhY0CQ0o0Q/s16000/AANDDM_DataDog_Quote_01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

For example, a Google communications app used field traces to investigate why its cold start times were slower on newer, more powerful hardware. By diving into the field-collected traces and comparing traces across different device types, the engineer discovered a hidden scheduling issue: a background text-to-speech service was unnecessarily being prewarmed during app startup. The traces revealed that this background process was monopolizing the device's highest-performing big CPU core, forcing the app's main thread to sleep while the prewarm occurred.

&lt;h3 style="text-align: left;"&gt;Solving the Android code-level visibility challenge&lt;/h3&gt;&lt;p&gt;
  Prior to the implementation of ProfilingManager, Datadog’s Real User Monitoring (RUM) focused on high-level application health and session-level telemetry to assess the user journey. Engineering teams could monitor Android performance signals like time to initial display, ANR rates, CPU load, and frozen frames. These insights extended to granular interactions, such as network latency, touch events, and main thread hangs.&amp;nbsp;However, while this data effectively highlighted which performance bottlenecks were surfacing in the field, it provided no clear path to identifying the root cause of these failures.&lt;/p&gt;&lt;div&gt;&lt;span face="&amp;quot;Google Sans&amp;quot;, sans-serif" style="font-size: 11pt; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjW4Lm-zE5X2trjidQ0eh9i_Bhiwd7HnkOcMeRtA_4dABpGG0EPuer564cLFK4o3eb_N_zWmBAgpOa58eygLH5hwFF6kMg_4GFC98vRN4pd1LNZ-PG9W5wyHv-ptVcmIGo1M7FNPi9PKQ9iGsyZeVfr5jDK46HJHU-1Gsc6IZJdSvhrZVavqKiZmyYar0o" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="We realized that across our profiling features, performance profiling on mobile applications remained a blind spot. Teams could see that an Android user experienced a slow screen render or an ANR, but lacked the same code-level visibility they relied on for their backend services. - Bryan Antigua, Senior Product Manager at Datadog" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/a/AVvXsEjW4Lm-zE5X2trjidQ0eh9i_Bhiwd7HnkOcMeRtA_4dABpGG0EPuer564cLFK4o3eb_N_zWmBAgpOa58eygLH5hwFF6kMg_4GFC98vRN4pd1LNZ-PG9W5wyHv-ptVcmIGo1M7FNPi9PKQ9iGsyZeVfr5jDK46HJHU-1Gsc6IZJdSvhrZVavqKiZmyYar0o=s16000" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;
  To address this, Datadog needed a profiling engine capable of capturing Android traces directly from devices in production with minimal performance impact. After evaluating alternative approaches, such as writing their own trace processor using Android Debug APIs, the team selected ProfilingManager because it is the most performant solution of the profiling options they evaluated and offloads the sampling decisions overhead to the OS.
&lt;/p&gt;

&lt;p&gt;
  ProfilingManager supports a wide range of collection methods, including CPU traces, call stack sampling, memory analysis through Java heap dumps and native heap profiles. It enables developers to profile production builds, upload trace files to external storage, and review them in the Perfetto trace analyzer UI. As a SaaS provider, Datadog uploads, visualizes, and analyzes these profiles collected via its SDK, providing a unified view of application health. 
&lt;/p&gt;

By centralizing high-fidelity telemetry within a unified observability API, ProfilingManager empowers Datadog and its clients to proactively monitor, investigate, and remediate complex Android performance regressions through key technical advantages:

&lt;ul style="line-height: 1.6; margin-bottom: 20px; padding-left: 25px;"&gt;
  &lt;li style="margin-bottom: 10px;"&gt;
    &lt;strong&gt;Granular session diagnostics:&lt;/strong&gt; ProfilingManager enhances debuggability by delivering direct OS-level trace data, overcoming the visibility and alignment challenges typical of custom logging with system services. To dive deeper, developers can download these traces from Datadog to investigate further in visualization tools like the &lt;a href="https://ui.perfetto.dev/"&gt;Perfetto UI&lt;/a&gt;. 
  &lt;/li&gt;
  &lt;li style="margin-bottom: 10px;"&gt;
    &lt;strong&gt;Automated telemetry triggers:&lt;/strong&gt; By leveraging native system events to initiate trace recordings at key optimization points, Datadog reduces the need to build custom collection logic. While the initial rollout focuses on the &lt;a href="https://developer.android.com/reference/android/os/ProfilingTrigger?_gl=1*xix6h8*_up*MQ..*_ga*MTc4ODI2NDgwMy4xNzc5MzE2ODcw*_ga_6HH9YJMN9M*czE3NzkzMTY4NzAkbzEkZzAkdDE3NzkzMTY4NzAkajYwJGwwJGgyMTE1NzIyNjk1#TRIGGER_TYPE_APP_FULLY_DRAWN"&gt;APP_FULLY_DRAWN &lt;/a&gt;signal, there are already plans to expand this observability to&amp;nbsp;include &lt;a href="https://developer.android.com/reference/android/os/ProfilingTrigger?_gl=1*1hl4p7n*_up*MQ..*_ga*MTc4ODI2NDgwMy4xNzc5MzE2ODcw*_ga_6HH9YJMN9M*czE3NzkzMTY4NzAkbzEkZzAkdDE3NzkzMTY4NzAkajYwJGwwJGgyMTE1NzIyNjk1#TRIGGER_TYPE_ANR"&gt;ANR&lt;/a&gt;, &lt;a href="https://developer.android.com/reference/android/os/ProfilingTrigger?_gl=1*8x3pd*_up*MQ..*_ga*MTc4ODI2NDgwMy4xNzc5MzE2ODcw*_ga_6HH9YJMN9M*czE3NzkzMTY4NzAkbzEkZzAkdDE3NzkzMTY4NzAkajYwJGwwJGgyMTE1NzIyNjk1#TRIGGER_TYPE_OOM"&gt;OOM&lt;/a&gt;, and &lt;a href="https://developer.android.com/reference/android/os/ProfilingTrigger?_gl=1*1ezx2ma*_up*MQ..*_ga*MTc4ODI2NDgwMy4xNzc5MzE2ODcw*_ga_6HH9YJMN9M*czE3NzkzMTY4NzAkbzEkZzAkdDE3NzkzMTY4NzAkajYwJGwwJGgyMTE1NzIyNjk1#TRIGGER_TYPE_COLD_START"&gt;COLD_START&lt;/a&gt; triggers.&lt;/li&gt;
  &lt;li style="margin-bottom: 10px;"&gt;
    &lt;strong&gt;Proactive trace snapshots:&lt;/strong&gt; By interfacing directly with the system-level Perfetto service (traced), ProfilingManager utilizes a proactive background recording model designed to capture unpredictable issues. This ensures that developers receive a precise visualization of the events leading up to a performance anomaly, offering a level of insight that exceeds what is possible through manual instrumentation. 
  &lt;/li&gt;
  &lt;li style="margin-bottom: 10px;"&gt;
    &lt;strong&gt;Bottleneck detection at scale:&lt;/strong&gt; Datadog is able to synthesize telemetry from across Datadog’s global customer base to uncover regressions that only emerge under unique hardware configurations and variable network environments.
  &lt;/li&gt;
  &lt;li style="margin-bottom: 10px;"&gt;
    &lt;strong&gt;System-enforced resource stability:&lt;/strong&gt; The API leverages sampling trace collection to ensure performance and user experience impacts remain unnoticeable.
  &lt;/li&gt;
  &lt;li style="margin-bottom: 10px;"&gt;
    &lt;strong&gt;On-device data controls:&lt;/strong&gt;&amp;nbsp;ProfilingManager filters out irrelevant information from other processes on-device before the profile is delivered to the app. This minimizes file sizes and ensures that only data relevant to the app's processes is provided.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 style="text-align: left;"&gt;Processing millions of weekly profiles to optimize real-world apps&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr2ikpIrv_Km0RiIq-khGPFHpfA5CRYHfnLj2oRxLSuTk2x8qJFoO4UyNiwMpJphecSAVR4aWcJEB7BzvkXYjkyDggRDUYhLTBGhoj5q3b6BmwA5IcsER1_k5tffie6pteW3YNkIwI5Y6rG_Ie35Xzzq-mEnfq8iinA_cd_r5ydCxfRwajPSngrY1591k/s3464/datadog-profiling-blogpost-final.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1686" data-original-width="3464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr2ikpIrv_Km0RiIq-khGPFHpfA5CRYHfnLj2oRxLSuTk2x8qJFoO4UyNiwMpJphecSAVR4aWcJEB7BzvkXYjkyDggRDUYhLTBGhoj5q3b6BmwA5IcsER1_k5tffie6pteW3YNkIwI5Y6rG_Ie35Xzzq-mEnfq8iinA_cd_r5ydCxfRwajPSngrY1591k/s16000/datadog-profiling-blogpost-final.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;An example of Datadog's time to initial display measurement with&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;stack sampling powered by ProfilingManager&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;br /&gt;Integrating a system-level profiling API into a global monitoring SDK required solving infrastructure challenges. Because ProfilingManager generates highly detailed performance traces, the Datadog engineering team had to build a pipeline capable of parsing and analyzing these profiles on the server side at scale.&amp;nbsp;&lt;span id="docs-internal-guid-9c101479-7fff-1728-f32c-ee2043f27f0e"&gt;&lt;span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"&gt;Beyond profile collection, Datadog also emphasizes the importance of balancing sampling frequency with collecting enough data to generate meaningful insights about your application. &lt;/span&gt;&lt;/span&gt;Datadog relies on ProfilingManager’s built-in rate limiting as a critical stability safeguard, preventing excessive telemetry requests from overburdening user devices.&lt;br /&gt;&lt;br /&gt;The team has been profiling Datadog's own native Android application and a number of early adopters’ applications for months, gathering millions of profiles to ensure a fast, error-free launch experience and to refine their performance-detection algorithms.&amp;nbsp;Today, the production integration seamlessly scales across a variety of Android devices. &lt;p&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Conclusion&lt;/h3&gt;&lt;p&gt;By integrating Android’s ProfilingManager API, Datadog successfully closed the visibility gap between backend systems and mobile client applications for their customers. By processing millions of profiles weekly with negligible device overhead, Datadog equips Android developers with the code-level insights necessary to diagnose complex performance bugs instantly, helping developers build smoother applications and improve their app’s performance signals in the Play Store. To adopt the ProfilingManager API directly into your performance observability framework, check out our &lt;a href="https://developer.android.com/topic/performance/tracing/profiling-manager/overview"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;
  In the future, Datadog aims to make Android profiling data a first-class input for coding agents to autonomously resolve performance bottlenecks, closing the feedback loop between detection and remediation. Datadog is working toward making Android profiling broadly accessible to developers.
&lt;/p&gt;

&lt;p style="margin-top: 25px;"&gt;
  To get started using the Datadog real user monitoring feature powered by ProfilingManager, visit &lt;a href="https://www.datadoghq.com/dg/real-user-monitoring/android-profiling/?utm_source=inbound&amp;amp;utm_medium=corpsite-display&amp;amp;utm_campaign=int-rum-ww-blog-announcement-announcement-androidprofilerblog2026" style="color: #0066cc;"&gt;Datadog Mobile Real User Monitoring&lt;/a&gt;.&lt;/p&gt;</content><link href="http://android-developers.googleblog.com/feeds/8402705196179189955/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/datadog-profilingmanager-performance-insights.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8402705196179189955" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8402705196179189955" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/datadog-profilingmanager-performance-insights.html" rel="alternate" title="Datadog delivers millions of in-depth performance insights with ProfilingManager" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEh92CmF7Hos-AKsEmr3k9Va10fhbed32pj4r9wxbUAlpyAIh2GV0KhvsRYzkmATQgflpHYdfAgdFkRfq1ki2G7ty5wKfzoaoyYknCOEjb6Auz7r0Zcfk0tR6VCX-3o3L9fpcs419uI5iNdBiOtno7ughGWD0SGJ5n3sfWPEB7ZJ9M_HQFDLhBQ_hv3HFQ8=s72-c" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-8785928561327955050</id><published>2026-06-02T12:00:00.000-07:00</published><updated>2026-06-15T11:44:25.503-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="memory"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><title type="text">Prioritizing Memory Efficiency: Essential Steps for Android 17</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCIAoJpwUITPS5C3_eTksMsaslwqPk7SIEQHkwEkGv8572ccdIKcdv6kNC1BOSJPAZTgX5m3liMMv4zdK58e5dWRhUfo39uas23LuhEWf13TFnDTdw-Z5mWn4JarSnC8yCET8Sw15zSF-jQ5zwALriacGK6IjAGxNg61sFtSxzndjvqXxZtJt4qxuzd9A/s2048/Engineering-Memory-Blog-Meta-3.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCIAoJpwUITPS5C3_eTksMsaslwqPk7SIEQHkwEkGv8572ccdIKcdv6kNC1BOSJPAZTgX5m3liMMv4zdK58e5dWRhUfo39uas23LuhEWf13TFnDTdw-Z5mWn4JarSnC8yCET8Sw15zSF-jQ5zwALriacGK6IjAGxNg61sFtSxzndjvqXxZtJt4qxuzd9A/s2048/Engineering-Memory-Blog-Meta-3.png" style="display: none;" /&gt;

&lt;div class="separator" style="clear: both; text-align: left;"&gt;
    &lt;em&gt;Posted by Alice Yuan, Developer Relations Engineer, Ajesh Pai, Developer Relations Engineer, and Fung Lam, Developer Relations Engineer&lt;/em&gt;
&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
    &lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhanYZz4QpaDuwP7y_ZVGCUh6TpdQxS65pBcYr-Qkawd9YFS587tnIUPnqDROlxIXzgdz6GGxluR3LzH8ZabQPWz382FDEOEDpK3GxUFywn0A54JXFtUwDPaeI0JnFhEl-6NRrcjKeFPMLozNQv_An9OcWEUA-rmXfOhWvIKRrptdblGEZHERD0P-ynFcc/s4209/Engineering-Memory-Blog-3.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;
        &lt;img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhanYZz4QpaDuwP7y_ZVGCUh6TpdQxS65pBcYr-Qkawd9YFS587tnIUPnqDROlxIXzgdz6GGxluR3LzH8ZabQPWz382FDEOEDpK3GxUFywn0A54JXFtUwDPaeI0JnFhEl-6NRrcjKeFPMLozNQv_An9OcWEUA-rmXfOhWvIKRrptdblGEZHERD0P-ynFcc/s16000/Engineering-Memory-Blog-3.png" /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p style="text-align: left;"&gt;
    While app performance is often equated with a smooth UI and fast start times, memory serves as the silent foundation upon which these visible metrics are built. It's no secret that we're seeing a shift where device memory is more important than ever. Not only have we made strides in Android memory optimizations with Android 17, we're providing the tooling and API support to help you stay ahead of stricter memory requirements later this year.
&lt;/p&gt;

&lt;p style="text-align: left;"&gt;
    To ensure device stability, starting in Android 17, the system will begin enforcing app memory limits based on the device's total RAM. If an app exceeds those limits, Android will kill the process with no associated stack trace.
&lt;/p&gt;

&lt;div style="text-align: left;"&gt;
    Beyond these forced terminations, unoptimized memory usage inevitably degrades the user experience. When the app approaches heap memory limits, it triggers frequent garbage collection—leading to noticeable UI stutters. Furthermore, when a device runs out of available memory, the system scrambles to reclaim pages, causing CPU strain, UI latency, and battery drain. If the memory shortage is too severe, it can cause Low Memory Killer (LMK) events that abruptly terminate background processes and force apps to have slow cold starts and lose user state.
&lt;/div&gt;

&lt;div style="text-align: left;"&gt;
    &lt;p style="text-align: left;"&gt;To build highly performant apps and avoid these forced terminations, we recommend that you adopt the following memory optimization strategies:&lt;/p&gt;
    &lt;ol style="text-align: left;"&gt;
        &lt;li&gt;&lt;a href="#Maximize"&gt;Maximize bytecode optimization with R8&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#Optimize"&gt;Optimize image loading&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#Detect"&gt;Detect and fix memory leaks with Android Studio&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#Trim"&gt;Trim memory when app leaves visible state&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="#Advanced"&gt;Advanced memory observability with ProfilingManager&lt;/a&gt;&lt;/li&gt;
    &lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
    &lt;div class="separator" style="clear: both; text-align: center;"&gt;
        &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/fOXJR5qLq54" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="fOXJR5qLq54"&gt;&lt;/iframe&gt;
    &lt;/div&gt;
    &lt;div style="text-align: center;"&gt;
        &lt;em&gt;A condensed version of this blog post is also available in video format, go check it out!&lt;/em&gt;
    &lt;/div&gt;
    
    &lt;h3 style="text-align: left;"&gt;Understanding Android 17 app memory limits&lt;/h3&gt;
    &lt;p style="text-align: left;"&gt;App memory limits are being introduced in Android 17 to prevent "one bad actor" from destroying the multitasking experience and stability of the user’s entire device.&lt;/p&gt;
    &lt;p style="text-align: left;"&gt;Here is a breakdown of the reasons driving this architectural change:&lt;/p&gt;
    
    &lt;div style="text-align: left;"&gt;
        &lt;ul style="text-align: left;"&gt;
            &lt;li&gt;&lt;b&gt;Preventing cascading kills:&lt;/b&gt; When an app becomes bloated or leaks memory while holding a privileged state (e.g. it’s running a Foreground Service), it is initially shielded from the system's Low Memory Killer (LMK). As this single app grows unchecked and hoards RAM, the LMK is forced to compensate by killing off dozens of smaller, well-behaved cached apps and background jobs to reclaim space for the memory hog.&lt;/li&gt;
            &lt;li&gt;&lt;b&gt;Preserving multitasking and user state:&lt;/b&gt; When the system is forced to purge cached apps to accommodate a single leaking process, the multitasking experience is severely degraded. Users returning to prior cached applications encounter sluggish cold starts instead of near-instant warm resumes. This inefficiency generates more CPU strain and accelerates battery depletion. It can also destroy the user’s context in recently used apps, such as scroll positions, navigation stacks, and in-game progress.&lt;/li&gt;
        &lt;/ul&gt;
        
        &lt;div style="text-align: left;"&gt;
            &lt;p&gt;To determine if your app session was impacted by these constraints in the field, you can call &lt;a href="https://developer.android.com/reference/android/app/ApplicationExitInfo#getDescription%28%29" target="_blank"&gt;getDescription()&lt;/a&gt; within &lt;a href="https://developer.android.com/reference/android/app/ApplicationExitInfo" target="_blank"&gt;ApplicationExitInfo&lt;/a&gt;. If the system applied a limit, the exit reason is reported as &lt;a href="https://developer.android.com/reference/android/app/ApplicationExitInfo#REASON_OTHER" target="_blank"&gt;REASON_OTHER&lt;/a&gt; and the description string will contain "MemoryLimiter:AnonSwap". You can also leverage &lt;a href="https://developer.android.com/topic/performance/tracing/profiling-manager/trigger-based-capture" target="_blank"&gt;trigger-based profiling&lt;/a&gt; using &lt;a href="https://developer.android.com/about/versions/17/features#anomaly-profiling-trigger" target="_blank"&gt;TRIGGER_TYPE_ANOMALY&lt;/a&gt; to automatically capture heap dumps when the memory limit is reached. Furthermore, Android is actively working to surface more in-field memory metrics to developers within the Google Play Console.&lt;/p&gt;
            &lt;p&gt;We have also expanded our &lt;a href="https://developer.android.com/about/versions/17/behavior-changes-all#app-memory-limits" target="_blank"&gt;memory limits documentation&lt;/a&gt; to include local debugging commands, allowing you to simulate memory constraints in your local environment and validate your application's behavior under any memory limit enforcement.&amp;nbsp;&lt;/p&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;div style="text-align: left;"&gt;
    &lt;h3 id="Maximize" style="text-align: left;"&gt;Maximize bytecode optimization with R8&lt;/h3&gt;
    &lt;p style="text-align: left;"&gt;A highly effective way to reduce your app's memory footprint is to enable the R8 optimizer. By shrinking classes, methods, and fields into shorter names and stripping out unused code and resources, R8 significantly reduces your app's memory footprint by minimizing the amount of resident code required during execution.&amp;nbsp;&lt;/p&gt;
    &lt;p style="text-align: left;"&gt;R8 minimizes resident code, shrinking the memory footprint and lowering LMK termination risk. This results in more frequent warm starts over slow cold starts. Additionally, streamlined bytecode reduces main-thread CPU overhead, directly cutting ANR rates for a more fluid user experience. For example, the digital bank &lt;a href="https://developer.android.com/blog/posts/monzo-boosts-performance-metrics-by-up-to-35-with-a-simple-r8-update" target="_blank"&gt;Monzo&lt;/a&gt; enabled full R8 optimization and saw a 35% reduction in their ANR rate, a 30% improvement in cold start rate, and a 9% reduction in overall app size.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
    &lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB61hi7-o6RYAHNOoIg1egyi6iU3iGtLbwfOb-s6r_PadBV2LZzvYtcdD00iwcApjnqmwOssOLFSHv8MG_es8WJWaJUPaO6rMY4ZcINSBFROo_1Di3LVMvIEhPldpzQsUOxV1Z7VfPwvej2fa9a7yCNwBdGOGw2LMLtPrCST6InlqF1xHds30rS76C9no/s2500/pic1-IO26_113_TSV-monzo-casestudy.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;
        &lt;img border="0" data-original-height="1406" data-original-width="2500" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB61hi7-o6RYAHNOoIg1egyi6iU3iGtLbwfOb-s6r_PadBV2LZzvYtcdD00iwcApjnqmwOssOLFSHv8MG_es8WJWaJUPaO6rMY4ZcINSBFROo_1Di3LVMvIEhPldpzQsUOxV1Z7VfPwvej2fa9a7yCNwBdGOGw2LMLtPrCST6InlqF1xHds30rS76C9no/s16000/pic1-IO26_113_TSV-monzo-casestudy.jpg" /&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
    &lt;i&gt;The digital bank &lt;a href="https://developer.android.com/blog/posts/monzo-boosts-performance-metrics-by-up-to-35-with-a-simple-r8-update" target="_blank"&gt;Monzo&lt;/a&gt; enabled full R8 optimization and boosted performance metrics by up to 35%.&lt;/i&gt;
&lt;/div&gt;

&lt;div&gt;
    &lt;p style="text-align: left;"&gt;To properly configure R8 in your &lt;code&gt;build.gradle&lt;/code&gt; file:&lt;/p&gt;
    &lt;ul style="text-align: left;"&gt;
        &lt;li&gt;Set &lt;code&gt;isShrinkResources = true&lt;/code&gt; and &lt;code&gt;isMinifyEnabled = true&lt;/code&gt;.&lt;/li&gt;
        &lt;li&gt;Use &lt;code&gt;proguard-android-optimize.txt&lt;/code&gt; instead of the legacy &lt;code&gt;proguard-android.txt&lt;/code&gt;, which actually prevents optimizations and is no longer supported in Android Gradle Plugin 9.&lt;/li&gt;
        &lt;li&gt;Remove &lt;code&gt;android.enableR8.fullMode = false&lt;/code&gt; from your &lt;code&gt;gradle.properties&lt;/code&gt;.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p style="text-align: left;"&gt;
        If you are using reflection in your code base, then add &lt;a href="https://developer.android.com/topic/performance/app-optimization/keep-rules-overview#where-to-add-rules" target="_blank"&gt;Keep rules&lt;/a&gt; to prevent R8 from optimizing those parts of the code. Make sure to scope the keep rules narrowly to get the maximum optimization.
    &lt;/p&gt;
    &lt;p style="text-align: left;"&gt;To get the maximum optimization, make sure to follow these best practices in your keep rule file.&lt;/p&gt;
    
    &lt;ul style="text-align: left;"&gt;
        &lt;li&gt;Remove global options like &lt;code&gt;-dontoptimize&lt;/code&gt;, &lt;code&gt;-dontshrink&lt;/code&gt;, and &lt;code&gt;-dontobfuscate&lt;/code&gt; that prevent R8 from optimizing the entire codebase&amp;nbsp;&lt;/li&gt;
        &lt;li&gt;Remove keep rules that prevent optimizing Android components like Activity, Services, Views or Broadcast receivers.&lt;/li&gt;
        &lt;li&gt;Refine the broad package wide keep rules to target only specific classes or methods.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p style="text-align: left;"&gt;To see more best practices, view our &lt;a href="https://developer.android.com/topic/performance/app-optimization/keep-rules-best-practices" target="_blank"&gt;keep rules documentation&lt;/a&gt;.&lt;/p&gt;
    
    &lt;h3 style="text-align: left;"&gt;Library Developer R8 Best Practices&lt;/h3&gt;
    &lt;p&gt;If you are a library developer, strictly place the rules your consumers need into your &lt;code&gt;consumer-rules&lt;/code&gt; file, and keep your library's internal protection rules in your &lt;code&gt;proguard-rules.pro&lt;/code&gt; file. For more information on how to optimize libraries, see &lt;a href="https://developer.android.com/topic/performance/app-optimization/library-optimization" target="_blank"&gt;Optimization for library authors&lt;/a&gt;.&lt;/p&gt;
    
    &lt;h3 style="text-align: left;"&gt;R8 Configuration Analyzer&lt;/h3&gt;
    &lt;p&gt;To audit your R8 optimization, use the &lt;b&gt;&lt;a href="http://developer.android.com/r8-analyzer" target="_blank"&gt;Configuration Analyzer&lt;/a&gt;&lt;/b&gt;. Configuration analyzer shows the current state of optimization with Obfuscation, Optimization, and Shrinking scores. With configuration analyzer, you can also understand how many classes, methods or fields are prevented from optimization by each keep rule. Refine these broad package wide keep rules to unlock the maximum optimization.&lt;/p&gt;
    &lt;p&gt;Using configuration analyzer, you can also identify keep rules that are subsuming other keep rules, redundant keep rules and unused keep rules.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
    &lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib0dTmk8w7EYsDiV0Ufd8CAnpWz36-ZDC_gCGFkS_0CGz0axCxOy3RBxuaOoUbR4kzaeFBXryfSR2rkxRsmTXNrPtuJw8n1DTiZiKDqHjv3AaEXteE9TKV3QxYtwCztvY-8a0GpBlOZhVV1p0ftgdxeiKGGnO3dLu_IOt-TB_7j-ZnbR2jSr_CNYzh-bc/s2048/pic2-r8-config-analyzer.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;
        &lt;img border="0" data-original-height="1156" data-original-width="2048" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib0dTmk8w7EYsDiV0Ufd8CAnpWz36-ZDC_gCGFkS_0CGz0axCxOy3RBxuaOoUbR4kzaeFBXryfSR2rkxRsmTXNrPtuJw8n1DTiZiKDqHjv3AaEXteE9TKV3QxYtwCztvY-8a0GpBlOZhVV1p0ftgdxeiKGGnO3dLu_IOt-TB_7j-ZnbR2jSr_CNYzh-bc/s16000/pic2-r8-config-analyzer.png" /&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
    &lt;i&gt;The Configuration Analyzer shows the current state of optimization with Obfuscation, Optimization, and Shrinking scores.&lt;/i&gt;
&lt;/div&gt;

&lt;div&gt;
    &lt;h4 style="text-align: left;"&gt;&lt;span style="font-size: large;"&gt;R8 Agent Skill&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
    &lt;p style="text-align: left;"&gt;You can also leverage the &lt;b&gt;&lt;a href="https://github.com/android/skills/tree/main/performance/r8-analyzer" target="_blank"&gt;R8 Agent Skill&lt;/a&gt;&lt;/b&gt; with Android Studio agent or other AI tools to resolve misconfigurations and refine your rules resulting in improved app performance. &lt;i&gt;(Insights from AI-driven skills will require technical verification)&lt;/i&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;h3 id="Optimize" style="text-align: left;"&gt;Optimize image loading&lt;/h3&gt;
&lt;div&gt;
    &lt;p&gt;Bitmaps are usually the largest common objects residing in your app's memory. They represent the final stage of the image loading process where compressed files, like JPEGs or PNGs, are decoded into raw pixel data for display. This means a tiny 100KB compressed image can balloon into several megabytes of RAM because memory consumption is determined by the image's pixel dimensions and color depth. Since bitmap operations are frequently on the critical path to drawing frames, unoptimized images cause severe memory bloat and UI jank.&lt;/p&gt;
    &lt;p&gt;Google recommends leveraging image loading libraries &lt;b&gt;&lt;a href="https://github.com/coil-kt/coil" target="_blank"&gt;Coil&lt;/a&gt;&lt;/b&gt; for Kotlin-first projects, particularly when developing with Jetpack Compose and &lt;b&gt;&lt;a href="https://github.com/bumptech/glide" target="_blank"&gt;Glide&lt;/a&gt;&lt;/b&gt; for Java-based applications.&lt;/p&gt;
    
    &lt;h4 style="text-align: left;"&gt;&lt;span style="font-size: large;"&gt;Adopt these five best practices&lt;/span&gt;&lt;/h4&gt;
    &lt;ol style="text-align: left;"&gt;
        &lt;li&gt;&lt;b&gt;Downsample images:&lt;/b&gt; If you’re loading bitmaps manually, avoid loading a massive image into a tiny thumbnail view; use &lt;a href="https://developer.android.com/topic/performance/graphics/load-bitmap" target="_blank"&gt;inSampleSize&lt;/a&gt; to load a smaller version. Glide and Coil downsamples images by default and you can configure this downsample strategy using &lt;a href="https://bumptech.github.io/glide/javadocs/470/com/bumptech/glide/load/resource/bitmap/DownsampleStrategy.html" target="_blank"&gt;DownsampleStrategy&lt;/a&gt; and &lt;a href="https://coil-kt.github.io/coil/image_loaders/" target="_blank"&gt;ImageLoader&lt;/a&gt; respectively.&lt;/li&gt;
        &lt;li&gt;&lt;b&gt;Cropping:&lt;/b&gt; Avoid embedding padding directly into an image file for letterboxing purposes (e.g., creating a transparent border to expand an image dimensions). Rather than baking in these borders, utilize &lt;a href="https://developer.android.com/reference/android/graphics/drawable/InsetDrawable" target="_blank"&gt;InsetDrawable&lt;/a&gt; or apply padding directly within the View or Composable containing the bitmap.&lt;/li&gt;
        &lt;li&gt;&lt;b&gt;Config:&lt;/b&gt; Balance memory and quality by choosing the right pixel format. Use &lt;code&gt;RGB_565&lt;/code&gt; when transparency isn't needed, which uses half the memory of the default &lt;code&gt;ARGB_8888&lt;/code&gt; format. In Glide you can configure this by using &lt;a href="https://bumptech.github.io/glide/javadocs/470/com/bumptech/glide/load/DecodeFormat.html" target="_blank"&gt;DecodeFormat&lt;/a&gt; and in Coil you can use &lt;a href="https://coil-kt.github.io/coil/api/coil-core/coil3.request/-image-request/" target="_blank"&gt;bitmapConfig&lt;/a&gt; property.&lt;/li&gt;
        &lt;li&gt;&lt;b&gt;Prioritize vector drawables:&lt;/b&gt; For basic geometric assets, leverage &lt;a href="https://developer.android.com/reference/android/graphics/drawable/ShapeDrawable" target="_blank"&gt;ShapeDrawable&lt;/a&gt; as a lightweight alternative to decoding rasterized bitmaps. By defining these assets once via XML, you ensure they scale seamlessly across all display densities while effectively eliminating resource-driven memory bloat.&lt;/li&gt;
        &lt;li&gt;&lt;b&gt;Reuse:&lt;/b&gt; If your application manages Bitmaps manually then to minimize memory churn, when a bitmap is no longer required, the app should call &lt;code&gt;bitmap.recycle()&lt;/code&gt; and immediately discard the Bitmap reference. If you use an image loading library like Glide or Coil, return the bitmap to the library’s managed pool. By providing an existing buffer for future memory needs, the pool effectively avoids the overhead of new allocations.&lt;/li&gt;
    &lt;/ol&gt;
    
    &lt;p style="text-align: left;"&gt;Check out our documentation on &lt;a href="https://developer.android.com/develop/ui/compose/graphics/images/optimization" target="_blank"&gt;Optimizing performance for images&lt;/a&gt; to learn more.&lt;/p&gt;
    
    &lt;h4 style="text-align: left;"&gt;&lt;span style="font-size: large;"&gt;Android Studio tooling&lt;/span&gt;&lt;/h4&gt;
    &lt;p style="text-align: left;"&gt;You can also eliminate redundant bitmaps using Android Studio Narwhal 4. Here is how to hunt them down in five simple steps:&lt;/p&gt;
    &lt;ol style="text-align: left;"&gt;
        &lt;li&gt;Open the &lt;b&gt;Profiler&lt;/b&gt; tab in Android Studio&lt;/li&gt;
        &lt;li&gt;Click &lt;b&gt;Heap Dump&lt;/b&gt; (or "Analyze Memory Usage") and hit record to take a snapshot of your app’s current memory state.&lt;/li&gt;
        &lt;li&gt;Scan the analysis results for the &lt;b&gt;yellow warning triangle&lt;/b&gt; ⚠️, which Android Studio uses to flag duplicate bitmaps being stored multiple times. Alternatively, navigate to the profiler header, choose "Filter by:" and pick the "Duplicate Bitmaps" setting.&lt;/li&gt;
        &lt;li&gt;Click on any flagged entry to open the &lt;b&gt;Bitmap Preview&lt;/b&gt; pane, allowing you to see exactly which image is the repeat offender.&lt;/li&gt;
        &lt;li&gt;Use that visual confirmation to track down the redundant loading logic in your code and implement a better caching strategy.&lt;/li&gt;
    &lt;/ol&gt;
&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDJ6djtozFY7DzrGB-EN8ajLVueF9MdLd4mod4jhtO8YwCzU7ObOwQ2w0Bap5A5NHJ7KVnXIRQqhW8cTdcFhMJPw5FIW1WU7D_Mwm-UC9Fsdr-MOn62xijpjKcS0NeUBnO957jmogGEISNQgeZQk3BVvUWK4BknTjLiuK2TbWCqwO3uTLkjkFhLwJre7w/s2379/pic3-IO26_113_TSV%20-dup-bitmaps-cropped.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1162" data-original-width="2379" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDJ6djtozFY7DzrGB-EN8ajLVueF9MdLd4mod4jhtO8YwCzU7ObOwQ2w0Bap5A5NHJ7KVnXIRQqhW8cTdcFhMJPw5FIW1WU7D_Mwm-UC9Fsdr-MOn62xijpjKcS0NeUBnO957jmogGEISNQgeZQk3BVvUWK4BknTjLiuK2TbWCqwO3uTLkjkFhLwJre7w/s16000/pic3-IO26_113_TSV%20-dup-bitmaps-cropped.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;Look for the yellow warning triangle ⚠️ in heap dumps when using the Android Studio Profiler.&lt;/i&gt;&lt;/div&gt;

&lt;h3 id="Detect" style="text-align: left;"&gt;Detect and fix memory leaks with Android Studio&lt;/h3&gt;
&lt;p style="text-align: left;"&gt;Memory leaks in Android occur when your code holds onto an object's reference long after its lifecycle has ended. This prevents the Garbage Collector (GC) from reclaiming that memory, eventually leading to sluggish performance or OutOfMemoryError (OOM).&lt;/p&gt;
&lt;p style="text-align: left;"&gt;Android Studio Panda 3 features a dedicated&amp;nbsp;&lt;a href="https://square.github.io/leakcanary/" target="_blank"&gt;LeakCanary&lt;/a&gt;&amp;nbsp;profiler task, allowing developers to analyze real-time memory leaks and map traces within the IDE.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;The LeakCanary profiler task in Android Studio actively moves the memory leak analysis from your device to your development machine, resulting in a significant performance boost during the leak analysis phase as compared to on-device leak analysis.&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
    &lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKBixtkwy1hzwA6mikjRX_6vBJ9OQ_RCYdF94HUF8kOLYzQoQrPMLh_6h9u6EGeLzgFc8yjxg3_8zlqWIDCvKa1py5gyxDXasl8JLPDHSEgPpzPyYqzcme69rRKtfIlhMtyNRWXutGXNy-4WcefhSTBhqBgobK678fqvNqL5peOz1UD6ouunLaKPmJCw0/s2048/pic4-android-studio-leaks.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;
        &lt;img border="0" data-original-height="975" data-original-width="2048" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKBixtkwy1hzwA6mikjRX_6vBJ9OQ_RCYdF94HUF8kOLYzQoQrPMLh_6h9u6EGeLzgFc8yjxg3_8zlqWIDCvKa1py5gyxDXasl8JLPDHSEgPpzPyYqzcme69rRKtfIlhMtyNRWXutGXNy-4WcefhSTBhqBgobK678fqvNqL5peOz1UD6ouunLaKPmJCw0/s16000/pic4-android-studio-leaks.png" /&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
    &lt;i&gt;LeakCanary memory leak analysis contextualized with &lt;b&gt;Go to declaration&lt;/b&gt; for debugging&lt;/i&gt;
&lt;/div&gt;

&lt;p style="text-align: left;"&gt;Additionally, the leak analysis is now contextualized within the IDE and fully integrated with your source code, providing features like go to declaration and other helpful code connections that drastically reduce the friction and time required to investigate and fix memory leaks.&lt;/p&gt;

&lt;div&gt;
    &lt;h4 style="text-align: left;"&gt;&lt;span style="font-size: large;"&gt;Examples of common memory leaks&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
    &lt;p style="text-align: left;"&gt;Memory leaks occur when an object persists in memory beyond its intended lifespan. This typically happens due to:&lt;/p&gt;
    &lt;ul style="text-align: left;"&gt;
        &lt;li&gt;Retaining references to Fragments, Activities, or Views that are no longer in use.&lt;/li&gt;
        &lt;li&gt;Mismanaging Context references.&lt;/li&gt;
        &lt;li&gt;Failing to properly unregister observers, listeners, and receivers.&lt;/li&gt;
        &lt;li&gt;Creating static references to objects that are bound to components with shorter lifecycles.&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;p style="text-align: left;"&gt;Here are a few example scenarios:&lt;/p&gt;
    
    &lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;
        &lt;table style="border-collapse: collapse; border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; border: none; max-width: 100%; table-layout: auto; width: auto;"&gt;
            &lt;colgroup&gt;
                &lt;col style="width: 15%;"&gt;&lt;/col&gt;
                &lt;col style="width: 42.5%;"&gt;&lt;/col&gt;
                &lt;col style="width: 42.5%;"&gt;&lt;/col&gt;
            &lt;/colgroup&gt;
            &lt;tbody&gt;
                &lt;tr style="height: auto;"&gt;
                    &lt;td style="background-color: #efefef; border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Scenario&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                    &lt;td style="background-color: #efefef; border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Compose-based example&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                    &lt;td style="background-color: #efefef; border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;View-based example&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr style="height: auto;"&gt;
                    &lt;td style="border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: 400;"&gt;Leaking Context&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                    &lt;td style="border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 6pt;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Example:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Passing LocalContext.current to a ViewModel&lt;/span&gt;&lt;/p&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Fix:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Keep &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;Context&lt;/code&gt; dependent logic within the UI layer. For non-UI layers, refactor to use &lt;a href="https://developer.android.com/training/dependency-injection" style="color: #1155cc; text-decoration: underline;"&gt;dependency injection&lt;/a&gt; or observe UI state using &lt;a href="https://developer.android.com/kotlin/flow" style="color: #1155cc; text-decoration: underline;"&gt;Kotlin flow&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                    &lt;td style="border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 6pt;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Example:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Storing an &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;Activity&lt;/code&gt; in a companion object or static variable.&lt;/span&gt;&lt;/p&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Fix:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Don’t hold static references to UI components. Refactor to use &lt;a href="https://developer.android.com/training/dependency-injection" style="color: #1155cc; text-decoration: underline;"&gt;dependency injection&lt;/a&gt; or observe UI state using &lt;a href="https://developer.android.com/kotlin/flow" style="color: #1155cc; text-decoration: underline;"&gt;Kotlin flow&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr style="height: auto;"&gt;
                    &lt;td style="border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: 400;"&gt;Leaking Listeners&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                    &lt;td style="border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 6pt;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Example:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Using &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;DisposableEffect&lt;/code&gt; to start a listener but leaving &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;onDispose&lt;/code&gt; empty.&lt;/span&gt;&lt;/p&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Fix:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Perform the unregistration and &lt;a href="https://developer.android.com/develop/ui/compose/side-effects#disposableeffect" style="color: #1155cc; text-decoration: underline;"&gt;cleanup logic&lt;/a&gt; inside the &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;onDispose&lt;/code&gt; block.&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                    &lt;td style="border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 6pt;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Example:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Registering for SensorManager updates and forgetting to unregister.&lt;/span&gt;&lt;/p&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Fix:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Manually call &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;unregisterListener()&lt;/code&gt; in &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;onStop()&lt;/code&gt; or &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;onDestroy()&lt;/code&gt; lifecycle.&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr style="height: auto;"&gt;
                    &lt;td style="border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: 400;"&gt;Leaking Views&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                    &lt;td style="border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 6pt;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Example:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Holding a reference to a legacy &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;View&lt;/code&gt; inside an &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;AndroidView&lt;/code&gt; without a release strategy.&lt;/span&gt;&lt;/p&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Fix:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Use the &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;release&lt;/code&gt; block of the &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;AndroidView&lt;/code&gt; composable to clean up the legacy &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;View&lt;/code&gt;.&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                    &lt;td style="border: 0.75pt solid rgb(31, 31, 31); padding: 8px; vertical-align: top;"&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 6pt;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Example:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Keeping a reference to a view binding object after the &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;Fragment&lt;/code&gt; is destroyed.&lt;/span&gt;&lt;/p&gt;
                        &lt;p dir="ltr" style="line-height: 1.2; margin: 0px;"&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt; font-weight: bold;"&gt;Fix:&lt;/span&gt;&lt;br /&gt;&lt;span face="'Google Sans',sans-serif" style="color: black; font-size: 11pt;"&gt;Set the binding variable to &lt;code&gt;null&lt;/code&gt; inside the &lt;code style="font-family: &amp;quot;Roboto Mono&amp;quot;, monospace;"&gt;onDestroyView&lt;/code&gt;() lifecycle method.&lt;/span&gt;&lt;/p&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="Trim" style="text-align: left;"&gt;Trim memory when app leaves visible state&lt;/h3&gt;
&lt;p&gt;Android can reclaim memory from your app or stop your app entirely if necessary to free up memory for critical tasks, as explained in &lt;a href="https://developer.android.com/topic/performance/memory-overview" target="_blank"&gt;Overview of memory management&lt;/a&gt;. Android will usually reclaim memory from your app when it’s not visible to the user, such as by discarding some of your app’s code and data pages in memory or compressing your heap allocations. When the user resumes your app and your app tries to access some memory that’s been reclaimed, the OS will swap that memory back in on demand. This swapping behavior can be slow, and cause unexpected jank or stutters in your app.&lt;/p&gt;
&lt;p&gt;If you leave it to the OS to decide what memory to reclaim from your app, you may find that the OS reclaimed memory that you’ll need shortly after resuming your app. Instead, your app can voluntarily discard memory allocations that it can regenerate later, on demand and at a low cost. To do so, you can implement the &lt;code&gt;ComponentCallbacks2&lt;/code&gt; interface. You can implement &lt;code&gt;onTrimMemory&lt;/code&gt; in your &lt;code&gt;Activity&lt;/code&gt;, &lt;code&gt;Fragment&lt;/code&gt;, &lt;code&gt;Service&lt;/code&gt;, or even your custom &lt;code&gt;Application&lt;/code&gt; class. Using it in the &lt;code&gt;Application&lt;/code&gt; class is highly effective for global cache management.&lt;/p&gt;
&lt;p&gt;The provided &lt;a href="https://developer.android.com/reference/android/content/ComponentCallbacks2#onTrimMemory(int)" target="_blank"&gt;onTrimMemory()&lt;/a&gt; callback method notifies your app of lifecycle or memory-related events that present a good opportunity for your app to voluntarily reduce its memory usage.&lt;/p&gt;
&lt;p&gt;In terms of memory lifecycle management, your implementation should focus &lt;b&gt;exclusively&lt;/b&gt; on &lt;code&gt;TRIM_MEMORY_UI_HIDDEN&lt;/code&gt; and &lt;code&gt;TRIM_MEMORY_BACKGROUND&lt;/code&gt;. Since Android 14, the system has ceased delivering notifications for other legacy constants, which were formally deprecated in Android 15.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TRIM_MEMORY_UI_HIDDEN&lt;/code&gt;: This signal indicates that your application's UI has transitioned out of the user's view. This provides an opportunity to release substantial memory allocations tied strictly to the interface—such as Bitmaps, video playback buffers, or complex animation resources.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TRIM_MEMORY_BACKGROUND&lt;/code&gt;: At this level, your process is residing in the background and is now a candidate for termination to satisfy the system's global memory needs. To extend the duration your process remains in the cached state, and reduce the number of app cold starts, you should aggressively release any resources that can be easily reconstructed once the user resumes their session.&lt;/p&gt;

&lt;pre style="background-color: whitesmoke; border-radius: 4px; box-sizing: border-box; color: #333333; display: inline-block; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; line-height: 1.5; margin: 1em 0px; max-width: 100%; min-width: 60%; overflow-x: auto; padding: 12px;"&gt;&lt;code&gt;import android.content.ComponentCallbacks2
// Other import statements.

class MainActivity : AppCompatActivity(), ComponentCallbacks2 {

    /**
     * Release memory when the UI becomes hidden or when system resources become low.
     * @param level the memory-related event that is raised.
     */
    override fun onTrimMemory(level: Int) {

        if (level &amp;gt;= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
            // Release memory related to UI elements, such as bitmap caches.
        }

        if (level &amp;gt;= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
            // Release memory related to background processing, such as by
            // closing a database connection.
        }
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note: The &lt;code&gt;onTrimMemory&lt;/code&gt; integration may depend on SDK support. For instance, certain games rely on their game engine to enable this capability. Please check out the &lt;a href="https://developer.android.com/games/optimize/memory-allocation" target="_blank"&gt;game memory optimization documents&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="Advanced" style="text-align: left;"&gt;Advanced memory observability with ProfilingManager&lt;/h3&gt;
&lt;p style="text-align: left;"&gt;To catch and diagnose memory issues in the field that cannot be reproduced locally, you should leverage the &lt;b&gt;ProfilingManager API&lt;/b&gt;. Introduced in Android 15, this advanced observability API allows you to programmatically collect real-user Perfetto profiles.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;For teams that lack a dedicated infrastructure to manage and host performance artifacts, Crashlytics is exploring a specialized solution to streamline this workflow. They are inviting developers to &lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSe299a_zSNDfa164z7yyqoDjS05ZDRN86bAQKajuAOFEQ4G-w/viewform" target="_blank"&gt;provide feedback&lt;/a&gt;.&lt;/p&gt;

&lt;p style="text-align: left;"&gt;&lt;b&gt;Android 17 introduces new event-driven triggers&lt;/b&gt;, most notably &lt;code&gt;TRIGGER_TYPE_OOM&lt;/code&gt; and &lt;code&gt;TRIGGER_TYPE_ANOMALY&lt;/code&gt;:&lt;/p&gt;
&lt;ul style="text-align: left;"&gt;
    &lt;li&gt;The &lt;b&gt;OOM trigger&lt;/b&gt; automatically collects a Java heap dump at the exact moment an OutOfMemoryError crash occurs, providing precise allocation states. A collected OOM profile is provided the next time the app starts and registers the &lt;code&gt;registerForAllProfilingResults&lt;/code&gt; callback.&lt;/li&gt;
    &lt;li&gt;The &lt;b&gt;Anomaly trigger&lt;/b&gt; detects severe performance issues, such as excessive binder spam or breached memory thresholds. The memory anomaly delivers a heap dump just prior to the system terminating the app.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre style="background-color: whitesmoke; border-radius: 4px; box-sizing: border-box; color: #333333; display: inline-block; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; font-size: 10pt; line-height: 1.5; margin: 1em 0px; max-width: 100%; min-width: 60%; overflow-x: auto; padding: 12px;"&gt;&lt;code&gt;  val profilingManager = 
applicationContext.getSystemService(ProfilingManager::class.java)
    val triggers = ArrayList&lt;profilingtrigger&gt;()  


    triggers.add(ProfilingTrigger.Builder(
                 ProfilingTrigger.TRIGGER_TYPE_ANOMALY))
    val mainExecutor: Executor = Executors.newSingleThreadExecutor()
    val resultCallback = Consumer&lt;profilingresult&gt; { profilingResult -&amp;gt;
        if (profilingResult.errorCode != ProfilingResult.ERROR_NONE) {
            // upload profile result to server for further analysis          
            setupProfileUploadWorker(profilingResult.resultFilePath)
        } 

    profilingManager.registerForAllProfilingResults(mainExecutor, resultCallback)
    profilingManager.addProfilingTriggers(triggers)&lt;/profilingresult&gt;&lt;/profilingtrigger&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p style="text-align: left;"&gt;
    Once you’ve collected the heap dump, you can download the profile from the server, or locally via adb pull and drag and drop the file into the &lt;a href="http://ui.perfetto.dev" target="_blank"&gt;Perfetto UI&lt;/a&gt;. To streamline your memory debugging workflow, use the &lt;a href="https://perfetto.dev/docs/visualization/heap-dump-explorer" target="_blank"&gt;Heap Dump Explorer&lt;/a&gt;, this is the new default view for heap dumps in Perfetto UI. This tool provides an intuitive interface for inspecting Java heap dumps, allowing you to visualize object allocation hierarchies, compute retained memory sizes, and identify the shortest path from garbage collection root. By leveraging the Heap Dump Explorer, you can rapidly pinpoint memory leaks, bloated retained objects such as excessive bitmap allocations, and analyze heap object allocations all in one place.
&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
    &lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhobASfyUbXdAYD_MOjREv7RUhCwoNJ9sB4QDSImRfA0UrALJqwQ2ovgAF7YRt3f26UeZoIQa-yDxiSDO84gxv1XkQ8acf8E795-IgAe4tl8AM_7m7nSEuj7t_rhtpgM3f-76_lEh-k7Rltku79-VCuIDN_2Q9DRjJyouCKbxg4pDXHV2yey7V8WlG2jQM/s2048/pic5-perfettoheapdump-analyzer.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;
        &lt;img border="0" data-original-height="1039" data-original-width="2048" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhobASfyUbXdAYD_MOjREv7RUhCwoNJ9sB4QDSImRfA0UrALJqwQ2ovgAF7YRt3f26UeZoIQa-yDxiSDO84gxv1XkQ8acf8E795-IgAe4tl8AM_7m7nSEuj7t_rhtpgM3f-76_lEh-k7Rltku79-VCuIDN_2Q9DRjJyouCKbxg4pDXHV2yey7V8WlG2jQM/s16000/pic5-perfettoheapdump-analyzer.png" /&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
    &lt;i&gt;Use the &lt;a href="https://perfetto.dev/docs/visualization/heap-dump-explorer"&gt;Heap Dump Explorer&lt;/a&gt;’s embedded flamegraph to visually inspect and navigate through objects with the highest heap allocations.&lt;/i&gt;
&lt;/div&gt;

&lt;h3 style="text-align: left;"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Optimizing bytecode with R8, adopting image loading best practices, and resolving memory leaks are critical steps toward delivering a high-quality user experience while managing resources effectively under pressure. Adopting these proactive measures helps maintain app stability and performance, preventing unexpected terminations while safeguarding user context. To further your performance expertise, explore our revised &lt;a href="https://developer.android.com/topic/performance/memory" target="_blank"&gt;memory guidance&lt;/a&gt;.&lt;/p&gt;</content><link href="http://android-developers.googleblog.com/feeds/8785928561327955050/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/prioritizing-memory-efficiency-steps-for-android-17.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8785928561327955050" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8785928561327955050" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/prioritizing-memory-efficiency-steps-for-android-17.html" rel="alternate" title="Prioritizing Memory Efficiency: Essential Steps for Android 17" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCIAoJpwUITPS5C3_eTksMsaslwqPk7SIEQHkwEkGv8572ccdIKcdv6kNC1BOSJPAZTgX5m3liMMv4zdK58e5dWRhUfo39uas23LuhEWf13TFnDTdw-Z5mWn4JarSnC8yCET8Sw15zSF-jQ5zwALriacGK6IjAGxNg61sFtSxzndjvqXxZtJt4qxuzd9A/s72-c/Engineering-Memory-Blog-Meta-3.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-346934345014843659</id><published>2026-06-02T10:00:00.000-07:00</published><updated>2026-06-02T10:00:27.240-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Auto"/><category scheme="http://www.blogger.com/atom/ns#" term="Camera"/><category scheme="http://www.blogger.com/atom/ns#" term="Cars"/><category scheme="http://www.blogger.com/atom/ns#" term="memory"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><category scheme="http://www.blogger.com/atom/ns#" term="R8"/><category scheme="http://www.blogger.com/atom/ns#" term="Wear OS"/><category scheme="http://www.blogger.com/atom/ns#" term="Widgets"/><title type="text">Building Premium Android Experiences at Google I/O ‘26</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKGsnLX5Gwc9xouq7Q32ltvbL7xW_d4jnCXtoEFr7emB2wzqlZEuXM8FXe22ZPSguMX-nOrxAPYja6AYBZWxF-lKJYxw09D3f2aMyjxsSi5jinnDBjJPOIFDyqVhuJC2SjOqKHLAmstGg1nhyphenhyphenJGYfp3m71TPL_i3xFAUm6PKp3uo5WVytjoRwTIoNmMVQ/s4097/MM_Differentiated%20Experiences_Meta.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKGsnLX5Gwc9xouq7Q32ltvbL7xW_d4jnCXtoEFr7emB2wzqlZEuXM8FXe22ZPSguMX-nOrxAPYja6AYBZWxF-lKJYxw09D3f2aMyjxsSi5jinnDBjJPOIFDyqVhuJC2SjOqKHLAmstGg1nhyphenhyphenJGYfp3m71TPL_i3xFAUm6PKp3uo5WVytjoRwTIoNmMVQ/s4097/MM_Differentiated%20Experiences_Meta.png" style="display: none;" /&gt;

&lt;div style="text-align: left;"&gt;
  &lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;em&gt;Posted by Ataul Munim, Android Developer Relations Engineer&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjimB7lZHnz1Nqt-CPhoIzMWWup9qcJd2B3wzfmG2kX-4HwtnEfrSrp9J2e7aINQrh8SaPd_mP7DvY6nQiP_K2nEju5nOCwbTan-oVeZ8rmoW1R5CvErSIFXPeuIXS7LsB8TnZZee462-ygL5IbOZ2m_C3rAcXEiv08HrPjPrku0oB-T70JyXM6lmgxzmg/s4209/MM_Differentiated-Experiences_Blog%20(1).png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;
    &lt;img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjimB7lZHnz1Nqt-CPhoIzMWWup9qcJd2B3wzfmG2kX-4HwtnEfrSrp9J2e7aINQrh8SaPd_mP7DvY6nQiP_K2nEju5nOCwbTan-oVeZ8rmoW1R5CvErSIFXPeuIXS7LsB8TnZZee462-ygL5IbOZ2m_C3rAcXEiv08HrPjPrku0oB-T70JyXM6lmgxzmg/s16000/MM_Differentiated-Experiences_Blog%20(1).png" /&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: left;"&gt;
  A truly differentiated Android experience is about delivering premium delight wherever your users are. At Google I/O ‘26, we showcased how the latest advancements in the Android ecosystem can help you elevate your app's quality while maximizing development efficiency.
&lt;/div&gt;

&lt;div style="text-align: left;"&gt;
  &lt;p style="text-align: left;"&gt;To help you build apps that stand out, we're diving into the key tools and libraries designed to optimize your core performance, extend the surfaces of your app to other devices, and streamline how your app handles high-quality media.&amp;nbsp;&lt;/p&gt;
  &lt;p style="text-align: left;"&gt;Here is a recap of the essential updates and sessions you need to know to deliver a next-level experience across form factors!&lt;/p&gt;
&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/Wh3LWb_Phfk" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="Wh3LWb_Phfk"&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h3 style="text-align: left;"&gt;Maximize app performance and ROI with the R8 Configuration Analyzer&lt;/h3&gt;
&lt;p&gt;A premium experience is only as good as its foundation, and a performant foundation is what allows your app to scale across the Android ecosystem. This is especially true with the release of Android 17, which introduces conservative, device RAM-based app memory limits to target extreme memory leaks and outliers before they cause system-wide instability. To stay below these new system thresholds and prevent your app from being terminated, having a lean footprint is no longer optional: it’s a critical requirement.&lt;/p&gt;
&lt;p&gt;This year, we’re making it easier to build highly optimized, fast apps by introducing the &lt;a href="https://developer.android.com/topic/performance/app-optimization/r8-configuration-analyzer" target="_blank"&gt;R8 Configuration Analyzer&lt;/a&gt; in Android Studio. R8 is your most powerful tool for improving app performance, but its effectiveness is often limited by overly broad "keep rules" that prevent the compiler from stripping away unused code. The new Configuration Analyzer provides optimization, obfuscation, and shrinking scores, allowing you to identify specific rules that are preventing the benefits of R8 optimization.&lt;/p&gt;
&lt;p&gt;By optimizing their R8 configurations, developers at Monzo achieved a 30% improvement in cold starts and a 35% reduction in ANRs. Smaller, faster code isn't just about efficiency; it's about ensuring your app has the memory headroom to deliver delight on every form factor, from the phone to the car.&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/fOXJR5qLq54" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="fOXJR5qLq54"&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h3 style="text-align: left;"&gt;Extend your reach with a unified approach to Widgets on Phones, Watches and Cars&lt;/h3&gt;
&lt;p&gt;User interaction is shifting toward quick, glanceable moments—short bursts of information that keep users connected without needing to open the full app. To help you increase the reach of your app content, we are unifying the development experience across the Android ecosystem with Jetpack Glance. By using a consistent, Compose-based model, you can elevate the content most important to your users straight to the phone’s home screen, Wear Widgets (previously Tiles!), and cars with a familiar workflow.&lt;/p&gt;
&lt;p&gt;In order to help users engage with your content and features, even outside your app, we are making widgets more expressive and adaptive with RemoteCompose. On Wear OS, RemoteCompose allows you to use the Compose tools you’re already comfortable with to define UI logic that renders natively on remote surfaces, ensuring that your glanceable experiences remain highly performant and responsive even on resource-constrained hardware. On mobile and cars, RemoteCompose is used as a new framework giving Widgets new expressive capabilities.&lt;/p&gt;
&lt;p&gt;You can use Jetpack Glance (together with RemoteCompose on Wear) to deliver a cohesive user journey. Whether it’s viewing flight status on the car dashboard, checking a gate change on a watch, or managing a boarding pass from a phone widget, this shared approach maximizes your app’s presence while keeping your development effort focused and efficient.&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/VnjgKzAa0ws" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="VnjgKzAa0ws"&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;div&gt;
  &lt;h3 style="text-align: left;"&gt;Supercharge your media pipeline with a complete, production-ready toolkit&lt;/h3&gt;
  &lt;div&gt;Android has become a world-class home for the entire media lifecycle, and we are simplifying the journey from the first capture to the final playback. By leveraging Jetpack CameraX and Media3, you can build professional-grade experiences that feel native across the entire ecosystem.&amp;nbsp;&lt;/div&gt;
  &lt;p style="text-align: left;"&gt;It starts with high-fidelity capture using the CameraXViewfinder Composable, which ensures your preview remains perfectly scaled and responsive on any form factor, including foldables and tablets. Use this to build adaptive capture experiences like a picture-in-picture view for multi-tasking, or that take advantage of modern features like high-frame-rate or slow-motion capture with CameraX v1.5.&lt;br /&gt;&lt;/p&gt;
  &lt;p style="text-align: left;"&gt;The new Media3 AI Effects library will provide a unified interface for premium features like Image &amp;amp; Video Enhance, Magic Eraser, and Studio Sound. This allows you to focus on the creative intent while Media3 handles the heavy lifting of choosing the most efficient and reliable path for the device. Then, use the latest improvements in multi-asset editing with Media3 Transformer to composite your edited videos together!&lt;/p&gt;
  &lt;p&gt;Complete the pipeline with tools designed for professional-grade export and viewing, including:&lt;/p&gt;
  &lt;ul style="text-align: left;"&gt;
    &lt;li&gt;CodecDB, which offers data-driven encoding recommendations tailored to specific chipsets, ensuring your exported videos maintain high visual quality with minimal noise or blurriness&lt;/li&gt;
    &lt;li&gt;Scrubbing Mode in ExoPlayer to provide the buttery-smooth seeking experience users expect from premium media apps&lt;/li&gt;
    &lt;li&gt;Enhanced Cast support with the new CastPlayer API in Media3&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;By unifying these technical pillars, you can build a cohesive, high-performance media journey that delivers both delight for your users and high ROI for your development team.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" height="450" src="https://www.youtube.com/embed/Ch1EwR18Dqc" style="border: 0; height: 450px; width: 100%;" width="100%" youtube-src-id="Ch1EwR18Dqc"&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;For more details, check out the &lt;i&gt;premium&lt;/i&gt; Android experience &lt;a href="https://youtube.com/playlist?list=PLWz5rJ2EKKc8lSdmWQ_fSpV9yEGRvEL6S&amp;amp;si=H6-8-AbtEyTqSxeY" target="_blank"&gt;YouTube playlist&lt;/a&gt;.&lt;/p&gt;</content><link href="http://android-developers.googleblog.com/feeds/346934345014843659/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/building-premium-android-experiences-google-io-26.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/346934345014843659" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/346934345014843659" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/06/building-premium-android-experiences-google-io-26.html" rel="alternate" title="Building Premium Android Experiences at Google I/O ‘26" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKGsnLX5Gwc9xouq7Q32ltvbL7xW_d4jnCXtoEFr7emB2wzqlZEuXM8FXe22ZPSguMX-nOrxAPYja6AYBZWxF-lKJYxw09D3f2aMyjxsSi5jinnDBjJPOIFDyqVhuJC2SjOqKHLAmstGg1nhyphenhyphenJGYfp3m71TPL_i3xFAUm6PKp3uo5WVytjoRwTIoNmMVQ/s72-c/MM_Differentiated%20Experiences_Meta.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-7226524598281816438</id><published>2026-05-26T10:30:00.000-07:00</published><updated>2026-05-26T10:51:34.948-07:00</updated><title type="text">Top AI on Android updates for building intelligent experiences from Google I/O ‘26 </title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqtr_NVZaXiVnywBK8bKIamZw4oM3DFopMeWXl_DsHJktlRpmuCkOCQEkc85z-xJ8id7DT8ggl6OopYCndxxYb8kA2LIttV3DlL1Mzmt5OffK_Lyq1q_mxg4RdUjQ23rOyNY5N3wopBtBODH-HQsPRqBc8cS8Kw0Azhz14Jn8EjEdKQ3znXGLRVUpM_-g/s4097/Blog_Meta@2x.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqtr_NVZaXiVnywBK8bKIamZw4oM3DFopMeWXl_DsHJktlRpmuCkOCQEkc85z-xJ8id7DT8ggl6OopYCndxxYb8kA2LIttV3DlL1Mzmt5OffK_Lyq1q_mxg4RdUjQ23rOyNY5N3wopBtBODH-HQsPRqBc8cS8Kw0Azhz14Jn8EjEdKQ3znXGLRVUpM_-g/s4097/Blog_Meta@2x.png" style="display: none;" /&gt;



&lt;i&gt;Posted by Jingyu Shi, Staff Developer Relations Engineer&lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div&gt;&lt;name content="IMG" twitter:image=""&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnWqvWK7oNvOOsTjwsLlEtnmvh7HwduYCahIBBtGUCUZQmQ0pfEWvk3hH0xlrnhyi5oZzY_ZU22jLYl-IA00DVLLi0No_oYWTXYZSk95GLU5P-IirCS74fx2MAUV5mKO_p_6SvFiiNmFnuUoet0QHyMjc8TeLE4Ie7HE3wcFfNeFzkN66IDCkNx1QYQiI/s8419/BLOG%20HERO_BLOGGER@2x.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2507" data-original-width="8419" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnWqvWK7oNvOOsTjwsLlEtnmvh7HwduYCahIBBtGUCUZQmQ0pfEWvk3hH0xlrnhyi5oZzY_ZU22jLYl-IA00DVLLi0No_oYWTXYZSk95GLU5P-IirCS74fx2MAUV5mKO_p_6SvFiiNmFnuUoet0QHyMjc8TeLE4Ie7HE3wcFfNeFzkN66IDCkNx1QYQiI/s16000/BLOG%20HERO_BLOGGER@2x.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;/name&gt;&lt;div&gt;At Google I/O 2026, we introduced Android’s shift from an operating system to an intelligence system. We also demonstrated how you can build intelligent experiences natively with the system and bring the power of Google’s AI into your apps. If you missed these updates, check out our quick recap video here:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;name content="IMG" twitter:image=""&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" src="https://www.youtube.com/embed/TZNu9u9TfN4" style="aspect-ratio: 16/9; border: 0; max-width: 800px; width: 100%;"  youtube-src-id="TZNu9u9TfN4"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
  &lt;br /&gt;&lt;/div&gt;&lt;/name&gt;&lt;h4 style="text-align: left;"&gt;&lt;name content="IMG" twitter:image=""&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;1. Putting your apps at the center of the intelligence system&lt;/span&gt;&lt;/b&gt;&lt;/name&gt;&lt;/h4&gt;&lt;name content="IMG" twitter:image=""&gt;&lt;div&gt;The Android OS already enables agents like &lt;a href="https://www.android.com/gemini-intelligence/?utm_source=blog.google&amp;amp;utm_medium=owned&amp;amp;utm_campaign=next"&gt;Gemini&lt;/a&gt; to complete task automation, where it can navigate an app on the users behalf.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://developer.android.com/ai/appfunctions"&gt;AppFunctions&lt;/a&gt; (Android MCP) provides you with more control over how your app integrates with the intelligence system. This new platform API and Jetpack library are currently available in experimental preview.&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;name content="IMG" twitter:image=""&gt;&lt;b&gt;Android MCP:&lt;/b&gt; AppFunctions allows your application to act as an on-device Model Context Protocol (MCP) server. It means you seamlessly share your app's tools, services and data to the system and agents.&lt;/name&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;name content="IMG" twitter:image=""&gt;&lt;b&gt;Streamlined Development: &lt;/b&gt;You can leverage the new &lt;a href="https://github.com/android/skills/tree/main/device-ai/appfunctions"&gt;skill&lt;/a&gt; to easily generate AppFunctions within your codebase.&amp;nbsp; &lt;/name&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;name content="IMG" twitter:image=""&gt;&lt;b&gt;Exploration and Testing:&lt;/b&gt; We’ve released a new &lt;a href="https://github.com/android/appfunctions/releases"&gt;test agent&lt;/a&gt; that allows you to experiment and debug your AppFunctions in a simulated agent environment.&amp;nbsp;&lt;/name&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span id="docs-internal-guid-8eab0469-7fff-04ab-d4bc-9e7035bdd49c"&gt;&lt;div align="center" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; border: none; table-layout: fixed; width: 550pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;div style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="&amp;quot;Google Sans Text&amp;quot;, sans-serif" style="font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;"&gt;Early Access Program&lt;/span&gt;&lt;span face="&amp;quot;Google Sans Text&amp;quot;, sans-serif" style="font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt;: Want to be among the first apps to deploy app functions in production? &lt;/span&gt;&lt;a href="https://docs.google.com/forms/d/e/1FAIpQLScEoIsgzE-LbgRrYcQMc-Lit_5VlKRA0iWw7Pvg1brIc8wXAw/viewform" style="text-decoration: none;"&gt;&lt;span face="&amp;quot;Google Sans Text&amp;quot;, sans-serif" style="color: #1155cc; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;Join&lt;/span&gt;&lt;/a&gt;&lt;span face="&amp;quot;Google Sans Text&amp;quot;, sans-serif" style="font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"&gt; our early access program today!&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;/name&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To see it in action, check out the live demo showcased during the &lt;i&gt;What’s New&lt;/i&gt; in Android presentation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" src="https://www.youtube.com/embed/2K7VVAMUYPw" style="aspect-ratio: 16/9; border: 0; max-width: 800px; width: 100%;"  youtube-src-id="2K7VVAMUYPw"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
  &lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="background-color: #fcff01;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;h4 style="text-align: left;"&gt;&lt;b&gt;&amp;nbsp;&lt;span style="font-size: large;"&gt;2. On-Device Power with Gemini Nano 4 Preview&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Last month, we launched &lt;a href="https://android-developers.googleblog.com/2026/04/gemma-4-new-standard-for-local-agentic-intelligence.html"&gt;Gemma 4&lt;/a&gt;, our state-of-the-art open models. You can already preview and prototype with the next generation of Gemini Nano (Nano 4) models with the &lt;a href="https://developers.google.com/ml-kit/genai/aicore-dev-preview"&gt;AIcore developer preview&lt;/a&gt;. To make productionizing with Gemini Nano more reliable and performant, we are adding a few new features in &lt;b&gt;ML Kit GenAI APIs&lt;/b&gt;:&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Prototype to Production:&amp;nbsp;&lt;/b&gt;Transition from prototyping in the AICore Developer Preview to building production-ready apps using the ML Kit GenAI &lt;a href="https://developers.google.com/ml-kit/genai/prompt/android/get-started"&gt;Prompt API&lt;/a&gt; to leverage Gemini Nano 4 that’s launching in flagship devices later this year.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Structured Output:&lt;/b&gt; The upcoming Structured Output API will allow you to define object classes to be returned as outputs from Prompt API, ensuring reliable outputs in productionizing your intelligent features.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;&lt;a href="https://developers.google.com/ml-kit/genai/prompt/android/prefix-caching"&gt;Prefix Caching&lt;/a&gt;:&lt;/b&gt; It optimizes your on-device inference performance with the prompt API. The new Prefix caching reduces inference time by storing and reusing the intermediate LLM state of processing a shared and recurring part of the prompt.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="font-weight: bold;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;For highly customized or niche use cases, you can also use LiteRT-LM to &lt;a href="https://youtu.be/boy-UjB8hpA?si=MCPddRD7eblz8ICr"&gt;bring your own&lt;/a&gt; fine-tuned small language model to Android.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" src="https://www.youtube.com/embed/Z7zx_sTbFPI" style="aspect-ratio: 16/9; border: 0; max-width: 800px; width: 100%;"  youtube-src-id="Z7zx_sTbFPI"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;3. Hybrid Inference &amp;amp; Agents&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/b&gt;&lt;div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;To help you build more advanced AI features like hybrid inference and explore building in-app agents, we’ve released new APIs, framework and guidances:&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;&lt;a href="https://android-developers.googleblog.com/2026/04/Hybrid-inference-and-new-AI-models-are-coming-to-Android.html"&gt;Firebase AI Logic Hybrid Inference&lt;/a&gt;: &lt;/b&gt;This new API provides the simple routing capability between on-device models and powerful cloud infrastructure. You can set explicit orchestration modes, such as &lt;code&gt;PREFER_ON_DEVICE&lt;/code&gt;, &lt;code&gt;PREFER_CLOUD&lt;/code&gt;, &lt;code&gt;ONLY_ON_DEVICE&lt;/code&gt;, or &lt;code&gt;ONLY_CLOUD&lt;/code&gt;, based on your need.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;A2UI Jetpack Compose Renderer:&lt;/b&gt; The new A2UI library allows your agents to "speak UI". With the upcoming Jetpack Compose Renderer, you can automatically render these A2UI messages as native UI components.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;&lt;a href="https://developers.googleblog.com/adk-kotlin-android-building-ai-agents/"&gt;ADK for Android&lt;/a&gt;:&lt;/b&gt; The first version of ADK for Android is available for experimentation. It allows you to build multi-agent workflows across both on-device and Cloud models while managing orchestration, context handling and sessions between agents.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;From building with on-device models, exploring hybrid inference to building agents, you can see them in action in this talk:&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
  &lt;iframe allowfullscreen="" class="BLOG_video_class" src="https://www.youtube.com/embed/_iuXykdlTkk" style="aspect-ratio: 16/9; border: 0; max-width: 800px; width: 100%;"  youtube-src-id="_iuXykdlTkk"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
  &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;h3 style="clear: both; text-align: left;"&gt;Start Building Today&lt;/h3&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div class="separator" style="clear: both;"&gt;Whether you are experimenting with AppFunctions to prepare for the intelligence system, or looking to bring the power of Google’s AI within your own app, we’ve got you covered. Dive deeper into the code snippets, samples and comprehensive developer guides on the Android AI &lt;a href="https://developer.android.com/ai"&gt;hub&lt;/a&gt;. For the full breakdown of what’s new, check out the official &lt;b&gt;AI on Android at Google I/O 2026&lt;/b&gt; &lt;a href="https://www.youtube.com/playlist?list=PLWz5rJ2EKKc-GL3584TkxUyoPfzPkB1mV"&gt;playlist&lt;/a&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;We are excited to see what you build!&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/7226524598281816438/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/05/android-ai-intelligence-system.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7226524598281816438" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/7226524598281816438" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/05/android-ai-intelligence-system.html" rel="alternate" title="Top AI on Android updates for building intelligent experiences from Google I/O ‘26 " type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqtr_NVZaXiVnywBK8bKIamZw4oM3DFopMeWXl_DsHJktlRpmuCkOCQEkc85z-xJ8id7DT8ggl6OopYCndxxYb8kA2LIttV3DlL1Mzmt5OffK_Lyq1q_mxg4RdUjQ23rOyNY5N3wopBtBODH-HQsPRqBc8cS8Kw0Azhz14Jn8EjEdKQ3znXGLRVUpM_-g/s72-c/Blog_Meta@2x.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-8004021755030502267</id><published>2026-05-19T06:00:00.000-07:00</published><updated>2026-05-21T09:08:56.044-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ai"/><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Android Bench"/><category scheme="http://www.blogger.com/atom/ns#" term="Android CLI"/><category scheme="http://www.blogger.com/atom/ns#" term="android developers"/><category scheme="http://www.blogger.com/atom/ns#" term="Android Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="Android XR"/><category scheme="http://www.blogger.com/atom/ns#" term="cross-device"/><category scheme="http://www.blogger.com/atom/ns#" term="Developer Tools"/><category scheme="http://www.blogger.com/atom/ns#" term="Google I/O 2026"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Play"/><category scheme="http://www.blogger.com/atom/ns#" term="google tv"/><category scheme="http://www.blogger.com/atom/ns#" term="Jetpack Compose"/><category scheme="http://www.blogger.com/atom/ns#" term="Kotlin Multiplatform"/><category scheme="http://www.blogger.com/atom/ns#" term="Material Design"/><category scheme="http://www.blogger.com/atom/ns#" term="Wear OS"/><title type="text">17 Things to know for Android developers at Google I/O</title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP7OJeCTRC-RN9j39-rULmU26qB-lZoyIZjjDrq07Z7b5GsfHz3q18ftSgcWReGBgIBkp03B6BVghzWllOC38o4jckzzq-e4a8R23ISeegev98zubhGXbIzhTZaqbCTaPLJC2zkxKYvvNspcM4yXkk94f6PEQHpdyMvlpwogicTWQRn3GEksJHOTQDIG4/s2048/GoogleForDevelopers-AndroidText-StrapiMetacard-2048x1323.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP7OJeCTRC-RN9j39-rULmU26qB-lZoyIZjjDrq07Z7b5GsfHz3q18ftSgcWReGBgIBkp03B6BVghzWllOC38o4jckzzq-e4a8R23ISeegev98zubhGXbIzhTZaqbCTaPLJC2zkxKYvvNspcM4yXkk94f6PEQHpdyMvlpwogicTWQRn3GEksJHOTQDIG4/s2048/GoogleForDevelopers-AndroidText-StrapiMetacard-2048x1323.png" style="display: none;" /&gt;


&lt;div style="line-height: 1.6;"&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;Posted by Matthew McCullough, VP, Product Management, Android Developer&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVq21_VInGStxa8CNxcwiU_tpvlkPXci8aDeSb8qUqBe4teuWUN_vIqBf_W64xjTQMBYFyJkdXB-nshsp9DXXEwzUV8-Zn9feQTbuyLk8l98kAlFQqz3_LZrYaEvCukqXCZuY95tmNzrLFqXSviaTTSxflyAkpXJb88cB7mZ7g0x6fdnKzXqY8i1jmhqM/s4209/GoogleForDevelopers-AndroidText-Blogger-4209x1253.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVq21_VInGStxa8CNxcwiU_tpvlkPXci8aDeSb8qUqBe4teuWUN_vIqBf_W64xjTQMBYFyJkdXB-nshsp9DXXEwzUV8-Zn9feQTbuyLk8l98kAlFQqz3_LZrYaEvCukqXCZuY95tmNzrLFqXSviaTTSxflyAkpXJb88cB7mZ7g0x6fdnKzXqY8i1jmhqM/s16000/GoogleForDevelopers-AndroidText-Blogger-4209x1253.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;br /&gt;&lt;/div&gt;Today at &lt;a href="https://io.google/2026/"&gt;Google I/O,&lt;/a&gt; we announced the many ways we’re powering agentic workflows to increase your productivity and ensure your apps shine across the expanding Android ecosystem. Here’s a recap of 17 of our favorite announcements for Android developers; you can also &lt;a href="https://www.youtube.com/live/KvTRMSa1w4E?si=QBAxNvihPwJCJUuS"&gt;see what was announced last week&lt;/a&gt; in &lt;a href="https://developer.android.com/events/show"&gt;The Android Show: I/O Edition&lt;/a&gt;. Stay tuned over the next two days as we dive into all of the topics in more detail!&lt;h2 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: x-large;"&gt;Build High Quality Android Apps Using Agents&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;

  &lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;1: Android CLI: helping you build with any agent, LLM, and tool&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  &lt;a href="https://goo.gle/CLI_IO26"&gt;Android CLI is now stable&lt;/a&gt;. It offers programmatic tools that allow any AI agent, including Claude Code, Codex, or Antigravity, to perform core Android tasks much more easily and efficiently. With today’s release, it also provides a bridge to tap directly into the "heavy-lifting" power of Android Studio to give you the production-ready polish needed for professional Android development. By leveraging the new android studio commands, developers can now grant their preferred agents the ability to perform semantic symbol resolution, analyze files for warnings, and even render Jetpack Compose previews. This release also enables official support for "Journeys" through new &lt;a href="https://developer.android.com/tools/agents/android-skills"&gt;Android skills&lt;/a&gt;, which enables agents to execute end-to-end UI tests under your direction. Watch the &lt;a href="https://www.youtube.com/watch?v=aqmpZocmR8o&amp;amp;list=PLOU2XLYxmsIKL_eEgkKJWDRhYUEvS9eYz&amp;amp;index=23"&gt;developer keynote&lt;/a&gt;, and tune into the &lt;a href="https://io.google/2026/explore/pa-keynote-7"&gt;What’s New in Android tools talk&lt;/a&gt; for more information.&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;p style="color: #333333; font-family: sans-serif; text-align: center;"&gt;&lt;span style="background-color: #fcff01;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXrW3yDK9uH_I8MDyVxgYbPAXfrNTJvlMkXhaZFrM1X9ob0LvQbGe_ZC6anUeO_VNd181iptI_MIuEEpX-9GZdf6ZTJCN-WHpPzDCLOeSblo8vrjliSZ0rRrHwIsERWBjbbosP-M_WvA2pva9mF5FWVygAwQbdiW3SLZgJj9TpRIruG4H-ILsvSq_b4dc/w640-h442/agy-android-cli%20(2).png" /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span&gt;&lt;i style="background-color: white;"&gt;You can now easily install Android CLI for use with Google Antigravity 2.0.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

  &lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;2: Build production-ready apps with ease in Google AI Studio&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  Developers and creators can now &lt;a href="http://android-developers.googleblog.com/2026/05/build-android-apps-google-ai-studio.html"&gt;build native Android apps, simply with a prompt in Google AI Studio&lt;/a&gt;. The apps are built with development best practices like Jetpack Compose, Kotlin, and APIs that leverage our recommended developer patterns. Google AI Studio enables developers to prototype, iterate via an embedded emulator, and deploy to physical devices without heavy local installations. Developers are then able to take those apps and share them to Android devices, as well as share them with others for testing through Google Play Console’s internal testing track. If a developer wants to prepare their app for a wider release, they’re able to take it to Android Studio for advanced debugging, testing, and UI polish. Watch the &lt;a href="https://www.youtube.com/watch?v=aqmpZocmR8o&amp;amp;list=PLOU2XLYxmsIKL_eEgkKJWDRhYUEvS9eYz&amp;amp;index=23"&gt;developer keynote&lt;/a&gt;, and tune into the &lt;a href="https://io.google/2026/explore/pa-keynote-7"&gt;What’s New in Android tools talk&lt;/a&gt; for more information.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdRaw1v6rolr4alo0C6AWKdFchsMEQgtOGfmk2Ramb0IoOB7smDcVU3yC7YJMkvVQuCPJ9vQW53tQjaV-5wcgOGzMtFDmb_Jbv40an1kvQdqYburXnsONvLqckKL2MWuShi3XmQEstW761oOLjujOk3FMsh3FyAiy5-Pe7xdTwFdfkWOmEnHhQfUJhtCo/w640-h544/image1.gif" /&gt;&lt;/div&gt;&lt;i&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;Use the embedded Android Emulator to create Android apps in Google AI Studio&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;/div&gt;&lt;h2 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;3: Accelerating AI coding assistance with Android Bench&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;
  &lt;a href="http://d.android.com/bench"&gt;Android Bench&lt;/a&gt; is our LLM leaderboard for Android development challenges. The goal is to accelerate model improvements, so you have more useful options for AI assistance. Many of you have been using open-weight models for AI assistance, so we’re now adding commonly used ones, such as Gemma 4, to the leaderboard, so you can see how LLMs that offer offline access and additional flexibility for power-users measure up. We're continuously working on increasing the difficulty of challenges we’re giving LLMs, to continue encouraging more useful improvements.&amp;nbsp;&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;4: Convert iOS apps to Android with the Migration Assistant in Android Studio&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  The Migration Assistant in Android Studio is designed to port apps from platforms like iOS, React Native, or web frameworks to native Android. By simply selecting an existing project, developers can have the agent intelligently map features, convert assets like storyboards and SVGs, and implement Android best practices using Jetpack Compose and our recommended Jetpack libraries. This effectively transforms what used to be weeks of manual porting into a streamlined agentic workflow that only takes hours. We shared a preview of the incoming feature in the &lt;a href="https://www.youtube.com/watch?v=aqmpZocmR8o&amp;amp;list=PLOU2XLYxmsIKL_eEgkKJWDRhYUEvS9eYz&amp;amp;index=23"&gt;developer keynote&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK7UKI_nzS7gOkDXYONAjCNbQ4eSqlgT8qqMT5D4qf0OjQUNtxj4Urpq-eTROMEDgrqLKGlwMm_lHA7ayG_BC1DkitQI1ZKsF5gYr-mPIxFUsz_8JPcVHFAtnHZoO2CrVjMEvJrqvBz8_WU1I0T1P2diDprR2B47PcA21oS3RLtbgrhmrpiWV-MAw9ks4/w640-h360/image9%20(1).gif" /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;A sneak peek of the Migration Assistant converting an iOS app into a native Android app&lt;/i&gt;&lt;/div&gt;

  &lt;h2 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: x-large;"&gt;Building AI Into Your Apps&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;

  &lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;5: Building Intelligent Apps with generative AI&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  Generative AI enables you to create apps that are more intelligent, personalized, and agentic than ever before. This year, we introduced the latest advancements in on-device intelligence with a preview of Gemini Nano 4 for tasks like data extraction and summarization. We also expanded cloud capabilities via Firebase AI Logic, allowing developers to leverage Gemini models with robust grounding (including URL, Maps, and web search) to build smarter, more capable assistants. Furthermore, we unveiled our hybrid inference approach and the new &lt;a href="https://goo.gle/ADK_IO26"&gt;Agent Development Kit (ADK) for Android&lt;/a&gt;, alongside communication protocols like AG-UI and A2UI that simplify the creation of autonomous, agentic experiences. To start integrating these powerful features, explore the &lt;a href="https://developer.android.com/ai"&gt;developer documentation&lt;/a&gt;, and watch the technical deep dive session where we showcase all these technologies.

  &lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;6: Experiment with AppFunctions today&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  AppFunctions is an &lt;a href="https://developer.android.com/reference/android/app/appfunctions/package-summary"&gt;Android platform API&lt;/a&gt; with an accompanying &lt;a href="https://developer.android.com/jetpack/androidx/releases/appfunctions"&gt;Jetpack library&lt;/a&gt; to simplify building Android MCP integrations. It empowers your apps to behave like on device MCP servers, contributing functions that act as tools for use by agents and assistants. AppFunctions integration with Gemini is currently in a private preview with trusted testers, and you can begin preparing your apps already. You can sign up for the &lt;a href="http://goo.gle/eap-af"&gt;Early Access Program&lt;/a&gt; and start experimenting using the &lt;a href="http://d.android.com/ai/appfunctions"&gt;API guidance&lt;/a&gt;, &lt;a href="https://github.com/android/appfunctions"&gt;sample&lt;/a&gt;, and &lt;a href="https://github.com/android/skills/blob/main/device-ai/appfunctions/SKILL.md"&gt;skill&lt;/a&gt; today.

  &lt;h2 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: x-large;"&gt;The Future is Adaptive&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;

  &lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;7: Android is now Compose First; Views are now in maintenance mode.&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  Compose is our standard for UI development, and we are moving to a Compose-first approach for all future guidance and libraries. Building on five years of evolution, the latest releases deliver a more mature toolkit, from the highly customizable Styles API to refined shared element transitions and enhanced input support. These updates allow you to build beautiful, adaptive apps with less code and better performance. Learn more about what Compose-first means for Android Development in &lt;a href="http://android-developers.googleblog.com/2026/05/android-ui-development-is-compose-first.html"&gt;our blog post&lt;/a&gt;.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq9kh5gxOfSdY2w9ZeKdWropXpqP7rj4KtodIZA5B_j7ujQu-blrsQKKC0lI4VEsEycpLEwsZeJhHaNOY1Xe9DrIHDwVszYfQN0GQlwxz8xoVfg1oiIr9zNlUyqqdCl2M7pyHoHgVvC7omKRthmXNaO3GE5Q15XeZ1ALiugszd8qHxpWuHo2Eh79zYW4M/w640-h416/image5.png" /&gt;&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Build Android UI with Compose&lt;/i&gt;&lt;/div&gt;&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;8: Building seamless Android experiences across devices with Jetpack Compose&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;div style="text-align: left;"&gt;The Android ecosystem is now &lt;a href="https://goo.gle/AdaptiveApps_IO26"&gt;Adaptive by Default&lt;/a&gt;, moving fluidly across phones, foldables, tablets, cars, XR, and expanding usages with &lt;a href="https://developer.android.com/googlebook"&gt;Googlebook&lt;/a&gt; and connected displays. With over 580 million large-screen devices, and users on multiple devices spending up to 14x more on apps, the investment in adaptive design presents a massive opportunity. &lt;a href="https://developer.android.com/compose"&gt;Jetpack Compose&lt;/a&gt; is the definitive engine for this transition, offering core tools like our latest &lt;a href="http://goo.gle/nav3"&gt;Jetpack Navigation 3&lt;/a&gt; release, new experimental &lt;a href="https://developer.android.com/develop/ui/compose/layouts/adaptive/grid"&gt;Grid&lt;/a&gt; and &lt;a href="https://developer.android.com/develop/ui/compose/layouts/adaptive/flexbox"&gt;FlexBox&lt;/a&gt; layouts, enhanced non-touch input support, and &lt;a href="https://developer.android.com/media/camera/camerax"&gt;CameraX&lt;/a&gt; for correct camera previews across any window size. Furthermore, new &lt;a href="https://developer.android.com/tools/agents/android-skills"&gt;skills&lt;/a&gt; in Android Studio make updating your existing app to adopt these adaptive patterns easier than ever.

  &lt;img src="https://blogger.googleusercontent.com/img/a/AVvXsEi3DD3G6IUrmOwYh7bMq0uieBvGL8li2W48YnUfQfa3ZXy2kD7QvPorNfAyCSmFlBs4q0csXDqmZjhyGf8UHFE2pUNjvqxLaaJhmm6QpSBumq2YkMHI1jyiTNfh5WQhEEY9hP6vWhcbbwflygdTwYzoIdnuIqoht0S6iGKk4pVCnxL2wVXYBMBlcdeneD8" /&gt;&lt;i&gt;Notability’s Android debut sets a new standard for premium productivity apps. Built with Jetpack Compose, Navigation 3, and Kotlin Multiplatform, it delivers an intuitive, adaptive experience across devices.&lt;/i&gt;&lt;/div&gt;&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;9: Create seamless experiences for Googlebook&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  Last week we announced &lt;a href="https://developer.android.com/googlebook"&gt;Googlebook&lt;/a&gt;, a high-performance laptop that provides a large-screen canvas for your existing apps. Building with adaptive principles today helps ensure your app will work on Googlebook. Get started by reviewing relevant &lt;a href="https://developer.android.com/design/ui/desktop"&gt;design guidance&lt;/a&gt; and &lt;a href="https://developer.android.com/docs/quality-guidelines/adaptive-app-quality/experiences/desktop"&gt;developer guidelines&lt;/a&gt; for desktop experiences. Try out the new Desktop Emulator available in the Android Studio Canary to to test your apps for this form factor today.&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtH3cjiXICi8dNCtQTDV9PTyjt4wPQBl1xA9XGKGU6FmqLRuBm9YyH7HNQsydD6H6F2GIPw2TdUsFyeu2xMFUO2Jk36k5QXjuWNdm_VE8AQftq2w2m0RPFyYfyZjTppSOjzuOEpJMzF08t9V0YZr-xI7mu31uvcRItugwvVxPUBouSmOXt1MsqbB1WPC0/w640-h360/image3.png" /&gt;&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;New Desktop Android Emulator&lt;/i&gt;&lt;/div&gt;&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;10: Unified widget development experience with Jetpack Glance&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  Android 17 marks a shift toward a single, Compose-based development model for all widgets. By unifying the experience across mobile, Wear OS, and cars through Jetpack Glance, you can soon scale UI components across the ecosystem with a familiar workflow. &lt;br /&gt;&lt;br /&gt;The breakthrough this year is the integration of RemoteCompose. On mobile and cars, it powers high-fidelity animations, while on Wear OS, it allows Wear Widgets (formerly Tiles) to render complex UI logic natively on remote surfaces. This ensures peak performance on low-power hardware while allowing a cohesive user journey—like checking a flight status on your car dashboard and seeing gate change updates on your wrist.&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="line-height: 1.6; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA5s4g4hCW89qdeC2oqrTtxh6q7t9q3-wkOSt3tfVzCT3vhLUd1GMYJrhCjK04O2jyxBGl0R2pclnRq3Kb0f0Td-hV9aukKvZQTfGpGJS6GLK0MqUkpVW_0qiNC1eMGe6NPPhlCHrnQWFYhmbdSzpDnUHh5tjvpmUzZOvY2w_dX1LBnpNctSRmeahXUl4/w640-h320/blog_widgets.gif" /&gt;&lt;/div&gt;&lt;div style="line-height: 1.6; text-align: center;"&gt;&lt;i&gt;Four widgets are shown cycling through in the Android Auto interface. A clock, a contact card, Google Home favorites and a photo.&lt;/i&gt;&lt;/div&gt;&lt;div style="line-height: 1.6; text-align: center;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;strong style="color: #333333;"&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;11: Expand your reach on the road with Android for Cars&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;To help you expand your reach when you build in-car experiences, we're making it easier to build once and deliver your apps to Android Auto and Android Automotive OS. With the latest releases of the Car App Library, you can build customized, distraction-optimized&amp;nbsp;&lt;a href="https://developer.android.com/training/cars/apps/media"&gt;templated media apps&lt;/a&gt;&amp;nbsp;for both platforms. We're introducing new&amp;nbsp;&lt;a href="https://developer.android.com/design/ui/cars/guides/components/overview"&gt;components&lt;/a&gt;&amp;nbsp;and template capabilities to give you increased flexibility and more options for laying out content. Parked experiences are expanding too, with immersive video playback coming to Android Auto for phones running Android 17. You can easily adapt your video apps for these parked experiences;&amp;nbsp;&lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSf0z4Nfw8wrloVhlgHDpLgdkg4WXsFj9ni5c1pw0qTvJ3Q4fQ/viewform"&gt;apply now to the early access program&lt;/a&gt;&amp;nbsp;to publish in these beta categories and learn more about the latest updates in our&amp;nbsp;&lt;a href="http://android-developers.googleblog.com/2026/05/android-for-cars-unifying-platforms-premium-experiences.html"&gt;blog&lt;/a&gt;.&lt;h3 style="color: #333333;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;12: Accelerate your development with Android XR Developer Preview 4&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;Inspired by the innovative experiences you’ve built for the platform, we’re continuing to mature our tools with&amp;nbsp;&lt;a href="https://goo.gle/XRSDK_IO26"&gt;Developer Preview 4 of the Android XR SDK&lt;/a&gt;. A key milestone in this journey is the transition of our core libraries, XR Runtime, Jetpack SceneCore, and ARCore for Jetpack XR, moving to Beta soon to provide a more stable and performant foundation. We are also accelerating hardware access through the&amp;nbsp;&lt;a href="https://goo.gle/Catalyst_IO26"&gt;Android XR Developer Catalyst Program&lt;/a&gt;, where you can apply for XREAL’s Project Aura, audio glasses, or display glasses developer kits. Watch The latest in Android XR session or&amp;nbsp;&lt;a href="https://goo.gle/XRSDK_IO26"&gt;read our blog&lt;/a&gt;&amp;nbsp;to see how these updates help you build experiences across the ecosystem.&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyjbgGH7RwGkOkQLoXeLd88Vo7cXRjHLBSRokBWkzvYQUrqqbfrTXukM1u_SuGq0-AoXRPoGABpCOF-HMad4-aoNvXjTVyNXgGpbffTlSQMbTaXJva1c2GiUBx1fhC4fCCd0XO9XFzKNzs6edNqo0RAx-p2ZNXy0l-StJh7AxhyphenhyphenrXi-lqe-jXL0n8oprs/w640-h360/Aura%20Geospatial%20Tour%20Demo%20-%20Draft%2001%20(1).gif" /&gt;&lt;/div&gt;&lt;i&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Early preview of the Geospatial API  in ARCore for Jetpack XR, enabling high-precision anchoring of digital content to real-world locations.&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;13: Android is your new home for professional-grade media experiences&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  Android 17 streamlines the entire media lifecycle with a production-ready toolkit. High-fidelity capture is now simplified with the CameraXViewfinder Composable, which handles complex scaling and responsiveness on foldables and tablets. For post-production, the new Media3 AI Effects library provides a single interface for premium features like Magic Eraser and Studio Sound, automatically optimizing for the device's hardware. &lt;br /&gt;&lt;br /&gt;The pipeline is completed by CodecDB, offering chipset-specific encoding recommendations to eliminate export noise, and a new Scrubbing Mode in ExoPlayer for ultra-smooth seeking. Whether you’re compositing multi-asset edits with Media3 Transformer or using the streamlined CastPlayer API, these updates ensure a professional-grade experience with significantly less development overhead.&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXXvjrWhhRUXdYJyhuu-Vnf0UP2jKcYhAvUggZJi10kndrixZdx4cD8HEhrWVmavlxAUT5N025Fx1kgOLJP5w83LDUSR3E9YzfIJUuZ3WBedFSBtI_oLgIcxSOYg-s53obwX_8HtYqfxSaz95LVzSiMAdrrwgL4T6TVETwtxxkZV2mSkkAfvYA681zNlc/w640-h542/supercharge%20(1).gif" /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;Low Light Boost and Magic Eraser in action&lt;/i&gt;&lt;/div&gt;&lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;14: Increase app discovery and engagement on Google TV&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  Pointer remotes, which enable motion-controlled input, will be a future way for users to interact with Google TV as it unlocks faster user navigation. App developers can start &lt;a href="https://developer.android.com/training/tv/get-started/hardware#no-touchscreen"&gt;declaring support for pointing input&lt;/a&gt; to ensure their apps are discoverable on future TVs with pointer remotes. Additionally, the Engage SDK, formerly known as the Video Discovery API, optimizes Resumption, Entitlements, and Recommendations across all Google TV form factors to boost app discovery and engagement. It’s a great time to start onboarding the Engage SDK now, since the legacy Watch Next API, which has been powering your continue watching 1.0 experience, will lose support in the 2nd half of 2027. Get all the details in our &lt;a href="http://android-developers.googleblog.com/2026/05/increase-google-tv-app-discovery.html"&gt;blog&lt;/a&gt;.&lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;h3 style="color: #333333;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;15: Performance: the foundation of a great app experience&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;To help developers navigate memory limits in Android 17, we've launched a suite of optimization tools. The&amp;nbsp;&lt;a href="https://developer.android.com/r8-analyzer"&gt;R8 Configuration Analyzer&lt;/a&gt;&amp;nbsp;identifies keep rules that are bloating your binary, while&amp;nbsp;&lt;a href="https://developer.android.com/topic/performance/tracing/profiling-manager/how-to-capture"&gt;ProfilingManager&lt;/a&gt;&amp;nbsp;and the integrated LeakCanary in Android Studio streamline memory leak detection. Furthermore, the new&amp;nbsp;&lt;a href="https://developer.android.com/android-performance-analyzer"&gt;Android Performance Analyzer&lt;/a&gt;&amp;nbsp;offers advanced AI integration for complex trace analysis and automated SQL query generation to pinpoint performance bottlenecks.&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;h2 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: x-large;"&gt;And The Latest on Driving Business Growth&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;

  &lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;16: What’s new in Google Play&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;Today's &lt;a href="https://goo.gle/play-io26"&gt;updates from Google Play&lt;/a&gt; help expand your reach and scale your business with less complexity. We’re redefining Play Store discovery with an immersive, short-form video format called Play Shorts, while expanding your audience beyond the store with app discovery in the Gemini app on Android and web. Plus, we’re introducing powerful new capabilities like agentic catalog management for seamless bulk price and SKU updates, and using Gemini models to enable Play Console  to pre-populate store listings from imported documents—making global localization effortless. &lt;/div&gt;&lt;div style="line-height: 1.6;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOB1wGZNYGPgY0ED70X7Dtl2KiFk8kRH4fv3HrXXTWX0-xKkN4Em0mi8QAB0g2w_-4SNcTR4fJazpiQ7XI6-XKeyQniFhULKWNmV8YvyWMuQ9tosvT5ixZ0FOye27DI90R5Tra1eWX3FCX7OrWkgzhvhCD6vtfD8_6-FMfMWDvXoVv3zSTauZwraDGsM4/w640-h360/IO26_BlogInLine_App-discovery-in-Gemini_1920x1080_1605.gif" /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Gemini will provide users with app suggestions during a search&lt;/i&gt;&lt;/div&gt;

  &lt;h3 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: large;"&gt;17: And of course, Android 17&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
  Android 17 includes new performance &amp;amp; system architecture improvements (in addition to app memory limits) like a lock-free MessageQueue and a GC with more frequent, less intensive young-generation collections to ensure system-wide stability and smoother UIs. The new &lt;a href="https://developer.android.com/about/versions/17/features/contact-picker"&gt;contact picker&lt;/a&gt; and &lt;a href="https://developer.android.com/reference/android/content/Intent#ACTION_OPEN_EYE_DROPPER"&gt;eyedropper API&lt;/a&gt; help minimize the use of sensitive permissions and unnecessary access to user data. &lt;br /&gt;&lt;br /&gt;Review &lt;a href="https://developer.android.com/about/versions/17/behavior-changes-all"&gt;the behavior changes&lt;/a&gt; to make sure your app is ready for Android 17, including &lt;a href="https://developer.android.com/about/versions/17/behavior-changes-all#bg-audio"&gt;background audio hardening&lt;/a&gt; and &lt;a href="https://developer.android.com/about/versions/17/behavior-changes-all#sms-otp-all-apps"&gt;SMS OTP protection&lt;/a&gt;. Get ready to &lt;a href="https://developer.android.com/about/versions/17/behavior-changes-17"&gt;target Android 17&lt;/a&gt; (API 37) with changes such as mandatory large-screen resizability, certificate transparency by default, and restricted local network access. You can start testing today by enrolling your device &lt;a href="https://android-developers.googleblog.com/2026/04/the-fourth-beta-of-android-17.html"&gt;in the Beta&lt;/a&gt; or using the latest 17.0 emulator images. &lt;br /&gt;&lt;br /&gt;One more thing. the third beta of our Android 17 quarterly platform release (QPR1) just came out, and it contains a minor SDK release to support a few features that just couldn't wait for QPR2.

  &lt;h2 style="color: #333333; text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit; font-size: x-large;"&gt;Check out all of the Android &amp;amp; Play Content at Google I/O&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;
  &lt;p&gt;&lt;span face="sans-serif" style="color: #333333;"&gt;This was just a preview of some of the updates for Android developers at Google I/O. Tune into &lt;a href="https://io.google/2026/explore/pa-keynote-5"&gt;What’s New in Android&lt;/a&gt; for the latest news and announcements and &lt;a href="https://io.google/2026/"&gt;follow Google I/O&lt;/a&gt; for much more over the following week!&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/8004021755030502267/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/05/17-things-android-developers-google-io.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8004021755030502267" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/8004021755030502267" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/05/17-things-android-developers-google-io.html" rel="alternate" title="17 Things to know for Android developers at Google I/O" type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP7OJeCTRC-RN9j39-rULmU26qB-lZoyIZjjDrq07Z7b5GsfHz3q18ftSgcWReGBgIBkp03B6BVghzWllOC38o4jckzzq-e4a8R23ISeegev98zubhGXbIzhTZaqbCTaPLJC2zkxKYvvNspcM4yXkk94f6PEQHpdyMvlpwogicTWQRn3GEksJHOTQDIG4/s72-c/GoogleForDevelopers-AndroidText-StrapiMetacard-2048x1323.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6755709643044947179.post-164515295463367798</id><published>2026-05-19T05:45:00.000-07:00</published><updated>2026-05-19T11:08:14.540-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android app development"/><category scheme="http://www.blogger.com/atom/ns#" term="Android Emulator"/><category scheme="http://www.blogger.com/atom/ns#" term="Google AI Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="Jetpack Compose"/><category scheme="http://www.blogger.com/atom/ns#" term="Kotlin"/><category scheme="http://www.blogger.com/atom/ns#" term="Play Console"/><title type="text">Build native Android apps in Google AI Studio </title><content type="html">&lt;meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd6QUmqCnkvDT9M0IoWA6y_752MRk01nHVQOa644yYkgoMGMDk8Dy6ow6X4SqFzzODP-a1kRaNcuF-1ZyR_lk5fTfdbuEMKDvuX4s7LFaGNuMswzvMCFoYeaQ3RLf2OZPYUWN5BsnqRIsmDub85hpYZNGY7AsaHCsHlfkxLqfqm0PozMhkyqK4i6WfgGM/s2048/GoogleForDevelopers-AndroidCombo2-StrapiMetacard-2048x1323.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;/meta&gt;
&lt;img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd6QUmqCnkvDT9M0IoWA6y_752MRk01nHVQOa644yYkgoMGMDk8Dy6ow6X4SqFzzODP-a1kRaNcuF-1ZyR_lk5fTfdbuEMKDvuX4s7LFaGNuMswzvMCFoYeaQ3RLf2OZPYUWN5BsnqRIsmDub85hpYZNGY7AsaHCsHlfkxLqfqm0PozMhkyqK4i6WfgGM/s2048/GoogleForDevelopers-AndroidCombo2-StrapiMetacard-2048x1323.png" style="display: none;" /&gt;


&lt;div style="line-height: 1.5;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;Posted by Emma-Louise Leavey, Group Product Manager and Mike Taylor-Cai, Product Manager&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVwPsGVUMbwR9wQP6ABNBXOWboTfwBPXTg-WwhpVo-nJsWJkXeFMUdU5lPsXYc6jh4bnFwI03EG8fIYgmwEkU8hUKHNgSfSYpDLzUgEX1kGLGoTXXfzqcIsh6ZVOHLcripkRitSymdVGwC0Hnwm1H6S-LdsKXLdkefuPp5mtBWC5H1ACTICDI_fNqsdoc/s4209/GoogleForDevelopers-AndroidCombo2-Blogger-4209x1253.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVwPsGVUMbwR9wQP6ABNBXOWboTfwBPXTg-WwhpVo-nJsWJkXeFMUdU5lPsXYc6jh4bnFwI03EG8fIYgmwEkU8hUKHNgSfSYpDLzUgEX1kGLGoTXXfzqcIsh6ZVOHLcripkRitSymdVGwC0Hnwm1H6S-LdsKXLdkefuPp5mtBWC5H1ACTICDI_fNqsdoc/s16000/GoogleForDevelopers-AndroidCombo2-Blogger-4209x1253.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: black; font-family: sans-serif; font-weight: bold; padding: 10px 0px;"&gt;&lt;br /&gt;&lt;/div&gt;

    Starting today &lt;a href="https://ai.dev/apps?features=build_android_app"&gt;Google AI Studio&lt;/a&gt; can build entire Android apps for you in minutes from just a prompt. You don't need to install any software or configure any libraries, which significantly lowers the barrier to development. Whether you’re a seasoned developer looking to prototype at lightning speed or a creator building your first-ever mobile experience, you can now go from a single prompt to a high-quality, Kotlin-based Android app in AI Studio. You can easily install the app on your device, share it with others for testing, or send it to Android Studio for any further development.&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;h2 style="text-align: left;"&gt;The power of native Android&lt;/h2&gt;While AI has made it easy to generate web-based apps, people want more on their mobile devices. They expect the beautiful and usable modern app design and capabilities that come with native Android user experiences, built with the Kotlin programming language using Jetpack Compose, the official and recommended toolkit for Android development. Native Android apps bring the reliability of offline support, continuous background services, and the deep integration of hardware sensors like GPS, Bluetooth, and NFC. We've brought the technology that enables you to &lt;a href="https://developer.android.com/studio/gemini/create-a-new-project-with-ai"&gt;quickly create new projects with Gemini in Android Studio&lt;/a&gt; directly into the web-based AI Studio. Now, you get the best of both worlds: the ease of a prompt-based interface paired with the power of the Android SDK, all in your browser, no installation required.&lt;br /&gt;&lt;h2 style="color: black;"&gt;&lt;span style="font-family: inherit;"&gt;A seamless, end-to-end workflow&lt;/span&gt;&lt;/h2&gt;
    We have streamlined the entire development lifecycle so you can focus on your idea:&amp;nbsp;&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;b&gt;1. Create your app and iterate in the cloud:&lt;/b&gt; Use the embedded Android Emulator directly in your browser to preview and interact with your app as it’s being built. No heavy SDKs to download, no local setup required.&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWOTqLBbAXBibOw5wN_-49Q21RuGxwPjhQESK5r3KctKIPz1uV4dg0_LiK0w6xxdvbLECzMHzQk-kQO9h1VdflTPKi3wM9sKrwZvLcPbtISBnL2H4acnG8gpEuPtbxpDHexKi4S8Eg_hcQv1_dZOCh78pFGi27aiWHMYZc1gsDA_Iq7SRbVRUkHhngrgw/w640-h544/AI_Studio_creation_step_v2.gif" /&gt;&lt;/div&gt;&lt;i&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Use the embedded Android Emulator to create and edit Android Apps right in the web browser&lt;/i&gt;&lt;/div&gt;&lt;/i&gt;&lt;div style="line-height: 1.5;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;2.&lt;/b&gt; &lt;b&gt;Install instantly:&amp;nbsp;&lt;/b&gt;Connect your Android phone using a USB cable and install your app directly from AI Studio using the integrated Android Debug Bridge (adb).&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHMqfor305bPNhs_X2ahAxG8QmtpxtLKPrq44Uh4q1OpdsZyDlAuIyKJJDk-2v75-ErSLNp8yCyHQZn-6IQ-mkz8mfedEFtEJuD6VILIhtt8ypGpXmRuqM9LoJDDNnn-xrX3_Cr2MRUUcaEhVpJgCsjrjz-kwHHQeIhq8celQjg5Rt5_S5-j-_eSYpYaU/w640-h544/AI_Studio_Install_v2.gif" /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;Install the app on your Android device&lt;/i&gt;&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;3. Streamlined Publish to Google Play:&amp;nbsp;&lt;/b&gt;Using your &lt;a href="https://play.google.com/console/signup"&gt;Google Play developer account&lt;/a&gt;, you can now publish your app directly from AI Studio for testing. AI Studio will automatically create your app record, package the bundle, and upload it to an internal testing track in Google Play Developer Console. Your app is available for you to install within minutes, and you can automatically update your app on your device as you develop it further in AI Studio.&amp;nbsp;&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqGamXSrq6MNtz-PUt17netBXi_JiOMVERsoYV2mEArG8x5f-zCbU8WwTTaClpruCTsN4o3xeyMylDJLaWe0yCteqZJghc6sEXLYwoLPbTtnoa7761JVR_XEbm2Fj20IX142L2mGzU39vuNwLVVw0bDiSwICFelQZhxO63sG9N3GCo8Xx8wHY6gPEDj8c/w640-h544/AI_Studio_Play_v3.gif" /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;i&gt;Publish the app to an internal test track in Google Play&lt;/i&gt;&lt;/div&gt;

    &lt;br /&gt;&lt;div style="line-height: 1.5;"&gt;&lt;b&gt;Seamless app development handoff&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;As you iterate on your app in AI Studio, you may find you need more advanced Android tools or support for a wider variety of Android device types. To move beyond the browser, you can seamlessly hand off your project to &lt;a href="https://developer.android.com/studio"&gt;Android Studio&lt;/a&gt; by downloading a ZIP file or exporting it directly to GitHub.&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNTwSv8o6QwB9QYZS_OezD7WhWQZiShTEu5aJz6_oGUfOu-2RQWmANs0jgeC1G1jrsZauVbeWzLHkjoZa_Ai_cjKvgbB_-Qzqh8-obzcNf9zKTJSG4AfvXTogb0xsCxcHRS4P-LHFKk1pm8sTdDjIn8A5b9vX8GRRvHrCvN9_xoPm6hPzN1rct5Aph3Zc/w640-h206/AI_Studio_Download.png" /&gt;&lt;/div&gt;&lt;div style="line-height: 1.5; text-align: center;"&gt;&lt;span style="background-color: white;"&gt;&lt;i&gt;Download zip file of Android app project files&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="line-height: 1.5; text-align: center;"&gt;&lt;span style="background-color: white;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;When transitioning to a team environment or local development, you can leverage any IDE or agent you prefer. For a specialized experience, we recommend &lt;a href="https://developer.android.com/gemini-in-android"&gt;Gemini in Android Studio&lt;/a&gt;, which features models designed with Android in mind, or Antigravity, which integrates &lt;a href="https://developer.android.com/tools/agents/android-cli"&gt;Android CLI&lt;/a&gt; commands into Google’s agentic development platform. This workflow makes building high-quality apps more accessible while giving you total flexibility in how you use AI to scale your project.&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;h2 style="text-align: left;"&gt;Start building today&lt;/h2&gt;&lt;div style="line-height: 1.5;"&gt;To ensure a safe, high-quality ecosystem from day one, we have focused our initial release on specific capabilities including:&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Personal utilities and simple social apps: &lt;/b&gt;You can rapidly prototype single or multi-screen apps, such as habit trackers, study quizzes, or event itineraries.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Hardware-enabled experiences:&lt;/b&gt; Because you are building native apps, you can leverage device features like the Camera, GPS/Location, Accelerometer and Bluetooth using the native Android APIs, letting you optimize hardware-level performance.&lt;/li&gt;&lt;li&gt;&lt;b&gt;AI-powered experiences: &lt;/b&gt;You can create apps that feature Gemini API integrations, seamlessly embedding powerful AI capabilities directly into your mobile experience.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 style="color: black;"&gt;&lt;span style="font-family: inherit;"&gt;What’s Next?&lt;/span&gt;&lt;/h2&gt;
    &lt;div style="line-height: 1.5;"&gt;We are moving fast to expand what’s possible for creators in AI Studio. Here is a sneak peek at what is coming soon:&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Managing Google Play Test Tracks:&amp;nbsp;&lt;/b&gt;Coming soon, we will be adding the ability to invite testers to try your app directly from AI Studio.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Firebase integrations: &lt;/b&gt;Out-of-the-box support for Firestore, Firebase Auth, Firebase App Check and other tooling critical for Android developers is coming soon.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;Head over to &lt;a href="https://ai.dev/apps?features=build_android_app"&gt;Google AI Studio&lt;/a&gt; right now to start building. Here is some inspiration to get you started…&amp;nbsp;&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="1" style="border-collapse: collapse; color: black; font-family: sans-serif; margin-bottom: 20px; width: 100%;"&gt;
        &lt;tbody&gt;&lt;tr&gt;
            &lt;td colspan="2" style="padding: 10px;"&gt;Turn your Google Pixel Watch into an aviation assistant&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="padding: 10px; width: 60%;"&gt;
                &lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br /&gt;
                &lt;div style="color: #555555;"&gt;Build a small airplane "6-pack" instrument app for Google Pixel Watch. The 6 instruments should include attitude indicator, airspeed indicator, altimeter, turn coordinator, vertical speed indicator, and heading indicator. Use the Google Pixel Watch's sensors to power the instruments and display them clearly. Display one instrument at a time on the display. Swiping to the left or right should cycle through the instruments.&lt;/div&gt;
            &lt;/td&gt;
            &lt;td style="padding: 10px; text-align: center; width: 40%;"&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRi7_vRI0TgaUYUE-g6kX-Gbg5Vf8ZVNY0H5n-2p8Ml32hyphenhyphenFvWAjp5re6AWpFKHLv1-rokBy_qfXexN61uQ9bpeDE_1DKfTrY3CkepiZMkNIEC5UlvBYng_OqersnyVS5Nu_zCuJJQ2w4NBaxWDC8duVnC0ILvWEpeg49N7aoJh1z6o_-BJHfBCnZKpz0/s320/wearOS_ai_studio.gif" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;

    &lt;br /&gt;&lt;table border="1" style="border-collapse: collapse; color: black; font-family: sans-serif; margin-bottom: 20px; width: 100%;"&gt;
        &lt;tbody&gt;&lt;tr&gt;
            &lt;td colspan="2" style="padding: 10px;"&gt;Interactive Harmonium app on Google Pixel Fold&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="padding: 10px; width: 60%;"&gt;
                &lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br /&gt;
                &lt;div style="color: #555555;"&gt;Build a Harmonium app for Pixel Fold devices, which plays like the instrument based on the hinge angle and touch gestures. The app should simulate the bellows and reeds accurately.&lt;/div&gt;
            &lt;/td&gt;
            &lt;td style="padding: 10px; text-align: center; width: 40%;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8hUGuJaj76omAAgO2RqZKZ_qGvgThfE0tKA-99BJ82G2UOw8h1qT5H7sM5C7n_k2tN5CD0LpJyOFor3HefsKarRPmWTo35ltnDihv2MsddEUcZN5t5fgeJWuJ60Y3XCEqqLhd7gkGyAbM6vnGau0PLE8BohPat8lQ-63fQLudrFUVRVpkFUJ9wMFX1oc/w179-h200/Tiny%20Harmonica%20demo.gif" /&gt;&lt;/div&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;

    &lt;br /&gt;&lt;table border="1" style="border-collapse: collapse; color: black; font-family: sans-serif; margin-bottom: 20px; width: 100%;"&gt;
        &lt;tbody&gt;&lt;tr&gt;
            &lt;td colspan="2" style="padding: 10px;"&gt;An Android app for guitarists to become better musicians by jamming to backing tracks&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="padding: 10px; width: 60%;"&gt;
                &lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br /&gt;
                &lt;div&gt;&lt;div&gt;&lt;span style="color: #555555;"&gt;Build an Android guitar practice companion app that features a two-tab navigation system: 'Fretboard' and 'Library'.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #555555;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #555555;"&gt;The 'Fretboard' primary screen must contain an interactive guitar neck UI that visually maps out user-selected root notes, musical scales, and chords. Above the fretboard, implement a WebView-based YouTube player configured to play embedded videos inline. Additionally, include an AI generation feature that uses Retrofit to call Gemini Lyria 3 to create custom, 30-second backing tracks based on the user's currently selected key and scale. The generated audio files and their metadata must be saved locally using a database and displayed as a list in the 'Library' tab, where users can delete or play them.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #555555;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #555555;"&gt;Finally, implement a persistent, globally visible mini audio player at the bottom of the screen, complete with play/pause toggles, a progress slider for seeking, and timestamp text, allowing the user to seamlessly practice on the fretboard tab while listening to their tracks.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #555555;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;
            &lt;/td&gt;
            &lt;td style="padding: 10px; text-align: center; width: 40%;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2pWobL4G7-4deWwvMpRmtfHG1OuXyc_bHwq6fPszYT1Vztm4g_HaN28PVg6Hwd3_N2Qd82HS1QtpUGKCTUFiCuLBwMpcA-8sMC6dJtSDGKEVAaV1kxumYMZi3kTB9NnUIEf9xQPKyyfvKb8MZUyNGnYNAEHTxyHpWCEvN2xgQsj5X09LW_FHU1n0aJQg/w221-h400/guitar_app_AI_Studio.gif" /&gt;&lt;/div&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;

    We are looking forward to seeing what you build next!&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="line-height: 1.5;"&gt;Explore this announcement and all Google I/O 2026 updates on &lt;a href="https://io.google/2026/?utm_source=blogpost&amp;amp;utm_medium=pr&amp;amp;utm_campaign=devblogs&amp;amp;utm_content="&gt;io.google&lt;/a&gt;.&lt;/div&gt;</content><link href="http://android-developers.googleblog.com/feeds/164515295463367798/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/05/build-android-apps-google-ai-studio.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/164515295463367798" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/6755709643044947179/posts/default/164515295463367798" rel="self" type="application/atom+xml"/><link href="http://android-developers.googleblog.com/2026/05/build-android-apps-google-ai-studio.html" rel="alternate" title="Build native Android apps in Google AI Studio " type="text/html"/><author><name>Android Developers</name><uri>http://www.blogger.com/profile/08588467489110681140</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd6QUmqCnkvDT9M0IoWA6y_752MRk01nHVQOa644yYkgoMGMDk8Dy6ow6X4SqFzzODP-a1kRaNcuF-1ZyR_lk5fTfdbuEMKDvuX4s7LFaGNuMswzvMCFoYeaQ3RLf2OZPYUWN5BsnqRIsmDub85hpYZNGY7AsaHCsHlfkxLqfqm0PozMhkyqK4i6WfgGM/s72-c/GoogleForDevelopers-AndroidCombo2-StrapiMetacard-2048x1323.png" width="72"/><thr:total>0</thr:total></entry></feed>