Overview of Play Feature Delivery | Android Developers Platform Android Studio Google Play Jetpack Kotlin Docs Games English Bahasa Indonesia Español – América Latina Português – Brasil Tiếng Việt 中文 – 简体 中文 – 繁體 日本語 한국어 Sign in Documentation Overview Guides UI Guide Reference Samples Design & Quality Platform Android Studio Google Play Jetpack Kotlin Docs Overview Guides UI Guide Reference Samples Design & Quality Games App Basics Introduction Build your first app Overview Create an Android project Run your app Build a simple user interface Start another activity App fundamentals App resources Overview Handle configuration changes Localization Localize your app Test your app with pseudolocales Unicode and internationalization support Language and locale resolution Per-app language preferences Complex XML resources Resource types Overview Animation Color state list Drawable Layout Menu String Style Font More types App manifest file Overview <action> <activity> <activity-alias> <application> <category> <compatible-screens> <data> <grant-uri-permission> <instrumentation> <intent-filter> <manifest> <meta-data> <path-permission> <permission> <permission-group> <permission-tree> <profileable> <provider> <queries> <receiver> <service> <supports-gl-texture> <supports-screens> <uses-configuration> <uses-feature> <uses-library> <uses-native-library> <uses-permission> <uses-permission-sdk-23> <uses-sdk> Devices Device compatibility Overview Screen compatibility overview Enhanced letterboxing Support different pixel densities Declare restricted screen support Multiple APK support Overview Create multiple APKs for different API levels Create multiple APKs for different screen sizes Create multiple APKs for different GL textures Create multiple APKs with several dimensions Support different languages and cultures Support different platform versions Filters on Google Play Large screens — tablets, Chromebooks, foldables Get started with large screens Large screen ready Multi-window support Media projection Input compatibility on large screens Large screen optimized Support different screen sizes Migrate your UI to responsive layouts Navigation for responsive UIs Activity embedding Large screen differentiated Learn about foldables Make your app fold aware Test your app on foldables Large screen cookbook Wear Get started Principles of Wear OS development Upgrade to the latest version of Wear OS Wear OS versus mobile development Wear OS user interface Getting started Wear OS developer pathway Create and run a wearable app Debug a Wear OS app Capture Wear UI screenshots Overlays Overview Standalone apps Authentication Request permissions Detect location Playing audio on wearables Appear in Recents and App Resume Building UI with Compose Use Jetpack Compose on Wear OS Compose performance Navigation Buttons Cards Chips Dialogs Lists Page indicators Pickers Position indicator Progress indicator Sliders Steppers Swipe to dismiss Toggle chips Time text Building UI with Views Build View-based UIs on Wear OS Handle different watch shapes Screen options Create lists Navigation Exit full screen activities on Wear Show confirmations Keep your app visible on Wear Tiles and complications Tiles overview Get started with tiles Update tiles Interact with tiles Watch face complications Expose data to complications Notifications Notifications on Wear OS Bridging options for notifications Ongoing Activities Handling data Send and sync data on Wear OS Network access and sync on Wear OS Access the Wearable Data Layer Transfer assets Send and receive messages Handle data layer events Sync data items with the Data Layer API User input Physical buttons Rotary input Create input method editors in Wear Voice Health services Overview Active data and exercise Passive data updates Use synthetic data providers Enhance app compatibility Design Design principles Getting started Interaction types Screen shapes Notifications Complications Tiles Tiles design system Overlays Ongoing activities Confirmation overlay Disconnection indicators Permission messages Selection controls Launch and latency Navigation Permissions Sign in Hardware buttons Color Typography Icons Downloads Wear Material Theming Creating watch faces Overview Design watch faces Build a watch face service Draw watch faces Adding complications to a watch face Creating interactive watch faces Provide configuration activities Address common issues Improve performace with hardware acceleration Optimize performance and battery life Watch Face Studio Watch Face Studio Keyboard shortcuts Manage a Watch Face Studio project Create a watch face with Watch Face Studio Build complications in Watch Face Studio Tag expressions Language settings Always-on in Watch Face Studio Gyro effects Build and upload from Watch Face Studio Test your watch face FAQ Wear app quality Package Wear OS apps Distribute to Wear OS Create Wear OS apps for China Wear OS release notes Android TV Overview Build TV Apps Overview Get started with TV apps AndroidX TV libraries Handle TV hardware Manage TV controllers Build TV layouts On-screen keyboard Create TV navigation Best practices for driving engagement on Google TV Build TV playback apps Overview UI guidance & Leanback API Create a catalog browser Provide a card view Build a details view Use transport controls Playback controls on TV Ambient mode Add a guided step Introduce first-time users to your app Implement a media session Background playback in a Now Playing card Audio capabilities Match content frame rate Help users find content on TV Overview Recommend TV content Overview Channels on the home screen Video program attributes Audio program attributes Game program attributes Watch Next Add programs Attributes Guidelines for app developers Guidelines for TV providers Preview videos Recommendations in Android N and earlier Make TV apps searchable Search within TV Apps Build TV games Overview Use Stream Protect for latency-sensitive streaming apps Build TV input services Overview Develop a TV input service Work with channel data Manage TV user interaction Support time-shifting Support content recording TV Apps checklist TV Accessibility Accessibility best practices TalkBack evaluation examples Adopt system caption settings Custom view accessibility support Custom view accessibility sample Releases Android 12 for TV Android 13 for TV (Beta) Overview What's new for TV Android for Cars Overview Build media apps for cars Build media apps for cars Add support for Android Auto Add support for Android Automotive OS Build messaging apps for Android Auto Build navigation and point of interest apps for cars Using the Android for Cars App Library Build point of interest apps for cars Build navigation apps for cars Add support for Android Auto Add support for Android Automotive OS Build video apps for Android Automotive OS Test Android apps for cars Distribute Android apps for cars Google Play services for cars Notifications on Android Automotive OS Chrome OS devices Overview Building apps for Chrome OS Optimizing Apps for Chrome OS Preparing your development environment App Manifest Compatibility for Chromebooks Chrome OS Device Support for Apps App Rendering Differences on Chromebooks Window management Adapting Games on Chrome OS Smooth animation on Chrome OS Test Cases for Android Apps on Chrome OS App architecture Introduction Guide to app architecture Overview UI layer Overview UI events State holders and UI state Domain layer Data layer Overview Offline first Learning pathway Modularization Overview Common patterns Recipes Navigation Architecture Components UI layer libraries View binding Overview Migrate from Kotlin synthetics to view binding Data binding library Overview Get started Layouts and binding expressions Work with observable data objects Generated binding classes Binding adapters Bind layout views to Architecture Components Two-way data binding Lifecycle-aware components Handle lifecycles ViewModel LiveData Save UI states Saved State module for ViewModel Use Kotlin coroutines with lifecycle-aware components Paging Library Overview Load and display paged data Page from network and database Transform data streams Manage and present loading states Test your Paging implementation Migrate to Paging 3 Paging 2 Overview Display paged lists Load paged data Data layer libraries DataStore WorkManager Overview Getting Started How-To Guides Defining your WorkRequests Work states Managing work Observing intermediate Worker progress Chaining work together Testing Worker implementation Integration tests with WorkManager Debugging WorkManager Advanced Concepts Configuration and Initialization Threading in WorkManager Overview Threading in Worker Threading in CoroutineWorker Threading in RxWorker Threading in ListenableWorker Support for long-running workers Migrating from Firebase JobDispatcher Migrating from GCMNetworkManager App entry points Activities Introduction to activities The activity lifecycle Activity state changes Test your app's activities Tasks and the back stack Processes and app lifecycle Parcelables and bundles Loaders Recents screen Restrictions on starting activities from the background App shortcuts Overview Create shortcuts Add capabilities Manage shortcuts Best practices for shortcuts App navigation Principles of navigation Design for different form factors Handle configuration changes Navigation component Overview Getting started Create destinations Design navigation graphs Nested graphs Global actions Navigate to a destination Support multiple back stacks Conditional navigation Pass data between destinations Create a deep link for a destination Animate transitions between destinations Update UI components with NavigationUI Kotlin DSL Interact programmatically Navigate with feature modules Best practices for multi-module projects Test navigation Add new destination types Migrate to the Navigation component Fragments Overview Create a fragment Fragment manager Fragment transactions Animate transitions between fragments Fragment lifecycle Saving state with fragments Communicate with fragments Working with the app bar Displaying dialogs with DialogFragment Debug your fragments Test your fragments App links Overview Enabling links to app content Verify app links Create app links for instant apps Create swipe views with tabs using ViewPager Create swipe views with tabs using ViewPager2 Add support for back navigation Custom back navigation Predictive back gesture Dependency injection Overview Manual dependency injection Dependency injection with Hilt Hilt in multi-module apps Use Hilt with other Jetpack libraries Hilt testing guide Hilt and Dagger annotations cheat sheet Dagger Dagger basics Using Dagger in Android apps Using Dagger in multi-module apps App Startup User interfaces Build Android user interfaces Create backward-compatible UIs Overview Abstracting the new APIs Proxying to the new APIs Creating an implementation with older APIs Using the version-aware component Core topics App compatibility Overview Compatibility framework tools Restrictions on non-SDK interfaces Interact with other apps Overview Sending the user to another app Getting a result from an activity Allowing other apps to start your activity Package visibility Overview Know which packages are visible automatically Declare package visibility needs Fulfill common use cases Test package visibility Intents and intent filters Overview Common intents Audio & video Audio & video overview Media3 Overview Getting started Use a media session to manage playback Play media in the background ExoPlayer ExoPlayer and Media3 ExoPlayer to Media3 mappings Migration guide Media controls Supported media formats Media codecs Media app architecture Media app architecture overview Using a media session Building an audio app Audio app overview Building a media browser service Building a media browser client Media session callbacks Using the media controller test app Building a video app Video app overview Building a video player activity Media session callbacks Compatible media transcoding Responding to media buttons Handling changes in audio output Manage audio focus The Google Assistant The Google Assistant and media apps Media apps on Google Assistant driving mode Routing between devices Routing overview MediaRouter overview MediaRouteProvider overview Control amplitude with VolumeShaper MediaPlayer overview MediaRecorder overview ExoPlayer Sharing audio input Capture video and audio playback Frame rate Best practices for sharing video Additional Resources for Media Services Overview Foreground services Bound services AIDL overview Background tasks Overview Background threads Background optimizations Broadcasts Overview Implicit Broadcast Exceptions Manage device awake state Overview Keep the device awake Schedule alarms Using a ListenableFuture Permissions Overview Evaluate whether your app needs permissions Declare app permissions Request app permissions Explain access to more sensitive information App permissions best practices Permissions used only in default handlers Restrict interactions with other apps Define custom permissions App data & files Overview Storage overview Save to app-specific storage Save to shared storage Overview Media Photo picker Documents and other files Datasets Manage all files on a storage device Save key-value data Save data in a local database Overview Define data using entities Access data using DAOs Define relationships between objects Write asynchronous DAO queries Create views into a database Prepopulate your database Migrate your database Test and debug your database Reference complex data Migrate from SQLite to Room Save data using SQLite Storage use cases and best practices Sharing simple data Overview Sending simple data to other apps Receiving simple data from other apps Sharing files Overview Setting up file sharing Sharing a file Requesting a shared file Retrieving file information Sharing files with NFC Overview Sending files to another device Receiving files from another device Printing files Overview Printing photos Printing HTML documents Printing custom documents Content providers Overview Content provider basics Creating a content provider Open files using storage access framework Create a custom document provider App install location User data & identity Overview Add sign-in workflow Show a biometric authentication dialog Autofill framework Overview Optimize your app for autofill Build autofill services Integrate autofill with keyboards Identify developer-owned apps Review how your app collects and shares user data Audit data access Get a user-resettable advertising ID Calendar provider overview Contacts provider Overview Retrieving a list of contacts Retrieving details for a contact Modifying contacts using intents Displaying the quick contact badge Account transfer Data backup Overview Back up user data Back up key-value pairs Test backup and restore Best practices for unique identifiers Remember and authenticate users Overview Remember your user Authenticate to OAuth2 services Create a custom account type User location Overview Request location permissions Get the last known location Change location settings Request location updates Access location in the background Create and monitor geofences Detect when users start an activity Optimize location for battery Test location workflows Migrate to location and context APIs Add maps Camera Camera basics Choose a camera library CameraX Overview Architecture Configuration Use cases Preview Image capture Image analysis Video capture Advanced topics Extensions API Transform output Rotations Devices Camera2 Overview Camera capture sessions and requests Camera lenses and capabilities Use multiple camera streams simultaneously Camera preview HDR video capture Multi-Camera API Extensions API Camera (deprecated) Overview Take photos Record videos Control the camera Camera API Sensors Overview Sensors overview Motion sensors Position sensors Environment sensors Raw GNSS measurements Connectivity Overview Cross device SDK Overview Get started Device discovery API Secure connection API Sessions API Test and debug API Reference Performing network operations Overview Connect to the network Manage network usage Reading network state Optimize network access Optimize network data usage Monitor connectivity status and connection metering Parse XML data Perform network operations using Cronet Overview Send a simple request Cronet request lifecycle Use Cronet with other libraries Reference org.chromium.net Overview CallbackException CronetEngine Overview CronetEngine.Builder Overview LibraryLoader CronetException InlineExecutionProhibitedException NetworkException QuicException UploadDataProvider UploadDataProviders UploadDataSink UrlRequest Overview Builder Callback Status StatusListener UrlResponseInfo Overview HeaderBlock Enhance your apps with 5G Build client-server applications with gRPC Transferring data without draining the battery Overview Optimize downloads for efficient network access Minimize the effect of regular updates Avoid unoptimized downloads Reduce network battery drain Overview Collecting network traffic data Analyzing data traffic Optimize network access Optimize user-initiated network use Optimize app-initiated network use Optimize server-initiated network use Optimizing general network use Transfer data using Sync Adapters Overview Create a Stub Authenticator Create a Stub Content Provider Create a Sync Adapter Run a Sync Adapter Bluetooth Overview Set up Bluetooth Find Bluetooth devices Connect Bluetooth devices Transfer Bluetooth data Bluetooth permissions Bluetooth profiles Companion device pairing Bluetooth Low Energy Overview Find BLE devices Connect to a GATT server Transfer BLE data NFC Overview NFC basics Advanced NFC Host-based card emulation overview Telecom Overview Build a calling app Prevent caller ID spoofing Telephony IDs Wi-Fi Request permission to access nearby Wi-Fi devices Wi-Fi scanning overview Wi-Fi peer-to-peer Wi-Fi Aware overview Wi-Fi location with RTT Local-only hotspot Discover and connect Overview Use network service discovery Create P2P connections with Wi-Fi Direct Use Wi-Fi Direct for service discovery Wi-Fi Easy Connect Wi-Fi infrastructure Wi-Fi infrastructure overview Wi-Fi suggestion API for internet connectivity Wi-Fi Network Request API for peer-to-peer connectivity Passpoint Save networks and Passpoint configurations USB Overview Accessory overview Host overview UWB VPN Session initiation protocol overview Open Mobile API reader support Renderscript Overview Advanced RenderScript Migrate from RenderScript Runtime API reference Overview Numerical types Object types Conversion functions Mathematical constants and functions Vector math functions Matrix functions Quaternion functions Atomic update functions Time functions and types Allocation data access functions Object characteristics functions Kernel invocation functions and types Input/output functions Debugging functions Graphics functions and types Index Web-based content Overview Building web apps in WebView Managing WebView objects Load local content Darken web content User privacy in WebView reporting Supporting different screens in web apps Debugging web apps Best practices for web apps Testing against future versions of WebView Android App Bundles Overview Configure the base module Build and test your app bundle Add code transparency The app bundle format Frequently asked questions Google Play Google Play Billing Google Play Core libraries Play Points Overview Create products and promotions Detect and deliver products Test products Play Asset Delivery Overview Integrate asset delivery (Kotlin & Java) Integrate asset delivery (native) Integrate asset delivery (Unity) Target texture compression formats Test asset delivery Play Feature Delivery Overview Configure install-time delivery Configure conditional delivery Configure on-demand delivery On-demand delivery best practices Configure instant delivery Additional resources In-app reviews Overview Integrate using Kotlin or Java Integrate using native code Integrate using Unity Test in-app reviews In-app updates Overview Support in-app updates (Kotlin or Java) Support in-app updates (Native) Support in-app updates (Unity) Test in-app updates Google Play Instant Overview of Google Play Instant Get started with instant apps Create an instant-enabled app bundle UX best practices for apps Get started with instant games Overview Unity plugin UX best practices for games Migrate to Android App Bundles Implement cloud delivery of assets Support Google Play Games Services Instant Play games Instant Play games checklist Reduce the size of your instant app or game Add ads to your instant app or game Provide multiple entry points Integrate with Firebase Add Google Analytics for Firebase to your instant app Use Firebase Dynamic Links with instant apps Technical requirements checklist Google Play Instant policy Resources Reference Code samples SDK release notes Instant App Intents Support Known issues StackOverflow Play Developer APIs Play Install Referrer Overview Play Install Referrer Library Overview Reference Release notes Play Install Referrer API Play Integrity API Play Requirements Play Policies Target API Level Support 64-bit architectures Application Licensing Overview Licensing Overview Setting Up for Licensing Adding Server-Side Verification Adding Client-Side Verification Licensing Reference APK Expansion Files Google Assistant Overview Build App Actions overview Implement built-in intents Create shortcuts.xml Push dynamic shortcuts to Assistant Release notes Test Google Assistant plugin Grow Overview In-App Shortcut Promo SDK Add more features Custom intents Android widgets Foreground app invocation Inline inventory Web inventory Assistant sharing Read It Actions.xml Actions.xml migration guide Actions.xml overview Build App Actions Create actions.xml Web inventory App Actions test tool Android Slices Troubleshooting Support On-device search Games Design Overview Support gaming devices 64-bit architectures Screen types Vulkan pre-rotation 3D asset design Vertex data management Implement Overview Use a game engine Overview Develop with Defold Install and configure projects for Android Support multiple form factors and screen sizes Export to Android Develop with Godot Install and configure projects for Android Godot renderer options Support multiple form factors and screen sizes Export to Android Develop with Unity Overview Create an Android App Bundle with Unity Integrate Play Asset Delivery Unity Lighting in Mobile Games Use Android Performance Tuner Overview Enable the API Integrate the plugin Initialize the library and verify operation Define annotations, fidelity parameters, and quality levels Add loading time recording functions Include Addressables scenes Run the monitor app Review and publish Troubleshoot common errors Reference Symbolicate Android crashes and ANR for Unity games Develop with Unreal Requesting user permissions Secure your game Create or extend a game engine Overview Getting started Integrate GameActivity Overview Get started Use game text input Migrate from NativeActiviy Configure graphics Understand Android game loops Process input events Add touch support Support text input Support game controllers Overview Use the game controller library Use custom controller device mappings Add mouse support Support sensor input Achieve proper frame pacing Overview Frame pacing in OpenGL ES Integrate Update your build settings Add frame pacing functions Verify frame pacing improvement Frame pacing in Vulkan Integrate Update your build settings Add frame pacing functions Verify frame pacing improvement Reference Integrate Android Performance Tuner Overview Run the demo app Enable the API Update your build settings Define annotations, fidelity parameters, and settings Add frame timing functions Add loading time recording functions Validate, package, and publish the APK Troubleshoot common errors Advanced usage Reference Output audio Overview Update build settings Use Oboe Code samples Full Oboe guide Manage memory Overview Debug native memory use Deliver assets Detect and diagnose crashes Android Game Development Kit (AGDK) Overview Download Release notes Android Game Development Extension for Visual Studio Overview Quickstart Configure a project Debugger Measure app performance Modify build.gradle files for Android Studio Samples Release notes Android Studio tasks Optimize Overview Best practices Reduce game size Android GPU Inspector Overview Quickstart Supported devices System profiling Overview View a system profile GPU performance counters Analyze a system profile Frame processing times Memory efficiency Texture memory bandwidth usage Vertex memory bandwidth usage Thread scheduling Frame profiling Overview Analyze a frame profile Most expensive render passes Vertex formats Shader performance Frame Profiler UI Performance pane Commands pane Framebuffer pane Geometry pane Report pane Shader pane Memory pane State pane Textures pane Texture pane Pipeline view pane Supported Vulkan extensions Troubleshoot Android Performance Tuner Manage thermal and CPU performance Memory Advice API Overview Get started Game Mode Overview Optimize with Game Mode API Game Mode interventions Deliver Overview Google Play Games Services Overview Get started Downloads Setup Play Console Set up Play Games Services Enable features Cloud project management Publish Manage features Achievements Leaderboards Events Saved games Friends Sign-in Use the APIs Android Get started Sign-in Enable server-side access Anti-piracy Add features Achievements Leaderboards Friends Saved games Events Player stats Troubleshooting Unity Overview Get started Add features Achievements Leaderboards Saved games Events Friends Player stats C API - coming soon Publishing API Overview Get started Upload images Management API Requirements and guidelines Quality checklist Branding guidelines Quota and rate limits Data disclosure requirements Terms of service Support Google Play Games for PC Overview Get started Set up your game PC compatibility Graphics configuration Device input Set up input Mouse input Input SDK Overview Quickstart Continuity Overview Continuity requirements Verifying requirements Existing identity solutions Use the emulator Test on Chrome OS Publish and deploy Package Submit Update Integrity Protection FAQ Play as you Download Overview Best practices Health & fitness apps Health Connect Introduction Platform overview Architecture Developer functionality Get started Data and data types Introduction Data types Differential changes API Common workflows Write data Read data Delete data Aggregate data Work with sessions Exceptions Frequently asked questions Health Connect guidelines Health Connect policy requirement FAQs UX developer guidance Migrate Health Connect API comparison guide Fit Android API to Health Connect migration guide Best practices Testing Test apps on Android Fundamentals Fundamentals of testing Android apps What to test in Android Using test doubles in Android Local tests Build local tests Instrumented tests Build instrumented tests Automate UI tests AndroidX test libraries Set up project for AndroidX Test JUnit4 rules with AndroidX Test AndroidJUnitRunner Espresso Espresso Espresso basics Espresso setup instructions Espresso cheat sheet Espresso idling resources Espresso-Intents Espresso lists Multiprocess Espresso Espresso recipes Espresso Web Accessibility checking Additional Resources for Espresso Testing other components Test content providers Test your service Write automated tests with UI Automator Performance Overview Inspecting performance Overview Android Studio Profilers Profiling and tracing System tracing Overview Capture trace Capture a trace in Android Studio Capture a trace on a device Capture a trace from the command line Navigate a report Custom events Define custom events Custom trace events in native code Inspect GPU rendering Benchmarking Overview Macrobenchmark Writing a benchmark Capture the metrics Control your app Adding instrumentation arguments Microbenchmark Overview Writing a benchmark Profiling a benchmark Adding instrumentation arguments Building without Gradle Benchmarking in CI Measure performance Overview Examples Improving performance Overview Baseline Profiles App startup library Guides Working in the background Performance class App Standby Buckets App Hibernation Verifying App Behavior on the Android Runtime (ART) Solving common problems App Startup Rendering Overview Reducing overdraw Performance and view hierarchies Analyzing with profile GPU rendering Slow rendering Keeping your app responsive Improving layout performance Memory Overview of memory management Memory allocation among properties Manage your app's memory Processes and threads Battery and power Optimize for doze and app standby Monitor the battery level and charging state Monitor connectivity status and connection metering Determing and monitor docking state and type Profile battery usage with Batterystats and Battery Historian Analyze power use with Battery Historian Test power-related issues Background optimizations Reduce app size Hardware acceleration Monitoring performance Overview Android Vitals Overview Stuck Partial Wake Locks Excessive Wakeups Excessive Background Wi-Fi Scans Excessive Background Network Usage ANRs Crashes Slow Rendering Frozen Frames Permission Denials App Startup Time JankStats library Accessibility Overview Build and test apps for accessibility Make apps more accessible Principles for improving app accessibility Test your app's accessibility Advanced topics Make custom views more accessible Create your own accessibility service Additional resources Privacy Privacy best practices Security App security best practices Security tips Security with data Security with data across additional Android versions Security with HTTPS and SSL Network security configuration Updating your security provider to protect against SSL exploits Protecting against security threats with SafetyNet Overview SafetyNet Attestation API Discontinuing SafetyNet Attestation Play Integrity API SafetyNet Safe Browsing API SafetyNet reCAPTCHA API SafetyNet Verify Apps API Cryptography Android Keystore System Verifying hardware-backed key pairs with key attestation Android Protected Confirmation Supporting Direct Boot Running embedded DEX code App security improvement program SDKs SDK best practices Build for Billions Overview Connectivity Device capability Data cost Battery consumption UI and content Build for Enterprise Overview Developer guide Work profiles Set up managed configurations App feedback Send app feedback to EMMs Test app feedback Work contacts Device management policies Device management Overview Build a device policy controller Dedicated devices Overview Lock task mode Multiple users Cookbook Device control Networking and telephony Security System updates Network activity logging Android versions Overview Android 13 Android 12 Android 11 Android 10 Android 9 Android 8.0 Android 7.0 Device administration Android Developers Docs Guides Overview of Play Feature Delivery Stay organized with collections Save and categorize content based on your preferences. Google Play’s app serving model uses Android App Bundles to generate and serve optimized APKs for each user’s device configuration, so users download only the code and resources they need to run your app. Play Feature Delivery uses advanced capabilities of app bundles, allowing certain features of your app to be delivered conditionally or downloaded on demand. To do that, first you need to separate these features from your base app into feature modules. Feature module build configuration When you create a new feature module using Android Studio, the IDE applies the following Gradle plugin to the module’s build.gradle file. // The following applies the dynamic-feature plugin to your feature module. // The plugin includes the Gradle tasks and properties required to configure and build // an app bundle that includes your feature module.