CINXE.COM
Configure build variants | Android Studio | Android Developers
<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="721724668570-nbkv1cfusk7kk4eni4pjvepaus73b13t.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award"> <meta property="og:site_name" content="Android Developers"> <meta property="og:type" content="website"><meta name="theme-color" content="#34a853"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/android/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400,500,600,700|Google+Sans+Text:400,400italic,500,500italic,600,600italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/css/app.css"> <link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/css/dark-theme.css" disabled> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/images/favicon.svg"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/images/touchicon-180.png"><link rel="canonical" href="https://developer.android.com/build/build-variants"><link rel="search" type="application/opensearchdescription+xml" title="Android Developers" href="https://developer.android.com/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://developer.android.com/build/build-variants" /><link rel="alternate" hreflang="x-default" href="https://developer.android.com/build/build-variants" /><link rel="alternate" hreflang="ar" href="https://developer.android.com/build/build-variants?hl=ar" /><link rel="alternate" hreflang="bn" href="https://developer.android.com/build/build-variants?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://developer.android.com/build/build-variants?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://developer.android.com/build/build-variants?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://developer.android.com/build/build-variants?hl=fa" /><link rel="alternate" hreflang="fr" href="https://developer.android.com/build/build-variants?hl=fr" /><link rel="alternate" hreflang="de" href="https://developer.android.com/build/build-variants?hl=de" /><link rel="alternate" hreflang="he" href="https://developer.android.com/build/build-variants?hl=he" /><link rel="alternate" hreflang="hi" href="https://developer.android.com/build/build-variants?hl=hi" /><link rel="alternate" hreflang="id" href="https://developer.android.com/build/build-variants?hl=id" /><link rel="alternate" hreflang="it" href="https://developer.android.com/build/build-variants?hl=it" /><link rel="alternate" hreflang="ja" href="https://developer.android.com/build/build-variants?hl=ja" /><link rel="alternate" hreflang="ko" href="https://developer.android.com/build/build-variants?hl=ko" /><link rel="alternate" hreflang="pl" href="https://developer.android.com/build/build-variants?hl=pl" /><link rel="alternate" hreflang="pt-BR" href="https://developer.android.com/build/build-variants?hl=pt-br" /><link rel="alternate" hreflang="ru" href="https://developer.android.com/build/build-variants?hl=ru" /><link rel="alternate" hreflang="es-419" href="https://developer.android.com/build/build-variants?hl=es-419" /><link rel="alternate" hreflang="th" href="https://developer.android.com/build/build-variants?hl=th" /><link rel="alternate" hreflang="tr" href="https://developer.android.com/build/build-variants?hl=tr" /><link rel="alternate" hreflang="vi" href="https://developer.android.com/build/build-variants?hl=vi" /><title>Configure build variants | Android Studio | Android Developers</title> <meta property="og:title" content="Configure build variants | Android Studio | Android Developers"><meta name="description" content="Find out how you can configure build variants to create different versions of your app from a single project."> <meta property="og:description" content="Find out how you can configure build variants to create different versions of your app from a single project."><meta property="og:url" content="https://developer.android.com/build/build-variants"><meta property="og:image" content="https://developer.android.com/static/images/social/android-developers.png"> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="675"><meta property="og:locale" content="en"><meta name="twitter:card" content="summary_large_image"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Configure build variants" } </script><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Android Studio", "item": "https://developer.android.com/studio" },{ "@type": "ListItem", "position": 2, "name": "Configure build variants", "item": "https://developer.android.com/build/build-variants" }] } </script> <link rel="stylesheet" href="/extras.css"></head> <body class="" template="page" theme="android-theme" type="article" appearance layout="docs" display-toc pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <a href="#main-content" class="skip-link button"> Skip to main content </a> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner nocontent"> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="androidDevelopers" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/images/lockup-dark-theme.svg" media="(prefers-color-scheme: dark)" class="devsite-dark-theme" alt="Android Developers"> <img src="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/images/lockup.svg" class="devsite-site-logo" alt="Android Developers"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> <devsite-tabs class="upper-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Upper tabs"> <tab class="devsite-dropdown devsite-dropdown-full "> <a href="https://developer.android.com/get-started" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-metadata-eventdetail="https://developer.android.com/get-started" track-type="nav" track-metadata-position="nav - essentials" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" > Essentials </a> <button aria-haspopup="menu" aria-expanded="false" aria-label="Dropdown menu for Essentials" track-type="nav" track-metadata-eventdetail="https://developer.android.com/get-started" track-metadata-position="nav - essentials" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown android-dropdown-primary android-dropdown-studio"> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Gemini in Android Studio</li> <li class="devsite-nav-description">Your AI development companion for Android development. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/gemini-in-android" track-type="nav" track-metadata-eventdetail="https://developer.android.com/gemini-in-android" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="gemini in android studio" tooltip class="button button-primary" > <div class="devsite-nav-item-title"> Learn more </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="gemini in android studio" tooltip class="button button-white" > <div class="devsite-nav-item-title"> Get Android Studio </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-launch"> <li class="devsite-nav-title" role="heading" tooltip>Get started</li> <li class="devsite-nav-description">Start by creating your first app. Go deeper with our training courses or explore app development on your own. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/get-started/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/get-started/overview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Hello world </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/courses" track-type="nav" track-metadata-eventdetail="https://developer.android.com/courses" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Training courses </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/get-started/codelabs" track-type="nav" track-metadata-eventdetail="https://developer.android.com/get-started/codelabs" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Tutorials </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/ui/compose/adopt" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/ui/compose/adopt" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Compose for teams </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/kotlin" track-type="nav" track-metadata-eventdetail="https://developer.android.com/kotlin" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Kotlin for Android </div> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/console/about/guides/monetize/" track-type="nav" track-metadata-eventdetail="https://play.google.com/console/about/guides/monetize/" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Monetization with Play ↗️ </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-multiple-screens"> <li class="devsite-nav-title" role="heading" tooltip>Extend by device</li> <li class="devsite-nav-description">Build apps that give your users seamless experiences from phones to tablets, watches, headsets, and more. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/adaptive-apps" track-type="nav" track-metadata-eventdetail="https://developer.android.com/adaptive-apps" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Adaptive apps </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/xr" track-type="nav" track-metadata-eventdetail="https://developer.android.com/xr" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Android XR </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/wear" track-type="nav" track-metadata-eventdetail="https://developer.android.com/wear" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/cars" track-type="nav" track-metadata-eventdetail="https://developer.android.com/cars" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Android for Cars </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/tv" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/chrome-os" track-type="nav" track-metadata-eventdetail="https://developer.android.com/chrome-os" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> ChromeOS </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-platform"> <li class="devsite-nav-title" role="heading" tooltip>Build by category</li> <li class="devsite-nav-description">Learn to build for your use case by following Google's prescriptive and opinionated guidance. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/games" track-type="nav" track-metadata-eventdetail="https://developer.android.com/games" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Games </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/media" track-type="nav" track-metadata-eventdetail="https://developer.android.com/media" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Camera & media </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/social-and-messaging" track-type="nav" track-metadata-eventdetail="https://developer.android.com/social-and-messaging" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Social & messaging </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/health-and-fitness" track-type="nav" track-metadata-eventdetail="https://developer.android.com/health-and-fitness" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Health & fitness </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/productivity" track-type="nav" track-metadata-eventdetail="https://developer.android.com/productivity" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Productivity </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/work/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/work/overview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Enterprise apps </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-stars"> <li class="devsite-nav-title" role="heading" tooltip>Get the latest</li> <li class="devsite-nav-description">Stay in touch with the latest releases throughout the year, join our preview programs, and give us your feedback. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/latest-updates" track-type="nav" track-metadata-eventdetail="https://developer.android.com/latest-updates" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Latest updates </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/latest-updates/experimental" track-type="nav" track-metadata-eventdetail="https://developer.android.com/latest-updates/experimental" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Experimental updates </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio/preview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio/preview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Android Studio preview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/versions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/versions" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Jetpack & Compose libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/wearables/versions/4" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/wearables/versions/4" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Wear OS preview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design-for-safety/privacy-sandbox" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design-for-safety/privacy-sandbox" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Privacy Sandbox </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-dropdown-full "> <a href="https://developer.android.com/design" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-metadata-eventdetail="https://developer.android.com/design" track-type="nav" track-metadata-position="nav - design & plan" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" > Design & Plan </a> <button aria-haspopup="menu" aria-expanded="false" aria-label="Dropdown menu for Design & Plan" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design" track-metadata-position="nav - design & plan" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-layout"> <li class="devsite-nav-title" role="heading" tooltip>UI Design</li> <li class="devsite-nav-description">Design a beautiful user interface using Android best practices.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Design for Android </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/mobile" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/mobile" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Mobile </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/large-screens" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/large-screens" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Adaptive UI </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/xr" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/xr" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Android XR </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/widget" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/widget" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Widgets </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/wear" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/wear" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/tv" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-design"> <li class="devsite-nav-title" role="heading" tooltip>Architecture</li> <li class="devsite-nav-description">Design robust, testable, and maintainable app logic and services.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/architecture/intro" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/architecture/intro" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Introduction </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/libraries/view-binding" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/libraries/view-binding" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/navigation/navigation-principles" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/navigation/navigation-principles" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Navigation </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/modularization" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/modularization" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Modularization </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/testing/fundamentals" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/testing/fundamentals" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Testing </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-vitals"> <li class="devsite-nav-title" role="heading" tooltip>Quality</li> <li class="devsite-nav-description">Plan for app quality and align with Play store guidelines.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/core-value" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/core-value" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Core value </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/user-experience" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/user-experience" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> User experience </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/ui/accessibility" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/ui/accessibility" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Accessibility </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/technical" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/technical" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Technical quality </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/privacy-and-security" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/privacy-and-security" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Security </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-security-2"> <li class="devsite-nav-title" role="heading" tooltip>Security</li> <li class="devsite-nav-description">Safeguard users against threats and ensure a secure Android experience.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/security" track-type="nav" track-metadata-eventdetail="https://developer.android.com/security" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/privacy-and-security/about" track-type="nav" track-metadata-eventdetail="https://developer.android.com/privacy-and-security/about" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Privacy </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/permissions/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/permissions/overview" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Permissions </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/identity" track-type="nav" track-metadata-eventdetail="https://developer.android.com/identity" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Identity </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/security/fraud-prevention" track-type="nav" track-metadata-eventdetail="https://developer.android.com/security/fraud-prevention" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Fraud prevention </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-earth"> <li class="devsite-nav-title" role="heading" tooltip>Build for Billions</li> <li class="devsite-nav-description">Create the best experience for entry-level devices</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/build-for-billions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/build-for-billions" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/docs/quality-guidelines/build-for-billions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/docs/quality-guidelines/build-for-billions" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> About new markets </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/androidgo" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/androidgo" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> Android (Go edition) </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-dropdown-full devsite-active "> <a href="https://developer.android.com/develop" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-metadata-eventdetail="https://developer.android.com/develop" track-type="nav" track-metadata-position="nav - develop" track-metadata-module="primary nav" aria-label="Develop, selected" data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > Develop </a> <button aria-haspopup="menu" aria-expanded="false" aria-label="Dropdown menu for Develop" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop" track-metadata-position="nav - develop" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown android-dropdown-primary android-dropdown-ai"> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Build AI experiences</li> <li class="devsite-nav-description">Build AI-powered Android apps with Gemini APIs and more. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/ai" track-type="nav" track-metadata-eventdetail="https://developer.android.com/ai" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="build ai experiences" tooltip class="button button-primary" > <div class="devsite-nav-item-title"> Get started </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-flag"> <li class="devsite-nav-title" role="heading" tooltip>Core areas</li> <li class="devsite-nav-description">Get the samples and docs for the features you need.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/samples" track-type="nav" track-metadata-eventdetail="https://developer.android.com/samples" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Samples </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/ui" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/ui" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> User interfaces </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/background-work" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/background-work" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Background work </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/data" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/data" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Data and files </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/connectivity" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/connectivity" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Connectivity </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop#core-areas" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop#core-areas" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> All core areas ⤵️ </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-tools-2"> <li class="devsite-nav-title" role="heading" tooltip>Tools and workflow</li> <li class="devsite-nav-description">Use the IDE to write and build your app, or create your own pipeline.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio/write" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio/write" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Write and debug code </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/build/gradle-build-overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/build/gradle-build-overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Build projects </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/testing" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/testing" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Test your app </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/performance/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/performance/overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Performance </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/tools" track-type="nav" track-metadata-eventdetail="https://developer.android.com/tools" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Command-line tools </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/reference/tools/gradle-api" track-type="nav" track-metadata-eventdetail="https://developer.android.com/reference/tools/gradle-api" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Gradle plugin API </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-multiple-screens"> <li class="devsite-nav-title" role="heading" tooltip>Device tech</li> <li class="devsite-nav-description">Write code for form factors. Connect devices and share data.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/large-screens/get-started-with-large-screens" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/large-screens/get-started-with-large-screens" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Adaptive UI </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/wearables" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/wearables" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/xr" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/xr" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android XR </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/health-and-fitness/guides" track-type="nav" track-metadata-eventdetail="https://developer.android.com/health-and-fitness/guides" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android Health </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/cars" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/cars" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android for Cars </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/tv" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop#devices" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop#devices" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> All devices ⤵️ </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-core-library"> <li class="devsite-nav-title" role="heading" tooltip>Libraries</li> <li class="devsite-nav-description">Browse API reference documentation with all the details.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/reference/packages" track-type="nav" track-metadata-eventdetail="https://developer.android.com/reference/packages" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Android platform </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/explorer" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/explorer" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Jetpack libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/releases/compose" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/releases/compose" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Compose libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/android/reference/packages" track-type="nav" track-metadata-eventdetail="https://developers.google.com/android/reference/packages" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Google Play services ↗️ </div> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/sdks" track-type="nav" track-metadata-eventdetail="https://play.google.com/sdks" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Google Play SDK index ↗️ </div> </a> </li> </ul> </div> </div> </div> </tab> <tab > <a href="https://developer.android.com/distribute" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developer.android.com/distribute" track-type="nav" track-metadata-position="nav - google play" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Google Play" track-name="google play" > Google Play </a> </tab> <tab > <a href="https://developer.android.com/community" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developer.android.com/community" track-type="nav" track-metadata-position="nav - community" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Community" track-name="community" > Community </a> </tab> </nav> </devsite-tabs> </div> <devsite-search enable-signin enable-search enable-suggestions enable-query-completion project-name="Android Studio" tenant-name="Android Developers" > <form class="devsite-search-form" action="https://developer.android.com/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-appearance-selector></devsite-appearance-selector> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <a class="devsite-header-link devsite-top-button button gc-analytics-event" href="https://developer.android.com/studio" data-category="Site-Wide Custom Events" data-label="Site header link" > Android Studio </a> <devsite-user enable-profiles id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section "> <div class="devsite-header-background"> <div class="devsite-product-id-row" > <div class="devsite-product-description-row"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> <a href="https://developer.android.com/studio" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Android Studio" > Android Studio </a> </li> </ul> </div> </div> <div class="devsite-doc-set-nav-row"> <devsite-tabs class="lower-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Lower tabs"> <tab > <a href="https://developer.android.com/studio" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developer.android.com/studio" track-type="nav" track-metadata-position="nav - download" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Download" track-name="download" > Download </a> </tab> <tab > <a href="https://developer.android.com/studio/intro" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developer.android.com/studio/intro" track-type="nav" track-metadata-position="nav - android studio editor" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Android Studio editor" track-name="android studio editor" > Android Studio editor </a> </tab> <tab > <a href="https://developer.android.com/gemini-in-android" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developer.android.com/gemini-in-android" track-type="nav" track-metadata-position="nav - gemini in android studio" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Gemini in Android Studio" track-name="gemini in android studio" > Gemini in Android Studio </a> </tab> <tab class="devsite-active"> <a href="https://developer.android.com/build/gradle-build-overview" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developer.android.com/build/gradle-build-overview" track-type="nav" track-metadata-position="nav - android gradle plugin" track-metadata-module="primary nav" aria-label="Android Gradle Plugin, selected" data-category="Site-Wide Custom Events" data-label="Tab: Android Gradle Plugin" track-name="android gradle plugin" > Android Gradle Plugin </a> </tab> <tab > <a href="https://developer.android.com/tools" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developer.android.com/tools" track-type="nav" track-metadata-position="nav - sdk tools" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: SDK tools" track-name="sdk tools" > SDK tools </a> </tab> <tab > <a href="https://developer.android.com/studio/preview" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://developer.android.com/studio/preview" track-type="nav" track-metadata-position="nav - preview" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Preview" track-name="preview" > Preview </a> </tab> </nav> </devsite-tabs> </div> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars > <div class="devsite-book-nav-filter" > <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="androidDevelopers" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/images/lockup-dark-theme.svg" media="(prefers-color-scheme: dark)" class="devsite-dark-theme" alt="Android Developers"> <img src="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/images/lockup.svg" class="devsite-site-logo" alt="Android Developers"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <a href="/get-started" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Essentials" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Essentials </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" > <span class="devsite-nav-text" tooltip menu="Essentials"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Essentials"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/design" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Design & Plan" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Design & Plan </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" > <span class="devsite-nav-text" tooltip menu="Design & Plan"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Design & Plan"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/develop" class="devsite-nav-title gc-analytics-event devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Develop" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Develop </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > <span class="devsite-nav-text" tooltip menu="Develop"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Develop"> </span> </span> </li> </ul> <ul class="devsite-nav-responsive-tabs"> <li class="devsite-nav-item"> <a href="/studio" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Download" track-name="download" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Download" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Download </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio/intro" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Android Studio editor" track-name="android studio editor" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Studio editor" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Studio editor </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/gemini-in-android" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Gemini in Android Studio" track-name="gemini in android studio" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Gemini in Android Studio" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Gemini in Android Studio </span> </a> </li> <li class="devsite-nav-item"> <a href="/build/gradle-build-overview" class="devsite-nav-title gc-analytics-event devsite-nav-has-children devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Android Gradle Plugin" track-name="android gradle plugin" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Gradle Plugin" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip menu="_book"> Android Gradle Plugin </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="_book"> </span> </a> </li> <li class="devsite-nav-item"> <a href="/tools" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: SDK tools" track-name="sdk tools" data-category="Site-Wide Custom Events" data-label="Responsive Tab: SDK tools" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > SDK tools </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio/preview" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Preview" track-name="preview" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Preview" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Preview </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/distribute" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Google Play" track-name="google play" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play </span> </a> </li> <li class="devsite-nav-item"> <a href="/community" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Community" track-name="community" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Community" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Community </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Studio" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Studio </span> </a> </li> </ul> </div> <div class="devsite-mobile-nav-bottom"> <ul class="devsite-nav-list" menu="_book"> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-accordion"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>What's new in Android build</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/build/releases/gradle-plugin" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/releases/gradle-plugin" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/releases/gradle-plugin" ><span class="devsite-nav-text" tooltip>Android Gradle Plugin 8.8 release notes</span></a></li><li class="devsite-nav-item"><a href="/build/releases/gradle-plugin-roadmap" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/releases/gradle-plugin-roadmap" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/releases/gradle-plugin-roadmap" ><span class="devsite-nav-text" tooltip>Android Gradle Plugin roadmap</span></a></li><li class="devsite-nav-item"><a href="/build/releases/gradle-plugin-api-updates" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/releases/gradle-plugin-api-updates" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/releases/gradle-plugin-api-updates" ><span class="devsite-nav-text" tooltip>Android Gradle plugin API updates</span></a></li><li class="devsite-nav-item"><a href="/build/releases/past-releases" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/releases/past-releases" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/releases/past-releases" ><span class="devsite-nav-text" tooltip>Past Android Gradle Plugin releases</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-accordion"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Android build overview</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/build/gradle-build-overview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/gradle-build-overview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/gradle-build-overview" ><span class="devsite-nav-text" tooltip>Gradle build overview</span></a></li><li class="devsite-nav-item"><a href="/build/android-build-structure" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/android-build-structure" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/android-build-structure" ><span class="devsite-nav-text" tooltip>Android build structure</span></a></li><li class="devsite-nav-item"><a href="/build/tool-and-library-dependencies" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/tool-and-library-dependencies" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/tool-and-library-dependencies" ><span class="devsite-nav-text" tooltip>Tool and library interdependencies</span></a></li><li class="devsite-nav-item"><a href="/build/gradle-dependency-resolution" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/gradle-dependency-resolution" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/gradle-dependency-resolution" ><span class="devsite-nav-text" tooltip>Gradle dependency resolution</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-accordion"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Manage your build</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/build" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build" ><span class="devsite-nav-text" tooltip>Configure the Android build system</span></a></li><li class="devsite-nav-item"><a href="/build/annotation-processors" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/annotation-processors" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/annotation-processors" ><span class="devsite-nav-text" tooltip>Add annotation processors</span></a></li><li class="devsite-nav-item"><a href="/build/jdks" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/jdks" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/jdks" ><span class="devsite-nav-text" tooltip>Java versions in Android builds</span></a></li><li class="devsite-nav-item"><a href="/build/configure-app-module" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/configure-app-module" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/configure-app-module" ><span class="devsite-nav-text" tooltip>Configure the app module</span></a></li><li class="devsite-nav-item"><a href="/build/manage-manifests" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/manage-manifests" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/manage-manifests" ><span class="devsite-nav-text" tooltip>Manage manifest files</span></a></li><li class="devsite-nav-item"><a href="/build/custom-build-logic" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/custom-build-logic" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/custom-build-logic" ><span class="devsite-nav-text" tooltip>Apply custom build logic</span></a></li><li class="devsite-nav-item"><a href="/build/build-variants" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/build-variants" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/build-variants" ><span class="devsite-nav-text" tooltip>Configure build variants</span></a></li><li class="devsite-nav-item"><a href="/build/agp-upgrade-assistant" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/agp-upgrade-assistant" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/agp-upgrade-assistant" ><span class="devsite-nav-text" tooltip>Use the Android Gradle plugin Upgrade Assistant</span></a></li><li class="devsite-nav-item"><a href="/build/sdk-upgrade-assistant" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/sdk-upgrade-assistant" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/sdk-upgrade-assistant" ><span class="devsite-nav-text" tooltip>Use the Android SDK Upgrade Assistant</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-accordion"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Manage dependencies</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/build/dependencies" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/dependencies" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/dependencies" ><span class="devsite-nav-text" tooltip>Add build dependencies</span></a></li><li class="devsite-nav-item"><a href="/build/native-dependencies" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/native-dependencies" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/native-dependencies" ><span class="devsite-nav-text" tooltip>Add native dependencies</span></a></li><li class="devsite-nav-item"><a href="/build/remote-repositories" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/remote-repositories" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/remote-repositories" ><span class="devsite-nav-text" tooltip>Manage remote repositories</span></a></li><li class="devsite-nav-item"><a href="/build/dependency-verification" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/dependency-verification" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/dependency-verification" ><span class="devsite-nav-text" tooltip>Verify build dependencies</span></a></li><li class="devsite-nav-item"><a href="/build/version-upgrade-strategies" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/version-upgrade-strategies" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/version-upgrade-strategies" ><span class="devsite-nav-text" tooltip>Upgrade build dependencies</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-accordion"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Run your build</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/build/building-cmdline" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/building-cmdline" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/building-cmdline" ><span class="devsite-nav-text" tooltip>Build your app from the command line</span></a></li><li class="devsite-nav-item"><a href="/build/build-for-release" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/build-for-release" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/build-for-release" ><span class="devsite-nav-text" tooltip>Build your app for release to users</span></a></li><li class="devsite-nav-item"><a href="/build/building-studio" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/building-studio" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/building-studio" ><span class="devsite-nav-text" tooltip>Build and run your app in Android Studio</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-accordion"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Optimize your build</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/build/optimize-your-build" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/optimize-your-build" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/optimize-your-build" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/build/build-analyzer" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/build-analyzer" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/build-analyzer" ><span class="devsite-nav-text" tooltip>Troubleshoot build performance</span></a></li><li class="devsite-nav-item"><a href="/build/profile-your-build" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/profile-your-build" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/profile-your-build" ><span class="devsite-nav-text" tooltip>Profile your build</span></a></li><li class="devsite-nav-item"><a href="/build/shrink-code" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/shrink-code" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/shrink-code" ><span class="devsite-nav-text" tooltip>Shrink your app</span></a></li><li class="devsite-nav-item"><a href="/build/kotlin-support" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/kotlin-support" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/kotlin-support" ><span class="devsite-nav-text" tooltip>D8 and R8 compiler version compatibility</span></a></li><li class="devsite-nav-item"><a href="/build/multidex" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/multidex" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/multidex" ><span class="devsite-nav-text" tooltip>Enable multidex</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-accordion"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Extend your build</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/build/extend-agp" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/extend-agp" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/extend-agp" ><span class="devsite-nav-text" tooltip>Write Gradle plugins</span></a></li><li class="devsite-nav-item"><a href="/build/gradle-tips" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/gradle-tips" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/gradle-tips" ><span class="devsite-nav-text" tooltip>Gradle tips and recipes</span></a></li><li class="devsite-nav-item"><a href="/build/cxx-ninja" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/cxx-ninja" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/cxx-ninja" ><span class="devsite-nav-text" tooltip>Integrate a custom C/C++ build system</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-accordion"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Publish your library</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/build/publish-library" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/publish-library" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/publish-library" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/build/publish-library/prep-lib-release" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/publish-library/prep-lib-release" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/publish-library/prep-lib-release" ><span class="devsite-nav-text" tooltip>Prepare your library for release</span></a></li><li class="devsite-nav-item"><a href="/build/publish-library/configure-pub-variants" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/publish-library/configure-pub-variants" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/publish-library/configure-pub-variants" ><span class="devsite-nav-text" tooltip>Configure publication variants</span></a></li><li class="devsite-nav-item"><a href="/build/publish-library/configure-test-fixtures" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/publish-library/configure-test-fixtures" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/publish-library/configure-test-fixtures" ><span class="devsite-nav-text" tooltip>Configure test fixtures for publication</span></a></li><li class="devsite-nav-item"><a href="/build/publish-library/upload-library" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/publish-library/upload-library" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/publish-library/upload-library" ><span class="devsite-nav-text" tooltip>Upload your library</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-accordion"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Migrate your build</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/build/migrate-to-kotlin-dsl" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/migrate-to-kotlin-dsl" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/migrate-to-kotlin-dsl" ><span class="devsite-nav-text" tooltip>Migrate to the Kotlin DSL</span></a></li><li class="devsite-nav-item"><a href="/build/migrate-to-catalogs" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/migrate-to-catalogs" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/migrate-to-catalogs" ><span class="devsite-nav-text" tooltip>Migrate to version catalogs</span></a></li><li class="devsite-nav-item"><a href="/build/migrate-to-ksp" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/migrate-to-ksp" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/migrate-to-ksp" ><span class="devsite-nav-text" tooltip>Migrate to Kotlin Symbol Processing</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable devsite-nav-accordion"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Troubleshoot</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/build/troubleshoot" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/troubleshoot" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/troubleshoot" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/build/dependency-resolution-errors" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /build/dependency-resolution-errors" track-type="bookNav" track-name="click" track-metadata-eventdetail="/build/dependency-resolution-errors" ><span class="devsite-nav-text" tooltip>Debug dependency resolution errors</span></a></li></ul></div></li> <li class="devsite-nav-item"><a href="/reference/tools/gradle-api" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /reference/tools/gradle-api" track-type="bookNav" track-name="click" track-metadata-eventdetail="/reference/tools/gradle-api" ><span class="devsite-nav-text" tooltip>Android Gradle plugin API reference</span></a></li> </ul> <ul class="devsite-nav-list" menu="Essentials" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Gemini in Android Studio </span> </span> </li> <li class="devsite-nav-item"> <a href="/gemini-in-android" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Learn more" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Learn more </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Get Android Studio" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Get Android Studio </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Get started </span> </span> </li> <li class="devsite-nav-item"> <a href="/get-started/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Hello world" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Hello world </span> </a> </li> <li class="devsite-nav-item"> <a href="/courses" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Training courses" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Training courses </span> </a> </li> <li class="devsite-nav-item"> <a href="/get-started/codelabs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Tutorials" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Tutorials </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/ui/compose/adopt" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Compose for teams" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Compose for teams </span> </a> </li> <li class="devsite-nav-item"> <a href="/kotlin" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Kotlin for Android" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Kotlin for Android </span> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/console/about/guides/monetize/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Monetization with Play ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Monetization with Play ↗️ </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Extend by device </span> </span> </li> <li class="devsite-nav-item"> <a href="/adaptive-apps" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Adaptive apps" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Adaptive apps </span> </a> </li> <li class="devsite-nav-item"> <a href="/xr" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android XR" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android XR </span> </a> </li> <li class="devsite-nav-item"> <a href="/wear" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/cars" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android for Cars" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android for Cars </span> </a> </li> <li class="devsite-nav-item"> <a href="/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item"> <a href="/chrome-os" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: ChromeOS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > ChromeOS </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build by category </span> </span> </li> <li class="devsite-nav-item"> <a href="/games" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Games" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Games </span> </a> </li> <li class="devsite-nav-item"> <a href="/media" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Camera & media" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Camera & media </span> </a> </li> <li class="devsite-nav-item"> <a href="/social-and-messaging" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Social & messaging" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Social & messaging </span> </a> </li> <li class="devsite-nav-item"> <a href="/health-and-fitness" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Health & fitness" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Health & fitness </span> </a> </li> <li class="devsite-nav-item"> <a href="/productivity" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Productivity" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Productivity </span> </a> </li> <li class="devsite-nav-item"> <a href="/work/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Enterprise apps" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Enterprise apps </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Get the latest </span> </span> </li> <li class="devsite-nav-item"> <a href="/latest-updates" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Latest updates" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Latest updates </span> </a> </li> <li class="devsite-nav-item"> <a href="/latest-updates/experimental" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Experimental updates" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Experimental updates </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio/preview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Studio preview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Studio preview </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/versions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Jetpack & Compose libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Jetpack & Compose libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/wearables/versions/4" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS preview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS preview </span> </a> </li> <li class="devsite-nav-item"> <a href="/design-for-safety/privacy-sandbox" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Privacy Sandbox" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Privacy Sandbox </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Design & Plan" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > UI Design </span> </span> </li> <li class="devsite-nav-item"> <a href="/design/ui" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Design for Android" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Design for Android </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/mobile" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Mobile" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Mobile </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/large-screens" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Adaptive UI" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Adaptive UI </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/xr" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android XR" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android XR </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/widget" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Widgets" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Widgets </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/wear" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Architecture </span> </span> </li> <li class="devsite-nav-item"> <a href="/topic/architecture/intro" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Introduction" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Introduction </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/libraries/view-binding" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/navigation/navigation-principles" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Navigation" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Navigation </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/modularization" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Modularization" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Modularization </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/testing/fundamentals" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Testing" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Testing </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Quality </span> </span> </li> <li class="devsite-nav-item"> <a href="/quality" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/core-value" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Core value" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Core value </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/user-experience" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: User experience" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > User experience </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/ui/accessibility" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Accessibility" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Accessibility </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/technical" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Technical quality" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Technical quality </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/privacy-and-security" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Security" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Security </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Security </span> </span> </li> <li class="devsite-nav-item"> <a href="/security" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/privacy-and-security/about" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Privacy" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Privacy </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/permissions/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Permissions" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Permissions </span> </a> </li> <li class="devsite-nav-item"> <a href="/identity" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Identity" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Identity </span> </a> </li> <li class="devsite-nav-item"> <a href="/security/fraud-prevention" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Fraud prevention" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Fraud prevention </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build for Billions </span> </span> </li> <li class="devsite-nav-item"> <a href="/build-for-billions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/quality-guidelines/build-for-billions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: About new markets" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > About new markets </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/androidgo" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android (Go edition)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android (Go edition) </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Develop" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build AI experiences </span> </span> </li> <li class="devsite-nav-item"> <a href="/ai" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Get started" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Get started </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Core areas </span> </span> </li> <li class="devsite-nav-item"> <a href="/samples" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Samples" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Samples </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/ui" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: User interfaces" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > User interfaces </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/background-work" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Background work" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Background work </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/data" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Data and files" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Data and files </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/connectivity" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Connectivity" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Connectivity </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop#core-areas" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: All core areas ⤵️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > All core areas ⤵️ </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Tools and workflow </span> </span> </li> <li class="devsite-nav-item"> <a href="/studio/write" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Write and debug code" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Write and debug code </span> </a> </li> <li class="devsite-nav-item"> <a href="/build/gradle-build-overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Build projects" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Build projects </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/testing" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Test your app" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Test your app </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/performance/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Performance" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Performance </span> </a> </li> <li class="devsite-nav-item"> <a href="/tools" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Command-line tools" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Command-line tools </span> </a> </li> <li class="devsite-nav-item"> <a href="/reference/tools/gradle-api" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Gradle plugin API" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Gradle plugin API </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Device tech </span> </span> </li> <li class="devsite-nav-item"> <a href="/guide/topics/large-screens/get-started-with-large-screens" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Adaptive UI" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Adaptive UI </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/wearables" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/xr" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android XR" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android XR </span> </a> </li> <li class="devsite-nav-item"> <a href="/health-and-fitness/guides" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Health" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Health </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/cars" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android for Cars" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android for Cars </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop#devices" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: All devices ⤵️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > All devices ⤵️ </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Libraries </span> </span> </li> <li class="devsite-nav-item"> <a href="/reference/packages" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android platform" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android platform </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/explorer" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Jetpack libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Jetpack libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/releases/compose" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Compose libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Compose libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/android/reference/packages" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play services ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play services ↗️ </span> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/sdks" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play SDK index ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play SDK index ↗️ </span> </a> </li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" id="main-content" class="devsite-main-content" has-book-nav has-sidebar > <div class="devsite-sidebar"> <div class="devsite-sidebar-content"> <devsite-toc class="devsite-nav" role="navigation" aria-label="On this page" depth="2" scrollbars ></devsite-toc> <devsite-recommendations-sidebar class="nocontent devsite-nav"> </devsite-recommendations-sidebar> </div> </div> <devsite-content> <article class="devsite-article"> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" aria-label="Breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developer.android.com/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Android Developers" > Android Developers </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/develop" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="" > Develop </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/studio" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="3" track-type="globalNav" track-name="breadcrumb" track-metadata-position="3" track-metadata-eventdetail="Android Studio" > Android Studio </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/build/gradle-build-overview" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="4" track-type="globalNav" track-name="breadcrumb" track-metadata-position="4" track-metadata-eventdetail="" > Android Gradle Plugin </a> </li> </ul> <devsite-thumb-rating position="header"> </devsite-thumb-rating> </div> <h1 class="devsite-page-title" tabindex="-1"> Configure build variants </h1> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> <div class="devsite-page-title-meta"><devsite-view-release-notes></devsite-view-release-notes></div> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded > </devsite-toc> <devsite-recommendations-dropdown class="nocontent"></devsite-recommendations-dropdown> <div class="devsite-article-body clearfix "> <p> This page shows you how you can configure build variants to create different versions of your app from a single project and how to properly manage your dependencies and signing configurations. </p> <p> Each <em>build variant</em> represents a different version of your app that you can build. For example, you might want to build one version of your app that's free with a limited set of content, and another paid version that includes more. You can also build different versions of your app that target different devices, based on API level or other device variations. </p> <p> Build variants are the result of Gradle using a specific set of rules to combine settings, code, and resources configured in your build types and product flavors. Although you don't configure build variants directly, you do configure the build types and product flavors that form them. </p> <p> For example, a "demo" <em>product flavor</em> might specify certain features and device requirements, such as custom source code, resources, and minimum API levels, while the "debug" <em>build type</em> applies different build and packaging settings, such as debug options and signing keys. The build variant that combines these two is the "demoDebug" version of your app, and it includes a combination of the configurations and resources included in the "demo" product flavor, "debug" build type, and <code translate="no" dir="ltr">main/</code> source set. </p> <h2 id="build-types" data-text=" Configure build types " tabindex="-1"> Configure build types </h2> <p> You can create and configure build types inside the <code translate="no" dir="ltr">android</code> block of the module-level <code translate="no" dir="ltr">build.gradle.kts</code> file. When you create a new module, Android Studio automatically creates the debug and release build types. Although the debug build type doesn't appear in the build configuration file, Android Studio configures it with <a href="/guide/topics/manifest/application-element#debug"> <code translate="no" dir="ltr">debuggable true</code></a>. This lets you debug the app on secure Android devices and configures app signing with a generic debug keystore. </p> <p> You can add the debug build type to your configuration if you want to add or change certain settings. The following sample specifies an <a href="/reference/tools/gradle-api/8.8/com/android/build/api/dsl/ApplicationVariantDimension#applicationIdSuffix()"> <code translate="no" dir="ltr">applicationIdSuffix</code></a> for the debug build type and configures a "staging" build type that is initialized using settings from the debug build type: </p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">manifestPlaceholders</span><span class="devsite-syntax-o">[</span><span class="devsite-syntax-s">"hostName"</span><span class="devsite-syntax-o">]</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"www.example.com"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"release"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">isMinifyEnabled</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">true</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">proguardFiles</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">getDefaultProguardFile</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"proguard-android.txt"</span><span class="devsite-syntax-p">),</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"proguard-rules.pro"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">".debug"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">isDebuggable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">true</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-cm">/**</span> <span class="devsite-syntax-cm"> * The `initWith` property lets you copy configurations from other build types,</span> <span class="devsite-syntax-cm"> * then configure only the settings you want to change. This one copies the debug build</span> <span class="devsite-syntax-cm"> * type, and then changes the <a href="/build/studio/build/manage-manifests#inject_build_variables_into_the_manifest" >manifest placeholder</a> and <a href="/studio/build/configure-app-module#set_the_application_id" >application ID</a>.</span> <span class="devsite-syntax-cm"> */</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"staging"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">initWith</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">))</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">manifestPlaceholders</span><span class="devsite-syntax-o">[</span><span class="devsite-syntax-s">"hostName"</span><span class="devsite-syntax-o">]</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"internal.example.com"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">".debugStaging"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">manifestPlaceholders</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">[</span><span class="devsite-syntax-nl">hostName:</span><span class="devsite-syntax-s2">"www.example.com"</span><span class="devsite-syntax-o">]</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">release</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minifyEnabled</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">true</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">proguardFiles</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getDefaultProguardFile</span><span class="devsite-syntax-o">(</span><span class="devsite-syntax-s1">'proguard-android.txt'</span><span class="devsite-syntax-o">),</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'proguard-rules.pro'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">debug</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">".debug"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">debuggable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">true</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-cm">/**</span> <span class="devsite-syntax-cm"> * The `initWith` property lets you copy configurations from other build types,</span> <span class="devsite-syntax-cm"> * then configure only the settings you want to change. This one copies the debug build</span> <span class="devsite-syntax-cm"> * type, and then changes the <a href="/build/studio/build/manage-manifests#inject_build_variables_into_the_manifest" >manifest placeholder</a> and <a href="/studio/build/configure-app-module#set_the_application_id" >application ID</a>.</span> <span class="devsite-syntax-cm"> */</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">staging</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">initWith</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">debug</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">manifestPlaceholders</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">[</span><span class="devsite-syntax-nl">hostName:</span><span class="devsite-syntax-s2">"internal.example.com"</span><span class="devsite-syntax-o">]</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">".debugStaging"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section></div> </div> <p class="note"> <strong>Note:</strong> When you make changes to a build configuration file, Android Studio requires that you sync your project with the new configuration. To sync your project, click <strong>Sync Now</strong> in the notification bar that appears when you make a change or click <strong>Sync Project</strong> <img src="/static/studio/images/buttons/toolbar-sync-gradle.png" alt= "" class="inline-icon"> from the toolbar. If Android Studio notices any errors with your configuration, the <strong>Messages</strong> window appears to describe the issue. </p> <p> To learn more about all the properties you can configure with build types, read the <a href="/reference/tools/gradle-api/current/com/android/build/api/dsl/BuildType"> <code translate="no" dir="ltr">BuildType</code></a> reference. </p> <h2 id="product-flavors" data-text=" Configure product flavors " tabindex="-1"> Configure product flavors </h2> <p> Creating product flavors is similar to creating build types. Add product flavors to the <code translate="no" dir="ltr">productFlavors</code> block in your build configuration and include the settings you want. The product flavors support the same properties as <code translate="no" dir="ltr">defaultConfig</code>, because <code translate="no" dir="ltr">defaultConfig</code> actually belongs to the <a href="/reference/tools/gradle-api/current/com/android/build/api/dsl/ProductFlavor"> <code translate="no" dir="ltr">ProductFlavor</code></a> class. This means you can provide the base configuration for all flavors in the <code translate="no" dir="ltr">defaultConfig</code> block, and each flavor can change any of these default values, such as the <code translate="no" dir="ltr">applicationId</code>. To learn more about the application ID, read <a href="/studio/build/configure-app-module#set-application-id">Set the application ID</a>. </p> <p class="note"> <strong>Note:</strong> You still need to specify a package name using the <a href="/guide/topics/manifest/manifest-element#package"><code translate="no" dir="ltr">package</code></a> attribute in the <code translate="no" dir="ltr">main/</code> manifest file. You must also use that package name in your source code to refer to the <code translate="no" dir="ltr">R</code> class or to resolve any relative activity or service registration. This lets you use <code translate="no" dir="ltr">applicationId</code> to give each product flavor a unique ID for packaging and distribution without having to change your source code. </p> <p> All flavors must belong to a named flavor dimension, which is a group of product flavors. You must assign all flavors to a flavor dimension; otherwise, you will get the following build error. </p> <div></div><devsite-code><pre class="none" translate="no" dir="ltr" is-upgraded> Error: All flavors must now belong to a named flavor dimension. The flavor '<var translate="no">flavor_name</var>' is not assigned to a flavor dimension. </pre></devsite-code> <p>If a given module specifies only one flavor dimension, the Android Gradle plugin automatically assigns all of the module's flavors to that dimension.</p> <aside class="note"> <b>Tip:</b> The plugin tries to match variants of your app with those of local library dependencies. Because <a href="/studio/build/build-variants#variant_aware">variant-aware dependency matching</a> relies on how you name a flavor dimension, name your flavor dimensions carefully. Doing so gives you more control over which code and resources from your local dependencies are matched with each version of the app. </aside> <p> The following code sample creates a flavor dimension named "version" and adds "demo" and "full" product flavors. These flavors provide their own <a href="/studio/build/build-variants#change-app-id"> <code translate="no" dir="ltr">applicationIdSuffix</code></a> and <code translate="no" dir="ltr">versionNameSuffix</code>: </p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">){...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"release"</span><span class="devsite-syntax-p">){...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specifies one flavor dimension.</span> <span class="devsite-syntax-w"> </span><a href="/reference/tools/gradle-api/current/com/android/build/api/dsl/ProductFlavor#dimension"><span class="devsite-syntax-n">flavorDimensions</span></a><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"version"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"demo"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Assigns this product flavor to the "version" flavor dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// If you are using only one dimension, this property is optional,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// and the plugin automatically assigns all the module's flavors to</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// that dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"version"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">".demo"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionNameSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"-demo"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"full"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"version"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">".full"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionNameSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"-full"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">debug</span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">release</span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specifies one flavor dimension.</span> <span class="devsite-syntax-w"> </span><a href="/reference/tools/gradle-api/current/com/android/build/api/dsl/ProductFlavor#dimension"><span class="devsite-syntax-n">flavorDimensions</span></a><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"version"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">demo</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Assigns this product flavor to the "version" flavor dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// If you are using only one dimension, this property is optional,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// and the plugin automatically assigns all the module's flavors to</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// that dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"version"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">".demo"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionNameSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"-demo"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">full</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"version"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">".full"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionNameSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"-full"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section></div> </div> <p class="note"> <strong>Note:</strong> If you have a legacy app (created before August 2021) that you distribute using APKs on Google Play, to distribute your app using <a href="/google/play/publishing/multiple-apks">multiple APK support</a> in Google Play, assign the same <code translate="no" dir="ltr">applicationId</code> value to all variants and give each variant a different <a href="/studio/publish/versioning#appversioning"><code translate="no" dir="ltr">versionCode</code></a>. To distribute different variants of your app as separate apps in Google Play, you need to assign a different <code translate="no" dir="ltr">applicationId</code> to each variant. </p> <p> After you create and configure your product flavors, click <strong>Sync Now</strong> in the notification bar. Once the sync completes, Gradle automatically creates build variants based on your build types and product flavors and names them according to <code translate="no" dir="ltr"><product-flavor><Build-Type></code>. For example, if you created "demo" and "full" product flavors, and kept the default "debug" and "release" build types, Gradle creates the following build variants: </p> <ul> <li> <code translate="no" dir="ltr">demoDebug</code> </li> <li> <code translate="no" dir="ltr">demoRelease</code> </li> <li> <code translate="no" dir="ltr">fullDebug</code> </li> <li> <code translate="no" dir="ltr">fullRelease</code> </li> </ul> <p> To select which build variant to build and run, go to <strong>Build</strong> > <strong>Select Build Variant</strong> and select a build variant from the menu. To start customizing each build variant with its own features and resources, you'll need to <a href="#sourcesets">create and manage source sets</a>, as described on this page. </p> <h3 id="change-app-id" data-text=" Change the application ID for build variants " tabindex="-1"> Change the application ID for build variants </h3> <p>When you build an APK or AAB for your app, the build tools tag the app with the application ID defined in the <code translate="no" dir="ltr">defaultConfig</code> block from the <code translate="no" dir="ltr">build.gradle.kts</code> file, as shown in the following example. However, if you want to create different versions of your app to appear as separate listings on Google Play Store, such as a "free" and "pro" version, you need to create separate <a href="/studio/build/build-variants">build variants</a> that each have a different application ID.</p> <p>In this case, define each build variant as a separate <a href="/studio/build/build-variants#product-flavors">product flavor</a>. For each flavor inside the <code translate="no" dir="ltr">productFlavors</code> block, you can redefine the <code translate="no" dir="ltr">applicationId</code> property, or you can instead append a segment to the default application ID using <code translate="no" dir="ltr">applicationIdSuffix</code>, as shown here:</p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationId</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"com.example.myapp"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"free"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">".free"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"pro"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">".pro"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationId</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"com.example.myapp"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">free</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">".free"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">pro</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">".pro"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section></div> </div> <p>This way, the application ID for the "free" product flavor is "com.example.myapp.free".</p> <p>You can also use <code translate="no" dir="ltr">applicationIdSuffix</code> to append a segment based on your <a href="/studio/build/build-variants#build-types">build type</a>, as shown here:</p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">".debug"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">debug</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">applicationIdSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">".debug"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section></div> </div> <p>Because Gradle applies the build type configuration after the product flavor, the application ID for the "free debug" build variant is "com.example.myapp.free.debug". This is useful when you want to have both the debug and the release build on the same device, because no two apps can have the same application ID.</p> If you have a legacy app (created before August 2021) that you distribute using APKs on Google Play, and you want to use the same app listing to distribute multiple APKs that each target a different device configuration, such as the API level, then you must use the same application ID for each build variant but give each APK a different <code translate="no" dir="ltr">versionCode</code>. For more information, read about <a href="/google/play/publishing/multiple-apks">Multiple APK support</a>. Publishing using AABs is unaffected, as it uses a single artifact that uses a single version code and application ID by default.</p> <p class="note"><b>Tip:</b> If you need to reference the application ID in your manifest file, you can use the <code translate="no" dir="ltr">${applicationId}</code> placeholder in any manifest attribute. During a build, Gradle replaces this tag with the actual application ID. For more information, see <a href="/studio/build/manage-manifests#inject_build_variables_into_the_manifest">Inject build variables into the manifest</a>.</p> <h3 id="flavor-dimensions" data-text=" Combine multiple product flavors with flavor dimensions " tabindex="-1"> Combine multiple product flavors with flavor dimensions </h3> <p> In some cases, you may want to combine configurations from multiple product flavors. For example, you may want to create different configurations for the "full" and "demo" product flavors that are based on API level. To do this, the Android Gradle plugin lets you create multiple groups of product flavors as flavor dimensions.</p> <p>When building your app, Gradle combines a product flavor configuration from each flavor dimension you define, along with a build type configuration, to create the final build variant. Gradle doesn't combine product flavors that belong to the same flavor dimension. </p> <p> The following code sample uses the <a href="/reference/tools/gradle-api/current/com/android/build/api/dsl/ProductFlavor#dimension"> <code translate="no" dir="ltr">flavorDimensions</code></a> property to create a "mode" flavor dimension to group the "full" and "demo" product flavors and an "api" flavor dimension to group product flavor configurations based on API level: </p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"release"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specifies the flavor dimensions you want to use. The order in which you</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// list the dimensions determines their priority, from highest to lowest,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// when Gradle merges variant sources and configurations. You must assign</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// each product flavor you configure to one of the flavor dimensions.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">flavorDimensions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">listOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"api"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"mode"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"demo"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Assigns this product flavor to the "mode" flavor dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"mode"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"full"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"mode"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Configurations in the "api" product flavors override those in "mode"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// flavors and the defaultConfig block. Gradle determines the priority</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// between flavor dimensions based on the order in which they appear next</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// to the flavorDimensions property, with the first dimension having a higher</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// priority than the second, and so on.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"minApi24"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"api"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minSdk</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">24</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// To ensure the target device receives the version of the app with</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// the highest compatible API level, assign version codes in increasing</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// value with API level.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">30000</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">android</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">defaultConfig</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">versionCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">?:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">0</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionNameSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"-minApi24"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"minApi23"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"api"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minSdk</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">23</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">20000</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">android</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">defaultConfig</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">versionCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">?:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">0</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionNameSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"-minApi23"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"minApi21"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"api"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minSdk</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">21</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">10000</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">android</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">defaultConfig</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">versionCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">?:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">0</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionNameSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"-minApi21"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">...</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">debug</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">release</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specifies the flavor dimensions you want to use. The order in which you</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// list the dimensions determines their priority, from highest to lowest,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// when Gradle merges variant sources and configurations. You must assign</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// each product flavor you configure to one of the flavor dimensions.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">flavorDimensions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"api"</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"mode"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">demo</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Assigns this product flavor to the "mode" flavor dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"mode"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">full</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"mode"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Configurations in the "api" product flavors override those in "mode"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// flavors and the defaultConfig block. Gradle determines the priority</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// between flavor dimensions based on the order in which they appear next</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// to the flavorDimensions property, with the first dimension having a higher</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// priority than the second, and so on.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minApi24</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"api"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minSdkVersion</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-mi">24</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// To ensure the target device receives the version of the app with</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// the highest compatible API level, assign version codes in increasing</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// value with API level.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-mi">30000</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">android</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">defaultConfig</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">versionCode</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionNameSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"-minApi24"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minApi23</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"api"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minSdkVersion</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-mi">23</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-mi">20000</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">android</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">defaultConfig</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">versionCode</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionNameSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"-minApi23"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minApi21</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"api"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minSdkVersion</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-mi">21</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionCode</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-mi">10000</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">android</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">defaultConfig</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">versionCode</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">versionNameSuffix</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"-minApi21"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">...</span></pre></devsite-code> </section></div> </div> <p> The number of build variants Gradle creates is equal to the product of the number of flavors in each flavor dimension and the number of build types you configure. When Gradle names each build variant or corresponding artifacts, product flavors belonging to higher-priority flavor dimension appear first, followed by those from lower-priority dimensions, followed by the build type.</p> <p>Using the previous build configuration as an example, Gradle creates a total of 12 build variants with the following naming scheme: </p> <ul> <li>Build variant: <code translate="no" dir="ltr">[minApi24, minApi23, minApi21][Demo, Full][Debug, Release]</code></li> <li>Corresponding APK: <code translate="no" dir="ltr">app-[minApi24, minApi23, minApi21]-[demo, full]-[debug, release].apk</code></li> <dt>For example,</dt> <dd>Build variant: <code translate="no" dir="ltr">minApi24DemoDebug</code></dd> <dd>Corresponding APK: <code translate="no" dir="ltr">app-minApi24-demo-debug.apk</code></dd> </ul> <p> In addition to the source set directories you can create for each individual product flavor and build variant, you can also create source set directories for each <em>combination</em> of product flavors. For example, you can create and add Java sources to the <code translate="no" dir="ltr">src/demoMinApi24/java/</code> directory, and Gradle uses those sources only when building a variant that combines those two product flavors.</p> <p>Source sets you create for product flavor combinations have a higher priority than source sets that belong to each individual product flavor. To learn more about source sets and how Gradle merges resources, read the section about how to <a href="#sourcesets">create source sets</a>. </p> <h3 id="filter-variants" data-text=" Filter variants " tabindex="-1"> Filter variants </h3> <p> Gradle creates a build variant for every possible combination of the product flavors and build types that you configure. However, there may be certain build variants that you don't need or that don't make sense in the context of your project. To remove certain build variant configurations, create a variant filter in your module-level <code translate="no" dir="ltr">build.gradle.kts</code> file. </p> <p> Using the build configuration from the previous section as an example, suppose you plan to support only API levels 23 and higher for the demo version of the app. You can use the <a href="/reference/tools/gradle-api/current/com/android/build/api/variant/VariantFilter"> <code translate="no" dir="ltr">variantFilter</code></a> block to filter out all build variant configurations that combine the "minApi21" and "demo" product flavors: </p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">flavorDimensions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">listOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"api"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"mode"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"demo"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"full"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"minApi24"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"minApi23"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"minApi21"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-n">androidComponents</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">beforeVariants</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">variantBuilder</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-></span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// To check for a certain build type, use variantBuilder.buildType == "<var translate="no"><buildType></var>"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">variantBuilder</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">productFlavors</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">containsAll</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">listOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"api"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">to</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"minApi21"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"mode"</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">to</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"demo"</span><span class="devsite-syntax-p">)))</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Gradle ignores any variants that satisfy the conditions above.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">variantBuilder</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">enable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">false</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">...</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">flavorDimensions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"api"</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"mode"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">demo</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">full</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minApi24</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minApi23</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">minApi21</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">variantFilter</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">variant</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-></span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">names</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">variant</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">flavors</span><span class="devsite-syntax-o">*.</span><span class="devsite-syntax-na">name</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// To check for a certain build type, use variant.buildType.name == "<var translate="no"><buildType></var>"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">(</span><span class="devsite-syntax-n">names</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">contains</span><span class="devsite-syntax-o">(</span><span class="devsite-syntax-s2">"minApi21"</span><span class="devsite-syntax-o">)</span><span class="devsite-syntax-w"> && </span><span class="devsite-syntax-n">names</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">contains</span><span class="devsite-syntax-o">(</span><span class="devsite-syntax-s2">"demo"</span><span class="devsite-syntax-o">))</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Gradle ignores any variants that satisfy the conditions above.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">setIgnore</span><span class="devsite-syntax-o">(</span><span class="devsite-syntax-kc">true</span><span class="devsite-syntax-o">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">...</span></pre></devsite-code> </section></div> </div> <p> Once you add a variant filter to your build configuration and click <b>Sync Now</b> in the notification bar, Gradle ignores any build variants that meet the conditions you specify. The build variants no longer appear in the menu when you click <b>Build > Select Build Variant</b> from the menu bar or <b>Build Variants</b> <img src="/static/studio/images/buttons/window-monitor.png" class="inline-icon" alt=""> in the tool window bar. </p> <h2 id="sourcesets" data-text=" Create source sets " tabindex="-1"> Create source sets </h2> <p> By default, Android Studio creates the <code translate="no" dir="ltr">main/</code> <a href="/studio/build#sourcesets">source set</a> and directories for everything you want to share between all your build variants. However, you can create new source sets to control exactly which files Gradle compiles and packages for specific build types, product flavors, combinations of product flavors (when using <a href="#flavor-dimensions">flavor dimensions</a>), and build variants.</p> <p>For example, you can define basic functionality in the <code translate="no" dir="ltr">main/</code> source set and use product flavor source sets to change the branding of your app for different clients, or include special permissions and logging functionality only for build variants that use the debug build type. </p> <p> Gradle expects source set files and directories to be organized in a certain way, similar to the <code translate="no" dir="ltr">main/</code> source set. For example, Gradle expects Kotlin or Java class files that are specific to your "debug" build type to be located in the <code translate="no" dir="ltr">src/debug/kotlin/</code> or <code translate="no" dir="ltr">src/debug/java/</code> directories. </p> <p> The Android Gradle plugin provides a useful Gradle task that shows you how to organize your files for each of your build types, product flavors, and build variants. For example, the following sample from the task output describes where Gradle expects to find certain files for the "debug" build type: </p> <div></div><devsite-code><pre class="none" translate="no" dir="ltr" is-upgraded> ------------------------------------------------------------ Project :app ------------------------------------------------------------ ... debug ---- Compile configuration: debugCompile build.gradle name: android.sourceSets.debug Java sources: [app/src/debug/java] Kotlin sources: [app/src/debug/kotlin, app/src/debug/java] Manifest file: app/src/debug/AndroidManifest.xml Android resources: [app/src/debug/res] Assets: [app/src/debug/assets] AIDL sources: [app/src/debug/aidl] RenderScript sources: [app/src/debug/rs] JNI sources: [app/src/debug/jni] JNI libraries: [app/src/debug/jniLibs] Java-style resources: [app/src/debug/resources] </pre></devsite-code> <p> To view this output, proceed as follows: </p> <ol> <li>Click <b>Gradle</b> in the tool window bar. </li> <li><p>Navigate to <b>MyApplication > Tasks > android</b> and double-click <b>sourceSets</b>.</p> <p>To see the <b>Tasks</b> folder, you must let Gradle build the task list during sync. To do so, follow these steps: <ol> <li>Click <b>File > Settings > Experimental</b> (<b>Android Studio > Settings > Experimental</b> on macOS).</li> <li>Deselect <b>Do not build Gradle task list during Gradle sync</b>.</li> </ol> </li> <li>After Gradle executes the task, the <b>Run</b> window opens to display the output.</li> </ol> <p class="note"> <strong>Note:</strong> The task output also shows you how to organize source sets for files you want to use to run tests for your app, such as the <code translate="no" dir="ltr">test/</code> and <code translate="no" dir="ltr">androidTest/</code> <a href="/studio/test/advanced-test-setup#create-instrumented-test-for-build-variant">testing source sets</a>. </p> <p> When you create a new build variant, Android Studio doesn't create the source set directories for you, but it does give you a few options to help you. For example, to create just the <code translate="no" dir="ltr">java/</code> directory for your "debug" build type: </p> <ol> <li>Open the <strong>Project</strong> pane and select the <strong>Project</strong> view from the menu at the top of the pane. </li> <li>Navigate to <code translate="no" dir="ltr">MyProject/app/src/</code>. </li> <li>Right-click the <code translate="no" dir="ltr">src</code> directory and select <strong>New</strong> > <strong>Directory</strong>. </li> <li>From the menu under <strong>Gradle Source Sets</strong>, select <strong>full/java</strong>. </li> <li>Press <kbd>Enter</kbd>. </li> </ol> <p> Android Studio creates a source set directory for your debug build type and then creates the <code translate="no" dir="ltr">java/</code> directory inside it. Alternatively, Android Studio can create the directories for you when you add a new file to your project for a specific build variant.</p> <p>For example, to create a values XML file for your "debug" build type: </p> <ol> <li>In the <strong>Project</strong> pane, right-click the <code translate="no" dir="ltr">src</code> directory and select <strong>New</strong> > <strong>XML</strong> > <strong>Values XML File</strong>. </li> <li>Enter the name for the XML file or keep the default name. </li> <li>From the menu next to <strong>Target Source Set</strong>, select <strong>debug</strong>. </li> <li>Click <strong>Finish</strong>. </li> </ol> <p> Because the "debug" build type was specified as the target source set, Android Studio automatically creates the necessary directories when it creates the XML file. The resulting directory structure looks like figure 1. </p> <img src="/static/images/tools/debug-directories_2-1_2x.png" alt="" width= "399"> <p class="img-caption"> <strong>Figure 1.</strong> New source set directories for the "debug" build type. </p> <p> Active source sets have a green indicator in their icon to show that they are active. The <code translate="no" dir="ltr">debug</code> source set is suffixed with <code translate="no" dir="ltr">[main]</code> to show that it will be merged in to the <code translate="no" dir="ltr">main</code> source set. </p> <p> Using the same procedure, you can also create source set directories for product flavors, such as <code translate="no" dir="ltr">src/demo/</code>, and build variants, such as <code translate="no" dir="ltr">src/demoDebug/</code>. Additionally, you can create testing source sets that target specific build variants, such as <code translate="no" dir="ltr">src/androidTestDemoDebug/</code>. To learn more, read about <a href="/studio/test/advanced-test-setup#create-instrumented-test-for-build-variant">testing source sets</a>. </p> <h3 id="configure-sourcesets" data-text=" Change default source set configurations " tabindex="-1"> Change default source set configurations </h3> <p> If you have sources that are not organized into the default source set file structure that Gradle expects, as described in the previous section about <a href="#sourcesets">creating source sets</a>, you can use the <a href="/reference/tools/gradle-api/current/com/android/build/api/dsl/AndroidSourceSet"> <code translate="no" dir="ltr">sourceSets</code></a> block to change where Gradle looks to gather files for each component of a source set.</p> <p>The <code translate="no" dir="ltr">sourceSets</code> block must be in the <code translate="no" dir="ltr">android</code> block. You don't need to relocate the source files; you only need to provide Gradle with the path(s), relative to the module-level <code translate="no" dir="ltr">build.gradle.kts</code> file, where Gradle can find files for each source set component. To learn which components you can configure and whether you can map them to multiple files or directories, see the <a href="/reference/tools/gradle-api">Android Gradle plugin API reference</a>. </p> <p> The following code sample maps sources from the <code translate="no" dir="ltr">app/other/</code> directory to certain components of the <code translate="no" dir="ltr">main</code> source set and changes the root directory of the <code translate="no" dir="ltr">androidTest</code> source set: </p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Encapsulates configurations for the main source set.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">sourceSets</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"main"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Changes the directory for Java sources. The default directory is</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// 'src/main/java'.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">java</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">setSrcDirs</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">listOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"other/java"</span><span class="devsite-syntax-p">))</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// If you list multiple directories, Gradle uses all of them to collect</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// sources. Because Gradle gives these directories equal priority, if</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// you define the same resource in more than one directory, you receive an</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// error when merging resources. The default directory is 'src/main/res'.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">res</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">setSrcDirs</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">listOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"other/res1"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"other/res2"</span><span class="devsite-syntax-p">))</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// <b>Note:</b> Avoid specifying a directory that is a parent to one</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// or more other directories you specify. For example, avoid the following:</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings']</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specify either only the root 'other/res1' directory or only the</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// nested 'other/res1/layouts' and 'other/res1/strings' directories.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// For each source set, you can specify only one Android manifest.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// By default, Android Studio creates a manifest for your main source</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// set in the src/main/ directory.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">manifest</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">srcFile</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"other/AndroidManifest.xml"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Create additional blocks to configure other source sets.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">sourceSets</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"androidTest"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// If all the files for a source set are located under a single root</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// directory, you can specify that directory using the setRoot property.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// When gathering sources for the source set, Gradle looks only in locations</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// relative to the root directory you specify. For example, after applying the</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// configuration below for the androidTest source set, Gradle looks for Java</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// sources only in the src/tests/java/ directory.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">setRoot</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"src/tests"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">...</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">sourceSets</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Encapsulates configurations for the main source set.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">main</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Changes the directory for Java sources. The default directory is</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// 'src/main/java'.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">java</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">srcDirs</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">[</span><span class="devsite-syntax-s1">'other/java'</span><span class="devsite-syntax-o">]</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// If you list multiple directories, Gradle uses all of them to collect</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// sources. Because Gradle gives these directories equal priority, if</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// you define the same resource in more than one directory, you receive an</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// error when merging resources. The default directory is 'src/main/res'.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">res</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">srcDirs</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">[</span><span class="devsite-syntax-s1">'other/res1'</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'other/res2'</span><span class="devsite-syntax-o">]</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// <b>Note:</b> Avoid specifying a directory that is a parent to one</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// or more other directories you specify. For example, avoid the following:</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings']</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specify either only the root 'other/res1' directory or only the</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// nested 'other/res1/layouts' and 'other/res1/strings' directories.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// For each source set, you can specify only one Android manifest.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// By default, Android Studio creates a manifest for your main source</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// set in the src/main/ directory.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">manifest</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">srcFile</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'other/AndroidManifest.xml'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Create additional blocks to configure other source sets.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">androidTest</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// If all the files for a source set are located under a single root</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// directory, you can specify that directory using the setRoot property.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// When gathering sources for the source set, Gradle looks only in locations</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// relative to the root directory you specify. For example, after applying the</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// configuration below for the androidTest source set, Gradle looks for Java</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// sources only in the src/tests/java/ directory.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">setRoot</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'src/tests'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">...</span></pre></devsite-code> </section></div> </div> <p> Note that a source directory can only belong to one source set. For example, you can't share the same test sources with both the <code translate="no" dir="ltr">test</code> and <code translate="no" dir="ltr">androidTest</code> source sets. This is because Android Studio creates separate IntelliJ modules for each source set and can't support duplicate content roots across source sets. </p> <h3 id="sourceset-build" data-text=" Build with source sets " tabindex="-1"> Build with source sets </h3> <p> You can use source set directories to contain the code and resources you want packaged only with certain configurations. For example, if you are building the "demoDebug" build variant, which is the crossproduct of a "demo" product flavor and "debug" build type, Gradle looks at these directories and gives them the following priority: </p> <ol> <li> <code translate="no" dir="ltr">src/demoDebug/</code> (build variant source set) </li> <li> <code translate="no" dir="ltr">src/debug/</code> (build type source set) </li> <li> <code translate="no" dir="ltr">src/demo/</code> (product flavor source set) </li> <li> <code translate="no" dir="ltr">src/main/</code> (main source set) </li> </ol> <p> Source sets created for combinations of product flavors must include all flavor dimensions. For example, the build variant source set must be the combination of the build type and all flavor dimensions. Merging code and resources involving folders that cover multiple but not all flavor dimensions is not supported. </p> <p>If you <a href="#flavor-dimensions">combine multiple product flavors</a>, priority between the product flavors is determined by the flavor dimension they belong to. When listing flavor dimensions with the <a href="/reference/tools/gradle-api/current/com/android/build/api/dsl/ProductFlavor#dimension"> <code translate="no" dir="ltr">android.flavorDimensions</code></a> property, product flavors that belong to the first flavor dimension you list have a higher priority than those belonging to the second flavor dimension, and so on. Additionally, source sets you create for combinations of product flavors have a higher priority than source sets that belong to an individual product flavor. </p> <p> The priority order determines which source set has a higher priority when Gradle combines code and resources. Because the <code translate="no" dir="ltr">demoDebug/</code> source set directory likely contains files that are specific to that build variant, if <code translate="no" dir="ltr">demoDebug/</code> includes a file that is also defined in <code translate="no" dir="ltr">debug/</code>, Gradle uses the file in the <code translate="no" dir="ltr">demoDebug/</code> source set. Similarly, Gradle gives files in the build type and product flavor source sets a higher priority than the same files in <code translate="no" dir="ltr">main/</code>. Gradle considers this priority order when applying the following build rules: </p> <ul> <li>All source code in the <code translate="no" dir="ltr">kotlin/</code> or <code translate="no" dir="ltr">java/</code> directories are compiled together to generate a single output. <p class="note"> <strong>Note:</strong> For a given build variant, Gradle throws a build error if it encounters two or more source set directories that have defined the same Kotlin or Java class. For example, when building a debug app, you can't define both <code translate="no" dir="ltr">src/debug/Utility.kt</code> and <code translate="no" dir="ltr">src/main/Utility.kt</code>, because Gradle looks at both these directories during the build process and throws a "duplicate class" error. If you want different versions of <code translate="no" dir="ltr">Utility.kt</code> for different build types, each build type must define its own version of the file and not include it in the <code translate="no" dir="ltr">main/</code> source set. </p> </li> <li>Manifests are merged together into a single manifest. Priority is given in the same order as the list in the previous example. That is, manifest settings for a build type override the manifest settings for a product flavor, and so on. To learn more, read about <a href="/studio/build/manage-manifests#merge-manifests">manifest merging</a>. </li> <li>Files in the <code translate="no" dir="ltr">values/</code> directories are merged together. If two files have the same name, such as two <code translate="no" dir="ltr">strings.xml</code> files, priority is given in the same order as the list in the previous example. That is, values defined in a file in the build type source set override the values defined in the same file in a product flavor, and so on. </li> <li>Resources in the <code translate="no" dir="ltr">res/</code> and <code translate="no" dir="ltr">asset/</code> directories are packaged together. If there are resources with the same name defined in two or more source sets, priority is given in the same order as the list in the previous example. </li> <li>Gradle gives resources and manifests included with library module dependencies the lowest priority when building the app. </li> </ul> <h2 id="dependencies" data-text=" Declare dependencies " tabindex="-1"> Declare dependencies </h2> <p>To configure a dependency for a specific build variant or <a href="/studio/test/advanced-test-setup#create-instrumented-test-for-build-variant">testing source set</a>, prefix the name of the build variant or testing source set before the <code translate="no" dir="ltr">Implementation</code> keyword, as shown in the following example: <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">dependencies</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Adds the local "mylibrary" module as a dependency to the "free" flavor.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"freeImplementation"</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">project</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">":mylibrary"</span><span class="devsite-syntax-p">))</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Adds a remote binary dependency only for local tests.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">testImplementation</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"junit:junit:4.12"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Adds a remote binary dependency only for the instrumented test APK.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">androidTestImplementation</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"com.android.support.test.espresso:espresso-core:3.6.1"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">dependencies</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Adds the local "mylibrary" module as a dependency to the "free" flavor.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">freeImplementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">project</span><span class="devsite-syntax-o">(</span><span class="devsite-syntax-s2">":mylibrary"</span><span class="devsite-syntax-o">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Adds a remote binary dependency only for local tests.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">testImplementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'junit:junit:4.12'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Adds a remote binary dependency only for the instrumented test APK.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">androidTestImplementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'com.android.support.test.espresso:espresso-core:3.6.1'</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section></div> </div> <p>For more information about configuring dependencies, see <a href="/studio/build/dependencies">Add build dependencies</a>. </p> <h2 id="variant_aware" data-text=" Use variant-aware dependency management " tabindex="-1"> Use variant-aware dependency management </h2> <p> The Android Gradle plugin 3.0.0 and higher includes a new dependency mechanism that automatically matches variants when consuming a library. This means an app's <code translate="no" dir="ltr">debug</code> variant automatically consumes a library's <code translate="no" dir="ltr">debug</code> variant, and so on. It also works when using flavors: an app's <code translate="no" dir="ltr">freeDebug</code> variant will consume a library's <code translate="no" dir="ltr">freeDebug</code> variant. </p> <p> For the plugin to accurately match variants, you need to <a href="#resolve_matching_errors">provide matching fallbacks</a> as described in the following section, for instances where a direct match is not possible.</p> <p>For example, suppose your app configures a build type called "staging", but one of its library dependencies doesn't. When the plugin tries to build the "staging" version of your app, it won't know which version of the library to use, and you'll see an error message similar to the following: </p> <div></div><devsite-code><pre class="none" translate="no" dir="ltr" is-upgraded> Error:Failed to resolve: Could not resolve project :mylibrary. Required by: project :app </pre></devsite-code> <h3 id="resolve_matching_errors" data-text=" Resolve build errors related to variant matching " tabindex="-1"> Resolve build errors related to variant matching </h3> <p> The plugin includes DSL elements to help you control how Gradle resolves situations in which a direct variant match between an app and a dependency is not possible.</p> The following is a list of issues related to variant-aware dependency matching and how to solve them using DSL properties: </p> <ul> <li><p><b>Your app includes a build type</nobr> that a library dependency does not.</b> </p> <p> For example, your app includes a "staging" build type, but a dependency includes only "debug" and "release" build types. </p> <p> Note that there is no issue when a library dependency includes a build type that your app doesn't. That's because the plugin never requests that build type from the dependency. </p> <p> Use <code translate="no" dir="ltr">matchingFallbacks</code> to specify alternative matches for a given build type, as shown here: </p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-c1">// In the app's build.gradle.kts file.</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"release"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"staging"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specifies a sorted list of fallback build types that the</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// plugin can try to use when a dependency does not include a</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// "staging" build type. You may specify as many fallbacks as you</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// like, and the plugin selects the first build type that's</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// available in the dependency.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">matchingFallbacks</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">listOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"debug"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"qa"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"release"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-c1">// In the app's build.gradle file.</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">debug</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">release</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">staging</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specifies a sorted list of fallback build types that the</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// plugin can try to use when a dependency does not include a</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// "staging" build type. You may specify as many fallbacks as you</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// like, and the plugin selects the first build type that's</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// available in the dependency.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">matchingFallbacks</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">[</span><span class="devsite-syntax-s1">'debug'</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'qa'</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'release'</span><span class="devsite-syntax-o">]</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section></div> </div> </li> <li><p><b>For a given flavor dimension that exists in both the app and its library dependency, your app includes flavors that the library does not.</b> </p> <p> For example, both your app and its library dependencies include a "tier" flavor dimension. However, the "tier" dimension in the app includes "free" and "paid" flavors, but a dependency includes only "demo" and "paid" flavors for the same dimension. </p> <p> Note that for a given flavor dimension that exists in both the app and its library dependencies, there is no issue when a library includes a product flavor that your app does not. That's because the plugin never requests that flavor from the dependency. </p> <p> Use <code translate="no" dir="ltr">matchingFallbacks</code> to specify alternative matches for the app's "free" product flavor, as shown here: </p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-c1">// In the app's build.gradle.kts file.</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Don't configure matchingFallbacks in the defaultConfig block.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Instead, specify fallbacks for a given product flavor in the</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// productFlavors block, as shown below.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">flavorDimensions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"tier"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"paid"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"tier"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Because the dependency already includes a "paid" flavor in its</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// "tier" dimension, you don't need to provide a list of fallbacks</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// for the "paid" flavor.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"free"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"tier"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specifies a sorted list of fallback flavors that the plugin</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// can try to use when a dependency's matching dimension does</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// not include a "free" flavor. Specify as many</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// fallbacks as you like; the plugin selects the first flavor</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// that's available in the dependency's "tier" dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">matchingFallbacks</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">listOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"demo"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"trial"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-c1">// In the app's build.gradle file.</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Don't configure matchingFallbacks in the defaultConfig block.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Instead, specify fallbacks for a given product flavor in the</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// productFlavors block, as shown below.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">flavorDimensions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'tier'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">paid</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'tier'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Because the dependency already includes a "paid" flavor in its</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// "tier" dimension, you don't need to provide a list of fallbacks</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// for the "paid" flavor.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">free</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'tier'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specifies a sorted list of fallback flavors that the plugin</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// can try to use when a dependency's matching dimension does</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// not include a "free" flavor. Specify as many</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// fallbacks as you like; the plugin selects the first flavor</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// that's available in the dependency's "tier" dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">matchingFallbacks</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">[</span><span class="devsite-syntax-s1">'demo'</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'trial'</span><span class="devsite-syntax-o">]</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section></div> </div> </li> <li><p><b>A library dependency includes a flavor dimension that your app does not.</b> </p> <p> For example, a library dependency includes flavors for a "minApi" dimension, but your app includes flavors for only the "tier" dimension. When you want to build the "freeDebug" version of your app, the plugin doesn't know whether to use the "minApi23Debug" or "minApi18Debug" version of the dependency. </p> <p> Note that there is no issue when your app includes a flavor dimension that a library dependency doesn't. That's because the plugin matches flavors of only the dimensions that exist in the dependency. For example, if a dependency does not include a dimension for ABIs, the "freeX86Debug" version of your app would use the "freeDebug" version of the dependency. </p> <p> Use <code translate="no" dir="ltr">missingDimensionStrategy</code> in the <code translate="no" dir="ltr">defaultConfig</code> block to specify the default flavor for the plugin to select from each missing dimension, as shown in the following sample. You can also override your selections in the <code translate="no" dir="ltr">productFlavors</code> block, so each flavor can specify a different matching strategy for a missing dimension. </p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-c1">// In the app's build.gradle.kts file.</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specifies a sorted list of flavors that the plugin can try to use from</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// a given dimension. This tells the plugin to select the "minApi18" flavor</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// when encountering a dependency that includes a "minApi" dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// You can include additional flavor names to provide a</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// sorted list of fallbacks for the dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">missingDimensionStrategy</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"minApi"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"minApi18"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"minApi23"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specify a missingDimensionStrategy property for each</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// dimension that exists in a local dependency but not in your app.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">missingDimensionStrategy</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"abi"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"x86"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"arm64"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">flavorDimensions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"tier"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"free"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"tier"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// You can override the default selection at the product flavor</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// level by configuring another missingDimensionStrategy property</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// for the "minApi" dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">missingDimensionStrategy</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"minApi"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"minApi23"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"minApi18"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"paid"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-c1">// In the app's build.gradle file.</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specifies a sorted list of flavors that the plugin can try to use from</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// a given dimension. This tells the plugin to select the "minApi18" flavor</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// when encountering a dependency that includes a "minApi" dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// You can include additional flavor names to provide a</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// sorted list of fallbacks for the dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">missingDimensionStrategy</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'minApi'</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'minApi18'</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'minApi23'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Specify a missingDimensionStrategy property for each</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// dimension that exists in a local dependency but not in your app.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">missingDimensionStrategy</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'abi'</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'x86'</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'arm64'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">flavorDimensions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'tier'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">productFlavors</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">free</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">dimension</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'tier'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// You can override the default selection at the product flavor</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// level by configuring another missingDimensionStrategy property</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// for the 'minApi' dimension.</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">missingDimensionStrategy</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'minApi'</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'minApi23'</span><span class="devsite-syntax-o">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s1">'minApi18'</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">paid</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section></div> </div> </li> </ul> <p> For more information, see <a href="/reference/tools/gradle-api/7.0/com/android/build/api/dsl/ProductFlavor#matchingfallbacks"><code translate="no" dir="ltr">matchingFallbacks</code></a> and <a href="/reference/tools/gradle-api/7.0/com/android/build/api/dsl/BaseFlavor#missingdimensionstrategy_1"><code translate="no" dir="ltr">missingDimensionStrategy</code></a> in the Android Gradle plugin DSL reference. </p> <h2 id="signing" data-text=" Configure signing settings " tabindex="-1"> Configure signing settings </h2> <p> Gradle doesn't sign your release build's APK or AAB unless you explicitly define a signing configuration for this build. If you don't have a signing key yet, <a href="/studio/publish/app-signing#generate-key">generate an upload key and keystore</a> using Android Studio. </p> <p> To manually configure the signing configurations for your release build type using Gradle build configurations: </p> <ol> <li> Create a keystore. A <em>keystore</em> is a binary file that contains a set of private keys. You must keep your keystore in a safe and secure place. </li> <li> Create a private key. A <em>private key</em> is used to sign your app for distribution and is never included with the app or disclosed to unauthorized third parties. </li> <li> <p> Add the signing configuration to the module-level <code translate="no" dir="ltr">build.gradle.kts</code> file: </p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">signingConfigs</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">create</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"release"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">storeFile</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">file</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"myreleasekey.keystore"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">storePassword</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"password"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">keyAlias</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"MyReleaseKey"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">keyPassword</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"password"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"release"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">signingConfig</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">signingConfigs</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getByName</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"release"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">defaultConfig</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{...}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">signingConfigs</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">release</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">storeFile</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">file</span><span class="devsite-syntax-o">(</span><span class="devsite-syntax-s2">"myreleasekey.keystore"</span><span class="devsite-syntax-o">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">storePassword</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"password"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">keyAlias</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"MyReleaseKey"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">keyPassword</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"password"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildTypes</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">release</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">signingConfig</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">signingConfigs</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">release</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section></div> </div> </li> </ol> <p class="note"> <strong>Note:</strong> Including the passwords for your release key and keystore inside the build file is not a good security practice. Instead, configure the build file to obtain these passwords from environment variables or have the build process prompt you for these passwords. </p> <p> To obtain these passwords from environment variables: </p> <div> <div class="ds-selector-tabs"><section><h3 class="two-line-tab" tab-label="build.gradle.kts" id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">storePassword</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">System</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getenv</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"KSTOREPWD"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">keyPassword</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">System</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">getenv</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"KEYPWD"</span><span class="devsite-syntax-p">)</span></pre></devsite-code> </section><section><h3 class="two-line-tab" tab-label="build.gradle" id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">storePassword</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">System</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">getenv</span><span class="devsite-syntax-o">(</span><span class="devsite-syntax-s2">"KSTOREPWD"</span><span class="devsite-syntax-o">)</span> <span class="devsite-syntax-n">keyPassword</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">System</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-na">getenv</span><span class="devsite-syntax-o">(</span><span class="devsite-syntax-s2">"KEYPWD"</span><span class="devsite-syntax-o">)</span></pre></devsite-code> </section></div> </div> <p> Alternatively, you can load the keystore from a local properties file. For security reasons, don't add this file to source control. Instead, set it up locally for each developer. To learn more, read <a href="/studio/publish/app-signing#secure-shared-keystore"> Remove signing information from your build files</a>. </p> <p> After you complete this process, you can distribute your app and publish it on Google Play. </p> <p class="warning"> <strong>Warning:</strong> Keep your keystore and private key in a safe and secure place, and ensure that you have secure backups of them. If you use Play App Signing and you lose your upload key, you can <a href="https://support.google.com/googleplay/android-developer/answer/9842756#reset">request a reset</a> using the Play Console. If you are publishing an app without Play App Signing (for apps created before August 2021) and you lose your app signing key, you will not be able to publish any updates to your app, since you must always sign all versions of your app with the same key. </p> <h3 id="wear-apps" data-text=" Signing Wear OS apps " tabindex="-1"> Signing Wear OS apps </h3> <p> When publishing Wear OS apps, both the watch APK and optional phone APK must be signed with the same key. For more information on packaging and signing Wear OS apps, see <a href="/training/wearables/packaging">Package and distribute Wear apps</a>. </p> <devsite-hats-survey class="nocontent" hats-id="VxqvKSur40kxBYCLVTd0SSGykbno" listnr-id="5207477"></devsite-hats-survey> </div> <devsite-recommendations display="in-page" hidden yield> </devsite-recommendations> <devsite-thumb-rating position="footer"> </devsite-thumb-rating> <devsite-recommendations id="recommendations-link" yield></devsite-recommendations> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-content-footer class="nocontent"> <p>Content and code samples on this page are subject to the licenses described in the <a href="/license">Content License</a>. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.</p> <p>Last updated 2025-02-13 UTC.</p> </devsite-content-footer> <devsite-notification link="https://google.qualtrics.com/jfe/form/SV_cRR9tonbkUQYb5Q?link=dac" link-text="Take survey" message="Please help us improve the Android Developer experience by taking a short survey." > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-02-13 UTC."],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> <nav class="devsite-footer-promos nocontent" aria-label="Promotions"> <ul class="devsite-footer-promos-list"> <li class="devsite-footer-promo"> <a href="//x.com/AndroidDev" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer X Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-x_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="X"> <img class="devsite-footer-promo-icon" src="/_static/android/images/logo-x.svg" loading="lazy" alt="X"> </picture> <span class="devsite-footer-promo-label"> X </span> </a> <div class="devsite-footer-promo-description">Follow @AndroidDev on X</div> </li> <li class="devsite-footer-promo"> <a href="//www.youtube.com/user/androiddevelopers" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer YouTube Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-youtube_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="YouTube"> <img class="devsite-footer-promo-icon" src="//www.gstatic.com/images/icons/material/product/2x/youtube_48dp.png" loading="lazy" alt="YouTube"> </picture> <span class="devsite-footer-promo-label"> YouTube </span> </a> <div class="devsite-footer-promo-description">Check out Android Developers on YouTube</div> </li> <li class="devsite-footer-promo"> <a href="//www.linkedin.com/showcase/androiddev" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer LinkedIn Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-linkedin_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="LinkedIn"> <img class="devsite-footer-promo-icon" src="/_static/android/images/logo-linkedin.svg" loading="lazy" alt="LinkedIn"> </picture> <span class="devsite-footer-promo-label"> LinkedIn </span> </a> <div class="devsite-footer-promo-description">Connect with the Android Developers community on LinkedIn</div> </li> </ul> </nav> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">More Android</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com/enterprise/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Android for Enterprise </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com/security-center/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Security </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//source.android.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Source </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/news" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > News </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//android-developers.googleblog.com/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > Blog </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/podcasts" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" > Podcasts </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Discover</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/games" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Gaming </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/ml" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Machine Learning </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/health-and-fitness" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Health & Fitness </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/media" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Camera & Media </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/privacy" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Privacy </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/training/connectivity/5g" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > 5G </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Android Devices</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/large-screens" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Large screens </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/wear" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Wear OS </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/chrome-os" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > ChromeOS devices </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/cars" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Android for cars </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/tv" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android TV </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Releases</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/15" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android 15 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/14" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Android 14 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/13" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Android 13 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/12" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Android 12 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/11" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android 11 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/10" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > Android 10 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/pie" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" > Pie </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Documentation and Downloads</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/studio/intro" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android Studio guide </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/guide" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Developers guides </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/reference" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > API reference </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/studio" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Download Studio </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/ndk" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android NDK </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Support</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="//issuetracker.google.com/issues/new?component=190923&template=841312" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Report platform bug </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//issuetracker.google.com/issues/new?component=192697" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Report documentation bug </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//support.google.com/googleplay/android-developer" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Google Play support </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://g.co/userresearch/androiddeveloperfooter" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Join research studies </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-sites" aria-label="Other Google Developers websites"> <a href="https://developers.google.com/" class="devsite-footer-sites-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Developers Link"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/images/lockup-google-for-developers-dark-theme.svg" media="(prefers-color-scheme: none)" class="devsite-dark-theme" loading="lazy" alt="Google Developers"> <img class="devsite-footer-sites-logo" src="https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/images/lockup-google-for-developers.svg" loading="lazy" alt="Google Developers"> </picture> </a> <ul class="devsite-footer-sites-list"> <li class="devsite-footer-sites-item"> <a href="//developer.android.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Android Link" > Android </a> </li> <li class="devsite-footer-sites-item"> <a href="//developer.chrome.com/home" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Chrome Link" > Chrome </a> </li> <li class="devsite-footer-sites-item"> <a href="//firebase.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Firebase Link" > Firebase </a> </li> <li class="devsite-footer-sites-item"> <a href="//cloud.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Cloud Platform Link" > Google Cloud Platform </a> </li> <li class="devsite-footer-sites-item"> <a href="//developers.google.com/products/" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer All products Link" > All products </a> </li> </ul> </nav> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" > Privacy </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/license" data-category="Site-Wide Custom Events" data-label="Footer License link" > License </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/distribute/marketing-tools/brand-guidelines" data-category="Site-Wide Custom Events" data-label="Footer Brand guidelines link" > Brand guidelines </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" aria-hidden="true" > Manage cookies </a> </li> <li class="devsite-footer-utility-item devsite-footer-utility-button"> <span class="devsite-footer-utility-description">Get news and tips by email</span> <a class="devsite-footer-utility-link gc-analytics-event" href="/updates" data-category="Site-Wide Custom Events" data-label="Footer Subscribe link" > Subscribe </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[]</script> <script type="application/json" tag-management>{"at": "True", "ga4": [{"id": "G-QFRN08RN6E", "purpose": 0}], "ga4p": [{"id": "G-QFRN08RN6E", "purpose": 0}], "gtm": [{"id": "GTM-KMSWPCJ", "purpose": 0}], "parameters": {"internalUser": "False", "language": {"machineTranslated": "False", "requested": "en", "served": "en"}, "pageType": "article", "projectName": "Android Studio", "signedIn": "False", "tenant": "android", "recommendations": {"sourcePage": "", "sourceType": 0, "sourceRank": 0, "sourceIdenticalDescriptions": 0, "sourceTitleWords": 0, "sourceDescriptionWords": 0, "experiment": ""}, "experiment": {"ids": ""}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <android-fully-clickable target=" .android-case-study .devsite-landing-row-item, .android-grouped-resources .devsite-landing-row-item, .android-grouped-resources-contained--primary .devsite-landing-row-item, .android-grouped-resources-contained--secondary .devsite-landing-row-item, .android-grouped-resources-contained--tertiary .devsite-landing-row-item, .android-grouped-resources-uncontained--primary .devsite-landing-row-item, .android-grouped-resources-uncontained--secondary .devsite-landing-row-item, .android-grouped-resources-uncontained--tertiary .devsite-landing-row-item, .android-guide-cards .devsite-landing-row-item, .android-illustrated-resources-index .devsite-landing-row-item, .android-illustrated-resources-primary .devsite-landing-row-item, .android-illustrated-resources-secondary .devsite-landing-row-item, .android-illustrated-resources-secondary-small .devsite-landing-row-item, .android-illustrated-resources-tertiary .devsite-landing-row-item, .android-illustrated-resources-tertiary-small .devsite-landing-row-item, .android-promo .devsite-landing-row-item, .android-quick-link, .android-samples .devsite-card-wrapper, .fully-clickable" watch=".android-samples, devsite-content"></android-fully-clickable> <script nonce="nAMYGfSF7YppQOpxHViWLOjzZgjqJ9"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/js/app_loader.js', '[3,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android","https://android-dot-devsite-v2-prod.appspot.com",null,null,["/_pwa/android/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/images/favicon.svg","https://www.gstatic.com/devrel-devsite/prod/v38a693baeb774512feb42f10aac8f755d8791ed41119b5be7a531f8e16f8279f/android/images/lockup.svg","https://fonts.googleapis.com/css?family=Google+Sans:400,500,600,700|Google+Sans+Text:400,400italic,500,500italic,600,600italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,116,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyAP-jjEJBzmIyKR4F-3XITp8yM9T1gEEI8","AIzaSyB6xiKGDR5O3Ak2okS4rLkauxGUG7XP0hg","developer.android.com","AIzaSyAQk0fBONSGUqCNznf6Krs82Ap1-NV6J4o","AIzaSyCCxcqdrZ_7QMeLCRY20bh_SXdAYqy70KY",null,null,null,["Profiles__enable_page_saving","MiscFeatureFlags__developers_footer_dark_image","Experiments__reqs_query_experiments","MiscFeatureFlags__enable_variable_operator","Profiles__require_profile_eligibility_for_signin","Profiles__enable_public_developer_profiles","Profiles__enable_recognition_badges","Profiles__enable_stripe_subscription_management","MiscFeatureFlags__enable_view_transitions","Cloud__enable_free_trial_server_call","Profiles__enable_completequiz_endpoint","TpcFeatures__enable_mirror_tenant_redirects","Analytics__enable_clearcut_logging","MiscFeatureFlags__enable_firebase_utm","DevPro__enable_developer_subscriptions","Cloud__enable_cloud_shell_fte_user_flow","CloudShell__cloud_code_overflow_menu","Profiles__enable_completecodelab_endpoint","Cloud__enable_cloudx_ping","Search__enable_ai_eligibility_checks","Profiles__enable_join_program_group_endpoint","BookNav__enable_tenant_cache_key","Profiles__enable_developer_profiles_callout","DevPro__enable_cloud_innovators_plus","MiscFeatureFlags__developers_footer_image","Profiles__enable_release_notes_notifications","Profiles__enable_complete_playlist_endpoint","MiscFeatureFlags__enable_dark_theme","Cloud__enable_cloud_shell","Search__enable_page_map","Significatio__enable_by_tenant","Search__enable_ai_search_summaries","MiscFeatureFlags__enable_explain_this_code","Cloud__enable_cloud_facet_chat","MiscFeatureFlags__enable_project_variables","Search__enable_dynamic_content_confidential_banner","Search__enable_suggestions_from_borg","Cloud__enable_llm_concierge_chat","Profiles__enable_profile_collections","MiscFeatureFlags__emergency_css","Profiles__enable_awarding_url","Cloud__enable_cloudx_experiment_ids","Profiles__enable_dashboard_curated_recommendations","Cloud__enable_cloud_dlp_service","Cloud__enable_legacy_calculator_redirect","CloudShell__cloud_shell_button","TpcFeatures__enable_unmirrored_page_left_nav","Concierge__enable_pushui","EngEduTelemetry__enable_engedu_telemetry"],null,null,"AIzaSyBLEMok-5suZ67qRPzx0qUtbnLmyT_kCVE","https://developerscontentserving-pa.googleapis.com","AIzaSyCM4QpTRSqP5qI4Dvjt4OAScIN8sOUlO-k","https://developerscontentsearch-pa.googleapis.com",2,4,null,"https://developerprofiles-pa.googleapis.com",[3,"android","Android Developers","developer.android.com",null,"android-dot-devsite-v2-prod.appspot.com",null,null,[null,1,null,null,null,null,null,null,null,null,null,[1],null,null,null,null,null,null,[1],[1,null,null,[1,20],"/recommendations"],null,null,null,[1,null,1],[1,1,null,1,1]],null,[18,null,null,null,null,null,"/images/lockup.svg","/images/touchicon-180.png",null,null,null,null,null,null,null,null,null,null,null,null,null,2,null,null,null,"/images/lockup-dark-theme.svg",[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[6,1,14,15,20,22,23,28,29,37,43],null,[[null,null,1],[1,1]],[[null,null,null,null,null,null,null,[["G-QFRN08RN6E"],null,null,[["G-QFRN08RN6E",1]]],null,null,null,null,1],null,[[2,2],[1,1]]],null,4,null,null,null,null,null,null,null,null,null,null,null,null,null,"android.devsite.google"],null,"pk_live_5170syrHvgGVmSx9sBrnWtA5luvk9BwnVcvIi7HizpwauFG96WedXsuXh790rtij9AmGllqPtMLfhe2RSwD6Pn38V00uBCydV4m",1]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>