CINXE.COM

Device Filtering and Compatibility | App Submission

<!doctype html><!--[if IE 8]><html data-19ax5a9jf="dingo" lang="en_US" class="a-no-js a-lt-ie10 a-lt-ie9 a-ie8"><![endif]--><!--[if IE 9]><html data-19ax5a9jf="dingo" lang="en_US" class="a-no-js a-lt-ie10 a-ie9"><![endif]--><!--[if !(IE 8)&!(IE 9)]><!--><html data-19ax5a9jf="dingo" lang="en_US" class="a-no-js"><!--<![endif]--> <head><script>var aPageStart = (new Date()).getTime();</script><meta charset="utf-8"/> <link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/11EIQ5IGqaL._RC|01e5ncglxyL.css,01lF2n-pPaL.css,41DLtM-IPiL.css,31iNSIr1kuL.css,011DCEwfbwL.css,013z33uKh2L.css,01R9dtRDQdL.css,01rhj7BIeEL.css,410iOIpxjqL.css,11TIuySqr6L.css,01ElnPiDxWL.css,114oHnH0QRL.css,01crd53+KxL.css,01IdKcBuAdL.css,01y-XAlI+2L.css,01RgENaJKWL.css,219sMS379pL.css,01oDR3IULNL.css,51CguxBmgsL.css,01XPHJk60-L.css,01lN1FNc-RL.css,21Z4Q-IpuWL.css,11MrAKjcAKL.css,21qHKSTSJCL.css,11Zh8bU-hoL.css,01CFUgsA-YL.css,31jsrAUX5KL.css,11WHSxzwhML.css,11MO3b1rxzL.css,11ylgxpE+pL.css,11b-GR26DVL.css,01j2JE3j7aL.css,11maZ3sCvAL.css,21+98GSaU1L.css,11TxiWYBNOL.css,01chhhuYckL.css,21Q7cg1AwNL.css,1128pDOWgAL.css,11mA7+zB7BL.css,01G+-woTSUL.css,01890+Vwk8L.css,01b3+vZ+YbL.css,01cbS3UK11L.css,21kdNu0AlvL.css,0116OOHSwvL.css_.css?AUIClients/AmazonUI#us.trident" /> <link rel="stylesheet" href="https://images-na.ssl-images-amazon.com/images/I/71cTjwDJRNL.css?AUIClients/DeXWebsiteAUIAssets" /> <meta charset="utf-8"> <title>Device Filtering and Compatibility | App Submission </title> <meta name="description" content="When you submit an Android app to the Amazon Appstore, the attributes in your app manifest and build.gradle file determine what Fire and Android devices your app can be installe..."> <meta name="keywords" content=""> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="icon" type="image/x-icon" href="https://amzndevresources.com/jekyll/css/favicon.ico"> <!-- FontAwesome (GPL license) --> <link rel="stylesheet" type="text/css" href="https://amzndevresources.com/jekyll/css/font-awesome/css/font-awesome.min.css"> <meta name="google-site-verification" content="wfEDah_6uJe9Y7uIfLrVycd_efr8wQ9YO-fM_5MI5w0" /> <meta name="google-site-verification" content="Eu8BqTWMhRRdfCAdqUh2RYb3SjAiuFp4wmgTtGcteM0" /> <link rel="alternate" href="https://developer.amazon.com/docs/app-submission/device-filtering-and-compatibility.html" hreflang="en_US" /> <link rel="canonical" href="https://developer.amazon.com/docs/app-submission/device-filtering-and-compatibility.html" /> <meta name="google-site-verification" content="KHmp6TUPKc1gHlM9TuB842pcV7TxZVV6TgenZtsYoNY" /> <meta name="msvalidate.01" content="9761B379C1B64F587D71BA40337FDD07" /> <script language="JavaScript" type="text/javascript"> var digitalData ={ page:{ pageInfo: { pageInstanceID: "docs\/app\-submission\/device\-filtering\-and\-compatibility.html", path: "\/docs\/app\-submission\/device\-filtering\-and\-compatibility.html", pageID: "", pageTitle: "", pageType: "DeX", primaryCategory: "appstore", pageName: "", language: "en_US" } }, user:{ userID: "", ipAddress: "8.222.208.146" } }; var urlSplit = "\/docs\/app\-submission\/device\-filtering\-and\-compatibility.html".split("/"); var trailingSlash = urlSplit.pop(); var pTitle = trailingSlash; if (trailingSlash == ""){ pTitle = urlSplit.pop() } if ("".indexOf("search") !== -1) { digitalData.page.pageInfo.searchResultsNum = ""; } if ("".indexOf("dex-home") !== -1){ digitalData.page.pageInfo.pageID = "Home"; digitalData.page.pageInfo.pageTitle = "Home"; digitalData.page.pageInfo.primaryCategory = "Home"; } else { digitalData.page.pageInfo.pageID = pTitle; pTitle = pTitle.replace(/(^|-)[a-z]/g,function(f){return f.toUpperCase();}); pTitle = pTitle.replace(/-/g, ''); digitalData.page.pageInfo.pageTitle = pTitle; var pCat = digitalData.page.pageInfo.primaryCategory; pCat = pCat.replace(/(^|-)[a-z]/g,function(f){return f.toUpperCase();}); pCat = pCat.replace(/-/g, ''); digitalData.page.pageInfo.primaryCategory = pCat; } var pageNameStr = "" + digitalData.page.pageInfo.primaryCategory; //Todo: add in logic for sub-categories when AOI is implemented. if (digitalData.page.pageInfo.pageTitle != null){ if (pageNameStr != ""){ pageNameStr += ":"; } pageNameStr += digitalData.page.pageInfo.pageTitle; } digitalData.page.pageInfo.pageName = pageNameStr; (function (w) { w.URLSearchParams = w.URLSearchParams || function (searchString) { var self = this; self.searchString = searchString; self.get = function (name) { var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(self.searchString); if (results == null) { return null; } else { return decodeURI(results[1]) || 0; } }; } })(window); </script> <script src="https://m.media-amazon.com/images/G/01/envImprovement/js/jquery/jquery-3.5.1.min.js" crossorigin="anonymous"></script> <script src="https://ds6yc8t7pnx74.cloudfront.net/content/dam/developer-portal/analytics/prod/launch-EN968f8a7401fc4ccea43ced61e7b0c2bb.min.js" async></script> <link rel="stylesheet" type="text/css" href="https://d20632htc2msyc.cloudfront.net/static/css/main.css" /> <script defer src="https://d20632htc2msyc.cloudfront.net/static/js/main.js"></script> <script type="text/javascript"> (function() { var didInit = false; function initMunchkin() { if(didInit === false) { didInit = true; Munchkin.init('365-EFI-026'); } } var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = '//munchkin.marketo.net/munchkin.js'; s.onreadystatechange = function() { if (this.readyState == 'complete' || this.readyState == 'loaded') { initMunchkin(); } }; s.onload = initMunchkin; document.getElementsByTagName('head')[0].appendChild(s); })(); </script> </head> <body class="a-m-us a-aui_72554-c a-aui_a11y_1_699934-c a-aui_a11y_4_835613-c a-aui_a11y_6_837773-c a-aui_a11y_sr_678508-c a-aui_killswitch_csa_logger_372963-c a-aui_pci_risk_banner_210084-c a-aui_preload_261698-c a-aui_rel_noreferrer_noopener_309527-c a-aui_template_weblab_cache_333406-c a-aui_tnr_v2_180836-c"><div id="a-page"><script type="a-state" data-a-state="{&quot;key&quot;:&quot;a-wlab-states&quot;}">{"AUI_A11Y_6_837773":"C","AUI_TNR_V2_180836":"C","AUI_PRELOAD_261698":"C","AUI_TEMPLATE_WEBLAB_CACHE_333406":"C","AUI_72554":"C","AUI_A11Y_1_699934":"C","AUI_A11Y_4_835613":"C","AUI_KILLSWITCH_CSA_LOGGER_372963":"C","AUI_A11Y_SR_678508":"C","AUI_REL_NOREFERRER_NOOPENER_309527":"C","AUI_PCI_RISK_BANNER_210084":"C"}</script> <link rel="stylesheet" type="text/css" href="https://m.media-amazon.com/images/G/01/Fonts/FontAwesome/css/font-awesome.min._V516135338_.css"> <header class='dpHeader dphThemedark'> <div class='dphTopBar clearfix'> <div class='dphLeft'> <div class='dphMenuToggle'> <i class='dphMenuIcon'></i> <i class='dphMenuBackIcon'></i> </div> <a class='dphLogo' href='/apps-and-games'> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logos/amazonAppstoreLogoDarkBG1x_new.png" srcset="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logos/amazonAppstoreLogoDarkBG1x_new.png 1x, https://m.media-amazon.com/images/G/01/mobile-apps/dex/logos/amazonAppstoreLogoDarkBG2x.png 2x" alt="Amazon Developer Logo"> </a> </div> <div class='dphRight'> <div class="dphSearchBarWrap"> <!-- Used in tech docs to hide side bar search results when we rollout new search --> <script type="text/javascript"> window.newSearch = true; </script> <div hidden style="display: none;" class="new-search-flag" data-val="enabled"></div> <div hidden style="display: none;" class="new-search-metadata"> {"settingsUrl":"https://ds6yc8t7pnx74.cloudfront.net/devportal-digital-assets/cf/developer-portal/getDeXSearchData"} </div> <div id="dex-search-header-bar"> </div> </div> <a href="/home.html" class='dphConsole dphLink'>Developer Console</a> <div class='dphUserInfo'> <a class="dphLink" href="/settings/console/registration?return_to=/docs/app-submission/device-filtering-and-compatibility.html">Sign In</a> </div> <style> #notification-counter { position: absolute; top: 2px; padding: 0 2px; min-width: 20px; background: #BF2727; color: white; font-size: 11px; border-radius: 3px; line-height: 20px; text-align: center; } #notification_click_icon { width: 32px; height: 32px; background-color: #31465f; text-align: center; line-height: 32px; border-radius: 50%; margin-right: 15px; color: white; font-weight: 300; cursor: pointer; } #notification-placeholder { position: absolute; top:45px; } #notification_flyout_iframe_id { display: none; position: absolute; width: 425px; border: none; transform: translate(-80%); transition: all 0.2s; } @media screen and (max-width: 992px) { #notification_click_icon { position: fixed; display: inline-block; right: 44px; } #notification_click_icon ~ .dphSearch.active { position: relative; z-index: 0; } #notification-placeholder { top:28px; } #notification-counter { top: -6px; } } @media screen and (max-width: 414px) { #notification_flyout_iframe_id { transform: none; right: -99px; width: 100vw; } #notification_click_icon ~ .dphSearch.active { position: relative; z-index: 0; } } </style> <div id='navFlyout?' class='dphFlyoutItem dphDevConsoleLinkTopBar dphButton'> <span class='dphConsole dphLink'>?</span> <div class='dphDropdownWrap'> <nav class='dphDropdown accrItem'> <div class='dpIconArrow accrHandle'></div> <ul class='dphDropdownList'> <li class='dphdItem'><a href='/support/'>Support</a></li> <li class='dphdItem'><a href='/documentation/'>Docs</a></li> <li class='dphdItem'><a href='/support/contact-us'>Contact Us</a></li> <li class='dphdItem'><a href='/support/cases'>My Appstore Cases</a></li> </ul> </nav> </div> </div> </div> </div> <div class='dphNavigation accordion' data-accr_active_width='327'> <div class='dphnWrap'> <div class='dphUserInfo'> <a class="dphLink" href="/settings/console/registration?return_to=/docs/app-submission/device-filtering-and-compatibility.html">Sign In</a> </div> <a href="/home.html" class='dphConsole dphLink'>Developer Console</a> <nav class="dpPrimaryNav"> <ul class="dppnItems"> <li class="dppnItem accrItem"> <span class="dppnLink"> Devices </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnFlyoutWrap'> <div class='dppnSecondaryNavWrap'> <ul class="dppnFlyout dppnSecondaryNav"> <li class="dppnfItem accrItem"> <span class="dppnfLink"> <span class="dppnfTitle">Fire TV</span> <span class="dppnfSubtitle"></span> </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnLevel3NavWrap'> <ul class="dppnFlyout dppnLevel3Nav"> <li class="dppnfItem "> <a href="/apps-and-games/fire-tv" class="dppnfLink"> <span class="dppnfTitle">About</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/getting-started-developing-apps-and-games.html" class="dppnfLink"> <span class="dppnfTitle">Get started</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/device-specifications.html" class="dppnfLink"> <span class="dppnfTitle">Device specs</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/device-specifications-comparison-table.html" class="dppnfLink"> <span class="dppnfTitle">Compare devices</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/fire-os-overview.html" class="dppnfLink"> <span class="dppnfTitle">Fire OS for TV</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </li> <li class="dppnfItem accrItem"> <span class="dppnfLink"> <span class="dppnfTitle">Fire tablets</span> <span class="dppnfSubtitle"></span> </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnLevel3NavWrap'> <ul class="dppnFlyout dppnLevel3Nav"> <li class="dppnfItem "> <a href="/apps-and-games/fire-tablets" class="dppnfLink"> <span class="dppnfTitle">About</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tablets/ft-get-started.html" class="dppnfLink"> <span class="dppnfTitle">Get started</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tablets/ft-device-specifications.html" class="dppnfLink"> <span class="dppnfTitle">Device specs</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tablets/fire-os-8.html" class="dppnfLink"> <span class="dppnfTitle">Fire OS for tablets</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </li> </ul> </div> </div> </li> <li class="dppnItem accrItem"> <span class="dppnLink"> Build </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnFlyoutWrap'> <div class='dppnSecondaryNavWrap'> <ul class="dppnFlyout dppnSecondaryNav"> <li class="dppnfItem accrItem"> <span class="dppnfLink"> <span class="dppnfTitle">Fire TV apps</span> <span class="dppnfSubtitle"></span> </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnLevel3NavWrap'> <ul class="dppnFlyout dppnLevel3Nav"> <li class="dppnfItem "> <a href="/docs/fire-tv/getting-started-developing-apps-and-games.html" class="dppnfLink"> <span class="dppnfTitle">Get started</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/design-and-user-experience-guidelines.html" class="dppnfLink"> <span class="dppnfTitle">UX guidelines</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/remote-input.html" class="dppnfLink"> <span class="dppnfTitle">Remote control input</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/connecting-adb-to-device.html" class="dppnfLink"> <span class="dppnfTitle">Connect through Android Debug Bridge</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tv/self-service-advertising.html" class="dppnfLink"> <span class="dppnfTitle">Promote your TV app</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </li> <li class="dppnfItem accrItem"> <span class="dppnfLink"> <span class="dppnfTitle">Fire tablet apps</span> <span class="dppnfSubtitle"></span> </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnLevel3NavWrap'> <ul class="dppnFlyout dppnLevel3Nav"> <li class="dppnfItem "> <a href="/docs/fire-tablets/ft-get-started.html" class="dppnfLink"> <span class="dppnfTitle">Get started</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tablets/ft-ux-specifications.html" class="dppnfLink"> <span class="dppnfTitle">UX guidelines</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/fire-tablets/connecting-adb-to-device.html" class="dppnfLink"> <span class="dppnfTitle">Connect through Android Debug Bridge</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </li> <li class="dppnfItem accrItem"> <a href="/docs/apps-and-games/sdk-downloads.html" class="dppnfLink"> <span class="dppnfTitle">SDKs</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/app-submission/migrate-existing-app.html" class="dppnfLink"> <span class="dppnfTitle">Porting Android apps</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/apps-and-games/services-and-apis/monetization" class="dppnfLink"> <span class="dppnfTitle">Monetizing apps</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/apps-and-games/services-and-apis" class="dppnfLink"> <span class="dppnfTitle">Services & APIs</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/apps-and-games/blogs/tag.best-practices" class="dppnfLink"> <span class="dppnfTitle">Best practices</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </div> </li> <li class="dppnItem accrItem"> <span class="dppnLink"> Test </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnFlyoutWrap'> <div class='dppnSecondaryNavWrap'> <ul class="dppnFlyout dppnSecondaryNav"> <li class="dppnfItem accrItem"> <a href="/docs/app-testing/test-criteria.html" class="dppnfLink"> <span class="dppnfTitle">App testing criteria</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/app-testing/live-app-testing-getting-started.html" class="dppnfLink"> <span class="dppnfTitle">Live App Testing</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/in-app-purchasing/iap-testing-overview.html" class="dppnfLink"> <span class="dppnfTitle">In-app purchasing testing</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <span class="dppnfLink"> <span class="dppnfTitle">Quality performance</span> <span class="dppnfSubtitle"></span> </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnLevel3NavWrap'> <ul class="dppnFlyout dppnLevel3Nav"> <li class="dppnfItem "> <a href="/docs/app-testing/test-criteria.html#test-criteria-group-2-key-app-performance-indicators" class="dppnfLink"> <span class="dppnfTitle">Key performance indicators</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem "> <a href="/docs/app-testing/app-performance-scripts.html" class="dppnfLink"> <span class="dppnfTitle">App performance scripts</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </li> </ul> </div> </div> </li> <li class="dppnItem accrItem"> <span class="dppnLink"> Publish </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnFlyoutWrap'> <div class='dppnSecondaryNavWrap'> <ul class="dppnFlyout dppnSecondaryNav"> <li class="dppnfItem accrItem"> <a href="/docs/app-submission/understanding-submission.html" class="dppnfLink"> <span class="dppnfTitle">Publishing overview</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/policy-center/understanding-content-policy.html" class="dppnfLink"> <span class="dppnfTitle">App content policies</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/reports-promo/UI-reports-dashboard.html" class="dppnfLink"> <span class="dppnfTitle">Revenue reporting</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/app-submission/manage-account-and-permissions.html" class="dppnfLink"> <span class="dppnfTitle">Developer account management</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </div> </li> <li class="dppnItem accrItem"> <span class="dppnLink"> Connect </span> <div class='dpIconArrow accrHandle'></div> <div class='dppnFlyoutWrap'> <div class='dppnSecondaryNavWrap'> <ul class="dppnFlyout dppnSecondaryNav"> <li class="dppnfItem accrItem"> <a href="/apps-and-games/blogs" class="dppnfLink"> <span class="dppnfTitle">Blogs</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/apps-and-games/events" class="dppnfLink"> <span class="dppnfTitle">Events</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="https://community.amazondeveloper.com/" class="dppnfLink"> <span class="dppnfTitle">Appstore Developer Community</span> <span class="dppnfSubtitle"></span> </a> </li> <li class="dppnfItem accrItem"> <a href="/docs/apps-and-games/release-notes.html" class="dppnfLink"> <span class="dppnfTitle">Release notes</span> <span class="dppnfSubtitle"></span> </a> </li> </ul> </div> </div> </li> <li class="dppnItem accrItem"> <a href="/apps-and-games/documentation" class="dppnLink"> Docs </a> </li> </ul> </nav> <nav class="dpPrimaryNav dphDevConsoleLinkNavBar"> <ul class="dppnItems"> <li class="dppnItem accrItem"> <span class='dppnLink'>Support</span> <div class="dpIconArrow accrHandle"></div> <div class="dppnFlyoutWrap"> <div class="dppnSecondaryNavWrap"> <ul class='dppnFlyout dppnSecondaryNav'> <li class='dppnfItem accrItem'><a class="dppnfLink" href='/support/'><span class="dppnfTitle">Support</span></a></li> <li class='dppnfItem accrItem'><a class="dppnfLink" href='/documentation/'><span class="dppnfTitle">Docs</span></a></li> <li class='dppnfItem accrItem'><a class="dppnfLink" href='/support/contact-us'><span class="dppnfTitle">Contact Us</span></a></li> <li class='dppnfItem accrItem'><a class="dppnfLink" href='/support/cases'><span class="dppnfTitle">My Appstore Cases</span></a></li> </ul> </div> </div> </li> </ul> </nav> </div> </div> </header> <div id='dpHeaderPlaceholder'></div> <script> (function(){ //Set placeholder height as soon as possible to eliminate page jump "use strict"; var setHeaderPlaceholderHeight = function(header){ var placeholder = document.getElementById('dpHeaderPlaceholder'); var headerHeight = header[0].offsetHeight + "px"; placeholder.style.height = headerHeight; } var checkForHeader = function(){ var header = document.querySelectorAll('.dpHeader'); if(header.length){ setHeaderPlaceholderHeight(header); window.clearInterval(checkForHeaderInterval); } } var checkForHeaderInterval = window.setInterval(checkForHeader, 10); checkForHeader(); //Run once immediately }()); </script> <script> (function(a,b,c,d){if((a=a.AmazonUIPageJS||a.P)&&a.when&&a.register)throw Error("A copy of P has already been loaded on this page.");})(window,document,Date);(function(a,b,c,d){"use strict";a._pSetI=function(){return null}})(window,document,Date);(function(a,c,d,e){"use strict";a._sw=function(){var b;return function(a,c,d,e,f,g,h,k,l,m){b||(b=!0)}}()})(window,document,Date);(function(c,e,I,B){"use strict";c._pd=function(){var a,u;return function(C,f,h,k,b,D,v,E,F){function w(d){try{return d()}catch(J){return!1}}function l(){if(m){var d={w:c.innerWidth||b.clientWidth,h:c.innerHeight||b.clientHeight};5<Math.abs(d.w-q.w)||50<d.h-q.h?(q=d,n=4,(d=a.mobile||a.tablet?450<d.w&&d.w>d.h:1250<=d.w)?k(b,"a-ws"):b.className=v(b,"a-ws")):0<n&&(n--,x=setTimeout(l,16))}}function G(d){(m=d===B?!m:!!d)&&l()}function H(){return m}if(!u){u=!0;var r=function(){var d=["O","ms","Moz","Webkit"], c=e.createElement("div");return{testGradients:function(){return!0},test:function(a){var b=a.charAt(0).toUpperCase()+a.substr(1);a=(d.join(b+" ")+b+" "+a).split(" ");for(b=a.length;b--;)if(""===c.style[a[b]])return!0;return!1},testTransform3d:function(){return!1}}}(),y=b.className,z=/(^| )a-mobile( |$)/.test(y),A=/(^| )a-tablet( |$)/.test(y);a={audio:function(){return!!e.createElement("audio").canPlayType},video:function(){return!!e.createElement("video").canPlayType},canvas:function(){return!!e.createElement("canvas").getContext}, svg:function(){return!!e.createElementNS&&!!e.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect},offline:function(){return navigator.hasOwnProperty&&navigator.hasOwnProperty("onLine")&&navigator.onLine},dragDrop:function(){return"draggable"in e.createElement("span")},geolocation:function(){return!!navigator.geolocation},history:function(){return!(!c.history||!c.history.pushState)},webworker:function(){return!!c.Worker},autofocus:function(){return"autofocus"in e.createElement("input")}, inputPlaceholder:function(){return"placeholder"in e.createElement("input")},textareaPlaceholder:function(){return"placeholder"in e.createElement("textarea")},localStorage:function(){return"localStorage"in c&&null!==c.localStorage},orientation:function(){return"orientation"in c},touch:function(){return"ontouchend"in e},gradients:function(){return r.testGradients()},hires:function(){var a=c.devicePixelRatio&&1.5<=c.devicePixelRatio||c.matchMedia&&c.matchMedia("(min-resolution:144dpi)").matches;E("hiRes"+ (z?"Mobile":A?"Tablet":"Desktop"),a?1:0);return a},transform3d:function(){return r.testTransform3d()},touchScrolling:function(){return f(/Windowshop|android|OS ([5-9]|[1-9][0-9]+)(_[0-9]{1,2})+ like Mac OS X|SOFTWARE=([5-9]|[1-9][0-9]+)(.[0-9]{1,2})+.*DEVICE=iPhone|Chrome|Silk|Firefox|Trident.+?; Touch/i)},ios:function(){return f(/OS [1-9][0-9]*(_[0-9]*)+ like Mac OS X/i)&&!f(/trident|Edge/i)},android:function(){return f(/android.([1-9]|[L-Z])/i)&&!f(/trident|Edge/i)},mobile:function(){return z}, tablet:function(){return A},rtl:function(){return"rtl"===b.dir}};for(var g in a)a.hasOwnProperty(g)&&(a[g]=w(a[g]));for(var t="textShadow textStroke boxShadow borderRadius borderImage opacity transform transition".split(" "),p=0;p<t.length;p++)a[t[p]]=w(function(){return r.test(t[p])});var m=!0,x=0,q={w:0,h:0},n=4;l();h(c,"resize",function(){clearTimeout(x);n=4;l()});b.className=v(b,"a-no-js");k(b,"a-js");!f(/OS [1-8](_[0-9]*)+ like Mac OS X/i)||c.navigator.standalone||f(/safari/i)||k(b,"a-ember"); h=[];for(g in a)a.hasOwnProperty(g)&&a[g]&&h.push("a-"+g.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()}));k(b,h.join(" "));b.setAttribute("data-aui-build-date",F);C.register("p-detect",function(){return{capabilities:a,localStorage:a.localStorage&&D,toggleResponsiveGrid:G,responsiveGridEnabled:H}});return a||{}}}}()})(window,document,Date);(function(g,l,C,D){function E(a){n&&n.tag&&n.tag(p(":","aui",a))}function m(a,b){n&&n.count&&n.count("aui:"+a,0===b?0:b||(n.count("aui:"+a)||0)+1)}function F(a){try{return a.test(navigator.userAgent)}catch(b){return!1}}function G(a){return"function"===typeof a}function u(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c)}function p(a,b,c,f){b=b&&c?b+a+c:b||c;return f?p(a,b,f):b}function y(a,b,c){try{Object.defineProperty(a,b,{value:c,writable:!1})}catch(f){a[b]= c}return c}function O(a,b){a.className=P(a,b)+" "+b}function P(a,b){return(" "+a.className+" ").split(" "+b+" ").join(" ").replace(/^ | $/g,"")}function ca(a,b,c){var f=c=a.length,e=function(){f--||(H.push(b),I||(q?q.set(z):setTimeout(z,0),I=!0))};for(e();c--;)Q[a[c]]?e():(v[a[c]]=v[a[c]]||[]).push(e)}function da(a,b,c,f,e){var d=l.createElement(a?"script":"link");u(d,"error",f);e&&u(d,"load",e);a?(d.type="text/javascript",d.async=!0,c&&/AUIClients|images[/]I/.test(b)&&d.setAttribute("crossorigin", "anonymous"),d.src=b):(d.rel="stylesheet",d.href=b);l.getElementsByTagName("head")[0].appendChild(d)}function R(a,b){return function(c,f){function e(){da(b,c,d,function(b){J?m("resource_unload"):d?(d=!1,m("resource_retry"),e()):(m("resource_error"),a.log("Asset failed to load: "+c));b&&b.stopPropagation?b.stopPropagation():g.event&&(g.event.cancelBubble=!0)},f)}if(S[c])return!1;S[c]=!0;m("resource_count");var d=!0;return!e()}}function ea(a,b,c){for(var f={name:a,guard:function(c){return b.guardFatal(a, c)},guardTime:function(a){return b.guardTime(a)},logError:function(c,d,e){b.logError(c,d,e,a)}},e=[],d=0;d<c.length;d++)A.hasOwnProperty(c[d])&&(e[d]=K.hasOwnProperty(c[d])?K[c[d]](A[c[d]],f):A[c[d]]);return e}function w(a,b,c,f,e){return function(d,k){function n(){var a=null;f?a=k:G(k)&&(q.start=r(),a=k.apply(g,ea(d,h,l)),q.end=r());if(b){A[d]=a;a=d;for(Q[a]=!0;(v[a]||[]).length;)v[a].shift()();delete v[a]}q.done=!0}var h=e||this;G(d)&&(k=d,d=D);b&&(d=d?d.replace(T,""):"__NONAME__",L.hasOwnProperty(d)&& h.error(p(", reregistered by ",p(" by ",d+" already registered",L[d]),h.attribution),d),L[d]=h.attribution);for(var l=[],m=0;m<a.length;m++)l[m]=a[m].replace(T,"");var q=x[d||"anon"+ ++fa]={depend:l,registered:r(),namespace:h.namespace};d&&ha.hasOwnProperty(d);c?n():ca(l,h.guardFatal(d,n),d);return{decorate:function(a){K[d]=h.guardFatal(d,a)}}}}function U(a){return function(){var b=Array.prototype.slice.call(arguments);return{execute:w(b,!1,a,!1,this),register:w(b,!0,a,!1,this)}}}function M(a,b){return function(c, f){f||(f=c,c=D);var e=this.attribution;return function(){h.push(b||{attribution:e,name:c,logLevel:a});var d=f.apply(this,arguments);h.pop();return d}}}function B(a,b){this.load={js:R(this,!0),css:R(this)};y(this,"namespace",b);y(this,"attribution",a)}function V(){l.body?k.trigger("a-bodyBegin"):setTimeout(V,20)}"use strict";var t=C.now=C.now||function(){return+new C},r=function(a){return a&&a.now?a.now.bind(a):t}(g.performance),ia=r(),ha={},n=g.ue;E();E("aui_build_date:3.24.1-2024-10-06");var W={getItem:function(a){try{return g.localStorage.getItem(a)}catch(b){}}, setItem:function(a,b){try{return g.localStorage.setItem(a,b)}catch(c){}}},q=g._pSetI(),H=[],ja=[],I=!1,ka=navigator.scheduling&&"function"===typeof navigator.scheduling.isInputPending;var z=function(){for(var a=q?q.set(z):setTimeout(z,0),b=t();ja.length||H.length;)if(H.shift()(),q&&ka){if(150<t()-b&&!navigator.scheduling.isInputPending()||50<t()-b&&navigator.scheduling.isInputPending())return}else if(50<t()-b)return;q?q.clear(a):clearTimeout(a);I=!1};var Q={},v={},S={},J=!1;u(g,"beforeunload",function(){J= !0;setTimeout(function(){J=!1},1E4)});var T=/^prv:/,L={},A={},K={},x={},fa=0,X=String.fromCharCode(92),h=[],Y=!0,Z=g.onerror;g.onerror=function(a,b,c,f,e){e&&"object"===typeof e||(e=Error(a,b,c),e.columnNumber=f,e.stack=b||c||f?p(X,e.message,"at "+p(":",b,c,f)):D);var d=h.pop()||{};e.attribution=p(":",e.attribution||d.attribution,d.name);e.logLevel=d.logLevel;e.attribution&&console&&console.log&&console.log([e.logLevel||"ERROR",a,"thrown by",e.attribution].join(" "));h=[];Z&&(d=[].slice.call(arguments), d[4]=e,Z.apply(g,d))};B.prototype={logError:function(a,b,c,f){b={message:b,logLevel:c||"ERROR",attribution:p(":",this.attribution,f)};if(g.ueLogError)return g.ueLogError(a||b,a?b:null),!0;console&&console.error&&(console.log(b),console.error(a));return!1},error:function(a,b,c,f){a=Error(p(":",f,a,c));a.attribution=p(":",this.attribution,b);throw a;},guardError:M(),guardFatal:M("FATAL"),guardCurrent:function(a){var b=h[h.length-1];return b?M(b.logLevel,b).call(this,a):a},guardTime:function(a){var b= h[h.length-1],c=b&&b.name;return c&&c in x?function(){var b=r(),e=a.apply(this,arguments);x[c].async=(x[c].async||0)+r()-b;return e}:a},log:function(a,b,c){return this.logError(null,a,b,c)},declare:w([],!0,!0,!0),register:w([],!0),execute:w([]),AUI_BUILD_DATE:"3.24.1-2024-10-06",when:U(),now:U(!0),trigger:function(a,b,c){var f=t();this.declare(a,{data:b,pageElapsedTime:f-(g.aPageStart||NaN),triggerTime:f});c&&c.instrument&&N.when("prv:a-logTrigger").execute(function(b){b(a)})},handleTriggers:function(){this.log("handleTriggers deprecated")}, attributeErrors:function(a){return new B(a)},_namespace:function(a,b){return new B(a,b)},setPriority:function(a){Y?Y=!1:this.log("setPriority only accept the first call.")}};var k=y(g,"AmazonUIPageJS",new B);var N=k._namespace("PageJS","AmazonUI");N.declare("prv:p-debug",x);k.declare("p-recorder-events",[]);k.declare("p-recorder-stop",function(){});y(g,"P",k);V();if(l.addEventListener){var aa;l.addEventListener("DOMContentLoaded",aa=function(){k.trigger("a-domready");l.removeEventListener("DOMContentLoaded", aa,!1)},!1)}var ba=l.documentElement,la=g._pd(k,F,u,O,ba,W,P,m,"3.24.1-2024-10-06");F(/UCBrowser/i)||la.localStorage&&O(ba,W.getItem("a-font-class"));k.declare("a-event-revised-handling",!1);g._sw(N,p,F,X,m,n,E,G,u,k);k.declare("a-fix-event-off",!1);m("pagejs:pkgExecTime",r()-ia)})(window,document,Date); (window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/61ZS63EQSsL._RC|11Y+5x+kkTL.js,51-UZWCmY3L.js,11yKORv-GTL.js,11na7Dl1tFL.js,21uGjv2MRDL.js,01VRMV3FBdL.js,21BJeD9yjcL.js,01cS+tLhj4L.js,11rRjDLdAVL.js,51UOrPXYGsL.js,11YA5PIFcPL.js,11UNP9ncXuL.js,11qGWmpSUoL.js,11EWRk6r74L.js,21paGe30x-L.js,01490L6yBnL.js,51Xt+PG12aL.js,01JYHc2oIlL.js,31nfKXylf6L.js,01ezj5Rkz1L.js,11bEz2VIYrL.js,31o2NGTXThL.js,01rpauTep4L.js,01RMmNcPMuL.js_.js?AUIClients/AmazonUI#trident'); (window.AmazonUIPageJS ? AmazonUIPageJS : P).load.js('https://images-na.ssl-images-amazon.com/images/I/616qGtYUw7L.js?AUIClients/DeXWebsiteAUIAssets'); </script> <div class="content-section"> <div class="docs"> <!-- jQuery (MIT license)--> <script src="https://amzndevresources.com/jekyll/js/jquery-3.6.0.min.js"></script> <!-- Bootstrap 4.4 css --> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/css/bootstrap4.css"> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/css/styleoverrides.css"> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/css/popovers.css"> <!-- Navgoco --> <script src="https://amzndevresources.com/jekyll/js/jquery.navgoco.min.js"></script> <!-- jQuery cookie (MIT license)--> <script type="text/javascript" src="https://amzndevresources.com/jekyll/js/jquery.cookie.js"></script> <!-- Bootstrap (MIT license)--> <script src="https://amzndevresources.com/jekyll/js/bootstrap.4.4.1.bundle.min.js"></script> <!-- Anchor JS (MIT license)--> <script src="https://amzndevresources.com/jekyll/js/anchor.min.js"></script> <!-- Initialization scripts --> <script src="https://amzndevresources.com/jekyll/js/initialization_scripts.js"></script> <!-- Tech doc css fixes now incorporated into stylesheet --> <div class="container"> <!-- sidebar --> <div id="sidebar"> <!-- sidebar_hide_weblab --> <div class="mydocsidebar"> <div id="search-searchbar"></div> <script src="https://amzndevresources.com/alexa/jekyll/js/new-nav/CoveoJsSearch.min.js"></script> <link rel="stylesheet" href="https://amzndevresources.com/alexa/jekyll/js/new-nav/CoveoFullSearch.css"> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/css/search.css"> <script> if (!window.newSearch) { document.addEventListener("DOMContentLoaded", function () { const searchBoxRoot = document.getElementById("searchbox"); const organizationId = "amazoncomproduction9q1by2xb"; const accessToken = "xx42d66989-6d5b-4bd4-bc36-d3b3a04aa40f"; Coveo.SearchEndpoint.configureCloudV2Endpoint(organizationId, accessToken); Coveo.initSearchbox(searchBoxRoot, "https://developer.amazon.com/docs/appstore/search.html"); }); } </script> <div id="searchbox" class="CoveoSearchInterface" data-enable-history="true" data-results-per-page="80" data-excerpt-length="120" data-enable-duplicate-filtering="true" data-pipeline="AppstoreTechDocs" style="display:none"> <script> document.addEventListener("DOMContentLoaded", function () { let root = document.querySelector("#searchbox"); // event handler to group results by “source” Coveo.$$(root).on("preprocessResults", function (e, args) { // Split the "title suffix" to be the "category" because we don't have anything else in yet in the index. let results = args.results.results.map((r) => { const title = r.title; if (title.includes("|")) { // set the category r.raw.category = title.split("|")[1].trim(); r.title = title.split("|")[0].trim(); } else { r.raw.category = "YouTube"; } return r; }); // sort results per category results = results.sort((a, b) => { return a.raw.category.localeCompare(b.raw.category); }); // Set a category Label for the first results of the category. // Keep only 3 items per category. let lastCategory = ""; let categoryCount = 0; results.forEach((r, idx) => { if (lastCategory !== r.raw.category) { lastCategory = r.raw.category; categoryCount = 0; r.raw.categoryLabel = r.raw.category; } categoryCount++; if (categoryCount > 3) { // we already have 3 items for this category r.toDelete = true; } }); // clear out the results marked for deletion results = results.filter((r) => !r.toDelete); args.results.results = results; }); }); $(document).ready(function () { $(".inline").click(function () { $(".coveo-show-if-no-results").hide(); }); }); document.addEventListener("DOMContentLoaded", function () { $("#searchbox .magic-box input").attr("placeholder", "Search Appstore Docs (BETA)"); }); </script> <div class="CoveoAnalytics" data-anonymous="true" data-search-hub="appstore-dropdown-search"></div> <div class="coveo-search-section"> <div class="CoveoSearchbox" data-enable-omnibox="true" data-enable-query-syntax="true" data-search-as-you-type-delay="300"> <div class="CoveoOmniboxResultList" data-layout="list"> <div class="coveo-show-if-results"> <script class="result-template" type="text/x-underscore"> <div> <% if (raw.categoryLabel ) { %> <div class="category-label CoveoFieldValue" data-field="@categoryLabel"></div> <% } %> <div class="co-highlight"> <div> <a class='CoveoResultLink'></a> </div> <div class='CoveoExcerpt'></div> <div class="CoveoFieldValue CoveoCrumb" data-field="@crumb"></div> </div> </div> </script> </div> <div class="coveo-show-if-no-results"> <p>No results found</p> <div class="co-empty">Try a different or more specific query.</div> </div> </div> </div> </div> </div> <script> document.addEventListener("DOMContentLoaded", function () { var searchInterface = document.querySelector("#searchbox"); Coveo.$$(searchInterface).on("populateOmnibox", function (e, populateOmniboxObject) { var linkElement = document.createElement("a"); var query = populateOmniboxObject.completeQueryExpression.word; if (!query) { return; } linkElement.href = "https://developer.amazon.com/docs/appstore/search.html#q=" + encodeURIComponent(query); linkElement.text = 'See more results for "' + query + '"'; linkElement.className = "coveo-omnibox-selectable co-more-results"; linkElement["no-text-suggestion"] = true; linkElement.addEventListener("keyboardSelect", function () { linkElement.click(); }); populateOmniboxObject.rows.push({ element: linkElement, zIndex: 0 }); }); }); </script> <div class="productTitle">App Submission</div> <p class="external"> <a href="#" id="collapseAll">Collapse All</a> | <a href="#" id="expandAll">Expand All</a> </p> <ul id="docnavsidebar" class="docnav"> <li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">App Submission Overview</a> <ul> <li class="level1items"><a href="../app-submission/understanding-submission.html">Understanding Amazon Appstore Submission</a></li> <li class="level1items"><a href="../app-submission/getting-started.html">Get Started with App Submission</a></li> <li class="level1items"><a href="../app-submission/distribute-your-app-internationally.html">Distribute Your App Internationally</a></li> <li class="level1items"><a href="../app-submission/glossary.html">App Submission Glossary</a></li> <li class="level1items"><a href="../app-submission/faq-submission.html">App Submission FAQ</a></li> <li class="level1items"><a href="../app-submission/faq-landing.html">FAQ Index</a></li> <li class="level1items"><a href="../app-submission/release-notes.html">Release Notes</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Manage Your Developer Account</a> <ul> <li class="level1items"><a href="../app-submission/manage-account-and-permissions.html">Manage Your Amazon Developer Account and Permissions</a></li> <li class="level1items"><a href="../app-submission/change-account-ownership.html">Change Developer Account Ownership</a></li> <li class="level1items"><a href="../app-submission/two-step-verification.html">Two-Step Verification FAQ</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Prepare Your App</a> <ul> <li class="level1items"><a href="../app-submission/presubmission-checklist.html">Amazon Appstore Presubmission Checklist</a></li> <li class="level1items"><a href="../app-submission/appstore-privacy-labels.html">Appstore Privacy Labels</a></li> <li class="level1items"><a href="../app-submission/user-account-and-data-deletion.html">User Account and Data Deletion</a></li> <li class="level1items"><a href="../app-submission/app-bundles.html">App Bundles</a></li> <li class="level1items open"><a href="../app-submission/device-filtering-and-compatibility.html">Device Filtering and Compatibility</a></li> <li class="level1items"><a href="../app-submission/supported-filters-on-the-amazon-appstore.html">Manifest Filters Supported by the Amazon Appstore</a></li> <li class="level1items"><a href="../app-submission/troubleshooting-android-manifest-and-device-targeting.html">Troubleshooting Android Manifest and Device Filtering</a></li> <li class="level1items"><a href="../app-submission/categories.html">Choosing a Category for Your App</a></li> <li class="level1items"><a href="../app-submission/taking-screenshots.html">Taking Screenshots on Fire Devices</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Publish Your App</a> <ul> <li class="level1items"><a href="../app-submission/submitting-apps-to-amazon-appstore.html">Submitting Apps to the Amazon Appstore</a></li> <li class="level1items"><a href="../app-submission/upload-app-file.html">Step 1: Upload Your App File</a></li> <li class="level1items"><a href="../app-submission/target-app.html">Step 2: Target Your App</a></li> <li class="level1items"><a href="../app-submission/appstore-details.html">Step 3: Add Appstore Details</a></li> <li class="level1items"><a href="../app-submission/review-submit.html">Step 4: Review and Submit</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Update Your App</a> <ul> <li class="level1items"><a href="../app-submission/update-published-app.html">Update a Published App</a></li> <li class="level1items"><a href="../app-submission/release-updates-in-staged-rollouts.html">Release Your App Update in a Staged Rollout</a></li> <li class="level1items"><a href="../app-submission/unlist-app.html">Unlisting An App Version from the Amazon Appstore</a></li> <li class="level1items"><a href="../app-submission/transfer-app.html">Transfer Your App to Another Developer</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">Troubleshooting</a> <ul> <li class="level1items"><a href="../app-submission/avoid-compile-errors.html">Compile Errors from Referencing More Than 65,000 Methods</a></li> <li class="level1items"><a href="../app-submission/ssl-validation.html">Troubleshooting SSL Validation</a></li> </ul> </li><li class="level1 folderTitle"> <a class="subfoldersTitle" href="#">App Submission API</a> <ul> <li class="level1items"><a href="../app-submission-api/overview.html">API Overview</a></li> <li class="level1items"><a href="../app-submission-api/auth.html">Authentication</a></li> <li class="level1items"><a href="../app-submission-api/flows.html">Task Flows</a></li> <li class="level1items"><a href="../app-submission-api/migrate.html">Differences from Play Store API</a></li> <li class="level1items"><a href="../app-submission-api/python-example.html">Python API Example</a></li> <li class="level1items"><a href="../app-submission-api/appsub-api-ref.html">App Submission API Reference</a></li> </ul> </li> </ul> <hr class="resourceSeparator"> <div class="relatedResources">Other Resources</div> <ul id="entrypages"> <li><a href="../fire-tv/getting-started-developing-apps-and-games.html">Fire TV</a></li> <li><a href="../fire-tablets/ft-get-started.html">Fire Tablets</a></li> <li><a href="https://community.amazondeveloper.com/c/amazon-appstore/17">Appstore Forum</a></li> <li><a href="../app-testing/live-app-testing-understanding.html">Understanding Live App Testing</a></li> <li><a href="../reports-promo/payments-understand.html">Amazon Appstore Payments</a></li> <li><a href="../policy-center/understanding-content-policy.html">Amazon Appstore Content Policy</a></li> </ul> </div> <script> $("li.open").parents('li').toggleClass("open"); </script> </div> <!-- main area --> <div class="mainColumn"> <div id="content"> <h1>Device Filtering and Compatibility</h1> <p>When you submit an Android app to the Amazon Appstore, the attributes in your <a href="https://developer.android.com/guide/topics/manifest/manifest-intro.html">app manifest</a> and <code>build.gradle</code> files determine what devices your app can be installed on. Incompatibilities between these files and a device's capabilities will prevent your <a style="cursor: help !important;" data-toggle="popover" data-placement="top" data-trigger="hover" data-delay="300" data-html="true" data-content="Android App Bundle (AAB) or APK">binary&nbsp;file</a> from being supported on that device. The sections that follow explain some of the filters that influence support for devices. You can also manually adjust the list of supported devices in the Developer Console.</p> <div class="alert alert-success" role="alert"><i class="fa fa-check-square-o"></i> <b>Tip:</b> The information here is more conceptual than procedural. For step-by-step details on uploading your binary file, see <a href="../app-submission/upload-app-file.html">Step 1: Upload Your App File</a>.</div> <ul id="markdown-toc"> <li><a href="#background-knowledge" id="markdown-toc-background-knowledge">Background knowledge</a></li> <li><a href="#glossary" id="markdown-toc-glossary">Key terms related to device filtering</a></li> <li><a href="#device_compatibility" id="markdown-toc-device_compatibility">Device compatibility determined by your app's manifest</a></li> <li><a href="#support-on-android-mobile-devices" id="markdown-toc-support-on-android-mobile-devices">Support on Android mobile devices</a> <ul> <li><a href="#guidance-for-targetsdkversion" id="markdown-toc-guidance-for-targetsdkversion">Guidance for targetSdkVersion</a></li> </ul> </li> <li><a href="#api-level" id="markdown-toc-api-level">Fire OS and Android API Levels</a> <ul> <li><a href="#minimum-api-levels-for-targetsdkversion" id="markdown-toc-minimum-api-levels-for-targetsdkversion">Minimum API levels for targetSdkVersion</a></li> </ul> </li> <li><a href="#backwards-and-forwards-compatibility-across-api-levels" id="markdown-toc-backwards-and-forwards-compatibility-across-api-levels">Backwards and forwards compatibility across API levels</a></li> <li><a href="#evolving-api-levels" id="markdown-toc-evolving-api-levels">Evolving API levels</a></li> <li><a href="#common-hardware-and-software-capabilities" id="markdown-toc-common-hardware-and-software-capabilities">Common hardware and software capabilities</a> <ul> <li><a href="#devices-supporting-only-64-bit-apps" id="markdown-toc-devices-supporting-only-64-bit-apps">Devices supporting only 64-bit apps</a></li> </ul> </li> <li><a href="#device_filtering_for_tv_apps" id="markdown-toc-device_filtering_for_tv_apps">Device filtering for Fire TV devices</a></li> <li><a href="#device_filtering_for_web_apps" id="markdown-toc-device_filtering_for_web_apps">Device filtering for web apps</a></li> <li><a href="#device-filtering-by-web-browser-apps" id="markdown-toc-device-filtering-by-web-browser-apps">Device filtering by web browser apps</a></li> <li><a href="#device-filtering-by-country" id="markdown-toc-device-filtering-by-country">Device filtering by country</a></li> <li><a href="#specifying-an-installation-location-for-your-app" id="markdown-toc-specifying-an-installation-location-for-your-app">Specifying an installation location for your app</a></li> <li><a href="#remove_uses_amzn_sdk" id="markdown-toc-remove_uses_amzn_sdk">Remove uses-amzn-sdk from app manifest</a></li> <li><a href="#multiple_apk_support" id="markdown-toc-multiple_apk_support">Multiple APKs for the same application listing</a> <ul> <li><a href="#requirements-for-multiple-apks" id="markdown-toc-requirements-for-multiple-apks">Requirements for multiple APKs</a></li> <li><a href="#example-of-versioncode-with-multiple-apks" id="markdown-toc-example-of-versioncode-with-multiple-apks">Example of versionCode with multiple APKs</a></li> <li><a href="#how-multiple-apk-support-on-amazon-differs-from-google-play" id="markdown-toc-how-multiple-apk-support-on-amazon-differs-from-google-play">How multiple APK support on Amazon differs from Google Play</a></li> </ul> </li> </ul> <h2 id="background-knowledge">Background knowledge</h2> <p>Because Amazon's Fire OS is based on Android, Amazon tries to maintain as much parity with Android as possible. Because of this, the documentation here doesn't duplicate the information in the Android documentation; instead, it covers how Amazon and Fire OS differ. For a better understanding of the concepts here, consult these foundational Android documentation topics:</p> <ul> <li><a href="https://developer.android.com/guide/practices/compatibility.html">Device Compatibility</a></li> <li><a href="https://developer.android.com/google/play/filters.html">Filters on Google Play</a></li> <li><a href="https://developer.android.com/training/basics/supporting-devices/platforms.html">Supporting Different Platform Versions</a></li> <li><a href="https://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions">Permissions that Imply Feature Requirements</a></li> <li><a href="https://developer.android.com/google/play/publishing/multiple-apks.html">Multiple APK Support</a></li> <li><a href="https://developer.android.com/training/multiple-apks/api.html">Creating Multiple APKs for Different API Levels</a></li> </ul> <h2 id="glossary">Key terms related to device filtering</h2> <p>The following are common terms used with device filtering in app submission.</p> <p><button type="button" class="btn btn-default" onclick="$('#keyterms').toggle( 'fast' )">Key terms</button></p> <div id="keyterms" class="expandedBox" aria-expanded="false" style="display: none;"> <dl> <dt><a id="app"></a>app</dt> <dd>Your app as shown in the Appstore. A single app can have multiple APKs designed for different devices or locales.</dd> <dt><a id="apk"></a>APK</dt> <dd>Android Package Kit. The file that gets downloaded to a device when a user installs your app from the Appstore.</dd> <dt><a id="binary"></a>binary</dt> <dd>Can refer to Android App Bundle (AAB) or APK file. "Binary targeting" or "device targeting" refers to filtering the devices available for your binary file based on the manifest.</dd> <dt><a id="build_gradle_file"></a>build.gradle file</dt> <dd>A file in the APK where build dependencies are declared. The build.gradle file indicates the <code>minSdkVersion</code> and <code>versionCode</code>, which influence the Appstore's filtering logic that determines device compatibility. Note that there are two <code>build.gradle</code> files in each Android Studio project. One is a project-level configuration file (in the project's root directory); the other is an app-level configuration file (in the folder called <code>app</code>). For device filtering, all manifest-related configuration is in the app-level build.gradle file.</dd> <dt><a id="compatibility"></a>compatibility</dt> <dd>The suitability of your APK for the device — based on the API level, features, and other attributes in the manifest and build.gradle file. If your app isn't compatible with a device, the Appstore won't let users install it on their device.</dd> <dt><a id="device"></a>device</dt> <dd>The tablets, TV, etc. where the APK is installed. The list of supported devices shown for your APK include both Amazon <em>and Android devices</em> because Amazon apps can be installed on Android devices through the <a href="https://developer.amazon.com/docs/app-submission/getting-started.html">Amazon Appstore for Android app</a>.</dd> <dt><a id="device_filtering"></a>device filtering</dt> <dd>The process of automatically determining which devices your app can be installed on, based on the features, API levels, and other attributes in the APK manifest and build.gradle file. The features declared in the manifest (and build.gradle file) act as <em>filters</em> that determine which devices your app is compatible with. For details on Amazon's supported filters, see <a href="https://developer.amazon.com/docs/app-submission/supported-filters-on-the-amazon-appstore.html">Manifest Filters Supported by the Amazon Appstore</a>.</dd> <dt><a id="device_targeting"></a>device targeting</dt> <dd>Refers to actively designing your app for compatibility with a particular device (similar to device filtering). When you <a href="https://developer.amazon.com/docs/app-submission/upload-app-file.html#add-multiple-apks">upload multiple APKs</a>, there is no automatic filtering that determines device support for the additional APKs. You manually select which devices each APK supports. This manual selecting of device support with multiple APKs is sometimes referred to as device targeting.</dd> <dt><a id="gradle"></a>Gradle</dt> <dd>The build system Android uses to gather dependencies and package up the APK.</dd> <dt><a id="manifest"></a>manifest</dt> <dd>A required file in your APK that describes the features and activities in your app. The manifest and <code>build.gradle</code> file are used to determine which devices your app is compatible with.</dd> <dt><a id="package_name"></a>package name</dt> <dd>An attribute (<code>package</code>) in the manifest that provides a unique identifier for your app in the Appstore. The package name for your app must remain the same and cannot change with new releases. <a href="../app-submission/device-filtering-and-compatibility.html#multiple_apk_support">Multiple APKs for the same app</a> should use the same package name for each APK. Different application listings, however, should have different package names. The package name must not include <code>amazon</code> in the name.</dd> </dl> </div> <p>For a more comprehensive glossary, see the <a href="../app-submission/glossary.html">App Submission Glossary</a>.</p> <h2 id="device_compatibility">Device compatibility determined by your app's manifest</h2> <p>As with standard Android practices, the attributes in your app's manifest and <code>build.gradle</code> files determine which devices are compatible with your app. For example:</p> <ul> <li>If you set <code>minSdkVersion=4</code> and <code>smallScreens=false</code> in the app manifest, the Amazon Appstore prevents the app from being installed on any device that doesn't support those requirements.&nbsp;</li> <li>If your manifest declares a requirement for a camera feature (<code>&lt;uses-feature android:name="android.hardware.camera" /&gt;</code>), any device that does not have a camera won't be compatible. Customers with incompatible devices will not see the app as available to be installed.</li> </ul> <p>Using the filters in your app's manifest, Amazon Appstore checks the hardware and software requirements for the customer's device as well as the carrier, location, and other characteristics. Amazon also looks at the geographic location availability requirements as specified in your app's metadata (which you select when <a href="../app-submission/submitting-apps-to-amazon-appstore.html">publishing your app</a>). If your app is compatible with the device according to the filter rules, your app is made available to the customer. If the app is incompatible, your app is hidden from search results and category browsing for that customer's device.</p> <p>The following table shows examples of filters:&nbsp;</p> <table> <colgroup> <col width="40%"> <col width="60%"> </colgroup> <thead> <tr> <th>Filter Type</th> <th>Example</th> </tr> </thead> <tbody> <tr> <td>Filtering based on device compatibility</td> <td>If you state in the app manifest that the app requires GPS, the Amazon Appstore does not show the app to devices that do not have a GPS.</td> </tr> <tr> <td>Filtering based on app availability</td> <td>If you state in the Developer Console that your app should only be available in North America, the Amazon Appstore does not show the app to devices outside North America.</td> </tr> </tbody> </table> <p>For a full list of supported manifest filters, see <a href="../app-submission/supported-filters-on-the-amazon-appstore.html">Manifest Filters Supported by the Amazon Appstore</a>.</p> <h2 id="support-on-android-mobile-devices">Support on Android mobile devices</h2> <p>In addition to supporting Amazon devices, the Amazon Appstore supports Android mobile devices running Android 7.0 and above. Your manifest and <code>build.gradle</code> file also determine the filtering logic and device support on these devices. Android mobile devices below Android 7.0 won't be able to access the Amazon Appstore.</p> <p>To install Amazon apps on Android mobile devices, customers do so through the <a href="https://www.amazon.com/gp/mas/get/amazonapp">Amazon Appstore for Android</a> app. Customers might install your Amazon app on an Android mobile device if they already purchased the app from Amazon Appstore and don't want to buy it again from Google Play, or if they have coins or subscriptions they purchased from Amazon and want to use them in the same app on other devices, such as Android tablets.</p> <h3 id="guidance-for-targetsdkversion">Guidance for targetSdkVersion</h3> <p>If your app targets <em>only</em> Android mobile devices, follow the AOSP guidelines to set <code>targetSdkVersion</code> in your app. To reach Android 15 devices through the Amazon Appstore, set <code>targetSdkVersion</code> to 24 or above in your app manifest or build.gradle file. If you don't set <code>targetSdkVersion</code> to at least 24, your app won't be available on the Amazon Appstore for Android 15 devices.</p> <p>If your app targets Android mobile devices <em>and</em> Fire devices, follow the guidelines for Fire OS devices in <a href="https://developer.amazon.com/docs/app-submission/device-filtering-and-compatibility.html#minimum-api-levels-for-targetsdkversion">Minimum API Levels for targetSdkVersion</a>. To reach a broader range of both Android mobile devices and Fire OS devices, set <code>targetSdkVersion</code> to above 34 and set <code>minSdkVersion</code> to the lowest API level your app can support.</p> <div class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note:</b> To maintain your app, the <a href="https://developer.android.com/guide/topics/manifest/uses-sdk-element">Android developer documentation</a> instructs you to set <code>targetSdkVersion</code> to match the latest API level, and thoroughly test your app on that API level.</div> <h2 id="api-level">Fire OS and Android API Levels</h2> <p>Fire devices use <a href="../fire-tv/fire-os-overview.html">Fire OS</a> as the operating system. Since Fire OS is a custom version of Android, each Fire OS version corresponds to an Android API level. In your app manifest, the <a href="https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#min"><code>android:minSdkVersion</code></a> attribute indicates the minimum API level of the Fire devices you intend to support. Make sure to specify the proper Android API level for your app in the <code>minSdkVersion</code> attribute. For example, to support all 2013 and newer tablets, your manifest should contain an entry like this:</p> <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;uses-sdk</span> <span class="na">android:minSdkVersion=</span><span class="s">"17"</span> <span class="nt">/&gt;</span> </code></pre></div></div> <p>You can also set the <a href="https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#target"><code>android:targetSdkVersion</code></a> attribute, which has a different function from <code>minSdkVersion</code>. Setting <code>targetSdkVersion</code> ensures that when your app is run on a device that matches the specified API level, it has access to the available enhancements provided in that API level. Since newer API levels introduce enhanced security and performance, Android enforces minimum API levels for <code>targetSdkVersion</code>. To learn more about minimum <code>targetSdkVersion</code> requirements for Android, see the <a href="https://support.google.com/googleplay/android-developer/answer/113469#targetsdk">Android documentation</a>.</p> <div class="alert alert-warning" role="alert"><i class="fa fa-warning"></i> <b>Important:</b> If you don't set <code>targetSdkVersion</code>, the value defaults to what you set in <code>minSdkVersion</code>. And if you don't set <code>minSdkVersion</code>, it indicates that your app supports all Android API levels.</div> <p>As with Android devices, not all Fire devices have the same API level. For specific API levels on different Fire devices, see the following:</p> <ul> <li><a href="../fire-tv/identify-amazon-fire-tv-devices.html">Identifying Fire TV Devices</a></li> <li><a href="../fire-tv/device-specifications.html">Fire TV Specifications</a></li> <li><a href="../fire-tablets/ft-identifying-tablet-devices.html">Identifying Fire Tablet Devices</a></li> <li><a href="../fire-tablets/ft-device-specifications.html">Fire Tablet Specifications</a></li> </ul> <h3 id="minimum-api-levels-for-targetsdkversion">Minimum API levels for targetSdkVersion</h3> <p>Due to requirements from Android, on April 1, 2022, Amazon began enforcing the following Android API level requirements for <code>targetSdkVersion</code> on Fire OS 6 and 7.</p> <div class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note:</b> These are minimum API levels for <code>targetSdkVersion</code> <em>not</em> for <code>minSdkVersion</code>. You can still support older devices by setting <code>minSdkVersion</code> to the desired API level.</div> <table> <colgroup> <col width="40%"> <col width="60%"> </colgroup> <thead> <tr> <th>Fire OS Version</th> <th>Minimum API Level for targetSdkVersion</th> </tr> </thead> <tbody> <tr> <td>Fire OS 6</td> <td>25</td> </tr> <tr> <td>Fire OS 7</td> <td>28</td> </tr> <tr> <td>Fire OS 8</td> <td>30</td> </tr> <tr> <td>AOSP 14</td> <td>34</td> </tr> </tbody> </table> <p>You cannot submit new apps or update existing apps that do not meet the minimum API levels for <code>targetSdkVersion</code> on or after April 1, 2022. Any existing apps submitted to the Appstore will continue to work and be available for your customers.</p> <p>See Fire OS documentation to learn more about setting minimum API levels:</p> <ul> <li><a href="../fire-tablets/fire-os-6.html#version_elements">Fire OS 6 for Fire Tablets</a></li> <li><a href="../fire-tablets/fire-os-7.html#version_elements">Fire OS 7 for Fire Tablets</a></li> <li><a href="../fire-tablets/fire-os-8.html#version_elements">Fire OS 8 for Fire Tablets</a></li> <li><a href="../fire-tv/fire-os-6.html#version_elements">Fire OS 6 for Fire TV</a></li> <li><a href="../fire-tv/fire-os-7.html#version_elements">Fire OS 7 for Fire TV</a></li> <li><a href="../fire-tv/fire-os-8.html#version_elements">Fire OS 8 for Fire TV</a></li> <li><a href="../fire-tv/aosp14-based-fire-tv.html#version_elements">AOSP 14 for Fire TV</a></li> </ul> <h2 id="backwards-and-forwards-compatibility-across-api-levels">Backwards and forwards compatibility across API levels</h2> <p>Android APIs are usually backwards compatible, meaning a device that supports Android Level 28 will support Levels 1 through 27. However, Android APIs are not forwards compatible, meaning Level 27 will not necessarily support all the functionality introduced in Level 28. As such, some features available in Fire OS 7 might not be supported in Fire OS 6. Some features in Fire OS 6 might not be supported on Fire OS 5, and so on. See the following for special considerations about how to develop for Fire OS 6 and Fire OS 7:</p> <ul> <li><a href="../fire-tv/fire-os-7.html">Developing for Amazon Fire TV Devices Running Fire OS 7</a></li> <li><a href="../fire-tv/fire-os-6.html">Developing for Amazon Fire TV Devices Running Fire OS 6</a></li> </ul> <h2 id="evolving-api-levels">Evolving API levels</h2> <p>Some Android API levels for devices change over time as Fire OS updates are deployed. For example, some versions of Fire tablets were initially released with Fire OS 6, but they were upleveled to Fire OS 7 later on through an over-the-air ("OTA") update process.</p> <p>If your app's binary file is compatible with multiple versions of Fire OS, in the <a href="https://developer.android.com/guide/topics/manifest/uses-sdk-element.html"><code>&lt;uses-sdk&gt;</code></a> element in your manifest, set your <a href="https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#min"><code>minSdkVersion</code></a> to the lowest API level your device supports in order to ensure maximum compatibility with devices. If you set the <code>minSdkVersion</code> to 22, devices that support only level 19 and lower won't be compatible.</p> <p>The Amazon Appstore also supports the <code>android:maxSdkVersion</code> attribute, which specifies the maximum allowed API level on the device. In most cases, use of this attribute is not needed unless there is a breaking incompatibility with a higher API level.</p> <h2 id="common-hardware-and-software-capabilities">Common hardware and software capabilities</h2> <p>After you specify the <code>minSdkVersion</code>, make sure your <code>&lt;uses-permission&gt;</code> and <code>&lt;uses-features&gt;</code> elements are appropriate for the devices you want your app to be compatible with. Refer to specifications for <a href="../fire-tablets/ft-device-specifications.html">Fire Tablets</a> and <a href="../fire-tv/device-specifications.html">Fire TV</a> for specific hardware and software capabilities.</p> <p>Be aware of implied (or unstated) feature requirements as well. As noted in the Android <a href="https://developer.android.com/guide/topics/manifest/uses-feature-element.html"><code>&lt;uses-feature&gt;</code></a> documentation, specifying <code>&lt;uses-permission&gt;</code> for certain capabilities <em>implies</em> one or more <code>&lt;uses-feature&gt;</code> elements, with <code>android:required="true"</code> assumed. Because the implied features are required, the app's binary file will not be compatible with any device that does not provide those features, even if the app is designed to degrade gracefully when features aren’t present.</p> <p>To better understand implied features, consider this scenario. Your app uses the device’s current location to find nearby gas stations. The app can get your current location from the device's GPS, but if GPS is not available, the user can input an address or location. To use the GPS, you should include this element in your manifest:</p> <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;uses-permission</span> <span class="na">android:name=</span><span class="s">"android.permission.ACCESS_FINE_LOCATION"</span> <span class="nt">/&gt;</span> </code></pre></div></div> <p>However, if you don’t explicitly define the feature requirements, these elements are implicitly defined:</p> <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;uses-feature</span> <span class="na">android:name=</span><span class="s">"android.hardware.location"</span> <span class="na">android:required=</span><span class="s">"true"</span> <span class="nt">/&gt;</span> <span class="nt">&lt;uses-feature</span> <span class="na">android:name=</span><span class="s">"android.hardware.location.gps"</span> <span class="na">android:required=</span><span class="s">"true"</span> <span class="nt">/&gt;</span> </code></pre></div></div> <p>If you then provide this binary to the Amazon Appstore, only Fire tablets with built-in GPS capabilities (that is, with WAN, or wireless access networks) would be compatible. To be compatible with additional Fire devices, you should include these elements in your manifest but specify them as not required (provided your app functions correctly without GPS):</p> <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;uses-feature</span> <span class="na">android:name=</span><span class="s">"android.hardware.location"</span> <span class="na">android:required=</span><span class="s">"false"</span> <span class="nt">/&gt;</span> <span class="nt">&lt;uses-feature</span> <span class="na">android:name=</span><span class="s">"android.hardware.location.gps"</span> <span class="na">android:required=</span><span class="s">"false"</span> <span class="nt">/&gt;</span> </code></pre></div></div> <p>For a full list of permissions that cause implied features, see <a href="http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions">Permissions that Imply Feature Requests</a>.</p> <h3 id="devices-supporting-only-64-bit-apps">Devices supporting only 64-bit apps</h3> <p>Some devices no longer support 32-bit apps, including any 32-bit apps currently available on Amazon Appstore. Customers attempting to download a 32-bit app on one of these devices will receive a notification alerting them that the app is not compatible with system requirements.</p> <p>To make your app available to customers using one of these devices, add 64-bit (arm64-v8a) support to your app and submit an update using the Amazon Developer Console. Do not remove support for 32-bit (armeabi-v7a) while building your app, as it may impact current Amazon device selection.</p> <h2 id="device_filtering_for_tv_apps">Device filtering for Fire TV devices</h2> <p>For Fire TV devices, the following manifest attribute identifies support for Fire TV:</p> <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;uses-feature</span> <span class="na">android:name=</span><span class="s">"android.hardware.touchscreen"</span> <span class="na">android:required=</span><span class="s">"false"</span> <span class="nt">/&gt;</span> </code></pre></div></div> <p>This attribute indicates that the touchscreen feature is <code>false</code>. Fire TV devices do not support touchscreens and multi-touch capabilities, whereas phones and tablets do. As a result, you must declare this <code>android.hardware.touchscreen</code> attribute to be <code>false</code> for the Appstore to classify your app as compatible with Fire TV devices.</p> <p>However, this classification isn't automatic. When you <a href="../app-submission/upload-app-file.html">upload a binary</a> designed for Fire TV devices, you must still manually select which devices your binary file is compatible with in the Developer Console. For details, see <a href="../app-submission/target-app.html#supported-devices">Supported devices</a>.</p> <h2 id="device_filtering_for_web_apps">Device filtering for web apps</h2> <p>Although device filtering based on your Android manifest is not available for web apps, you can still control the supported devices through a list of checkboxes during the submission process. With web apps, even though you submit a URL to a website or upload a zip package with web files, the Amazon Appstore takes the web app and generates an Android app using a Cordova wrapper. This Cordova-packaged app is the Android app that users download and install on their devices.</p> <p>Web apps are compatible with all devices because in terms of Android APIs, they are very basic — there's one activity with a WebView into which web files or a URL is loaded, and the API level is set to 10 to gain the widest compatibility possible.</p> <h2 id="device-filtering-by-web-browser-apps">Device filtering by web browser apps</h2> <p>For privacy and security reasons, Amazon does not allow third-party browsers on Fire Tablet and Fire TV. Please verify the targeted devices during your app submission process. In isolated instances, we may permit third-party browser apps if they pass our privacy and security bar. Please reach out to us by visiting the <a href="https://developer.amazon.com/support/contact-us">Contact Us form</a>, then select the <strong>Appstore</strong> category and choose the <strong>Content Policy Results</strong> topic if you want more information.</p> <h2 id="device-filtering-by-country">Device filtering by country</h2> <p>The countries and regions you selected during the app submission process on <a href="../app-submission/target-app.html">Step 2: Target Your App</a>, help determine which devices your app can support. Not all Amazon devices are available in all countries. If a Fire TV or Fire tablet isn't available in any of your targeted countries or regions, it will be filtered out as unsupported during the submission process.</p> <h2 id="specifying-an-installation-location-for-your-app">Specifying an installation location for your app</h2> <p>Your Android Manifest file specifies the installation location for your app on Fire devices. For most apps, setting this value to External Storage (<code>preferExternal</code>) will provide a better experience for your app's users, as it will reduce scenarios where customers can't install your app because their device's internal storage is full. For more information, see <a href="../fire-tv/specifying-installation-location.html">Specifying the Installation Location for Your App</a>.</p> <h2 id="remove_uses_amzn_sdk">Remove uses-amzn-sdk from app manifest</h2> <p>If you have the following tag in your app's manifest, <code>&lt;uses-amzn-sdk&gt;</code>, remove it. This tag relates to the old Fire OS SDK add-on and is no longer used for apps on Fire TV.</p> <p>Although your app will (usually) still work with this tag in your manifest, removing it will avoid any future incompatibilities. None of the components of the old Fire OS SDK add-on are required to develop apps for Fire devices. Instead, use <a href="https://developer.android.com/index.html">standard Android APIs</a> and the <a href="https://developer.amazon.com/docs/apps-and-games/sdk-downloads.html">Amazon SDKs</a>.</p> <h2 id="multiple_apk_support">Multiple APKs for the same application listing</h2> <div class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note:</b> Adding multiple APKs for the same app is supported for Amazon devices only. The Amazon Appstore does not support multiple APKs when targeting Android mobile devices.</div> <p>Although you can support different devices within a single APK (such as by <a href="https://developer.android.com/training/permissions/requesting.html">checking for the permissions at runtime</a> and degrading gracefully if the device doesn't support the feature), it might be easier for you to build multiple APKs for the same application listing. Each APK can accommodate different software or hardware features and components for different devices.</p> <p>The device differences accommodated by multiple APKs might include the API level, OpenGL compression format, CPU, screen size and density, device features, or even other factors such as geographic locales. For example, you might want an APK for Fire tablets, a separate APK for Fire TV, and another APK for Android mobile devices. For this reason, the Amazon Appstore lets you upload more than one APK for the same app.</p> <p>No matter how many APKs you upload, the user sees just one app in the Appstore. The APK that gets downloaded depends on the user's device. For example, suppose you have an app called "Stream Sports Everywhere." You want the app to work seamlessly across phones, tablets, and TVs. However, you find it difficult to use a single APK for all of these devices. As such, you decide to create two APKs — one for phones/tablets, and one for TVs.</p> <p>In the Appstore, the user sees just one "Stream Sports Everywhere" app. When the user installs the app from a TV device, the APK designed for TVs gets installed. When the user installs the app from a phone or tablet, the APK designed for phones and tablets gets installed.</p> <p>If you charge for your app, the customer won't be prompted to re-purchase the same app on other devices because the user has already purchased the app. Customers have to buy your app just one time, and the correct, optimized version will automatically be delivered for each device they use.</p> <p>Additionally, reporting, metrics, and reviews are consolidated for the app across all the APKs associated with the app.</p> <h3 id="requirements-for-multiple-apks">Requirements for multiple APKs</h3> <p>When you submit multiple APKs for the same app, be sure to do the following:</p> <p><strong>1. Give each APK a unique version code.</strong></p> <p>The <code>versionCode</code> is an internal numbering scheme not displayed to users. (Only the <code>versionName</code> is shown to users.) Version codes are single integers you choose, for example, <code>1</code> or <code>1254</code>. The <code>versionCode</code> (and <code>versionName</code>) are specified in your app's <code>build.gradle</code> file. See <a href="https://developer.android.com/studio/publish/versioning.html#appversioning">Version Your App</a> for details.</p> <p>The <code>versionCode</code> is used to indicate successive versions of your app. When you have multiple APKs and publish an update, the <code>versionCode</code> also determines whether the device receives the updated APK. Higher <code>versionCode</code> numbers indicate newer versions. Devices compatible with the APK will receive an app update only if the <code>versionCode</code> in the updated APK is higher than the existing device APK's <code>versionCode</code>.</p> <p>For example, suppose you have one app with two APKs — APK "Ham" with versionCode 10 and APK "Eggs" with <code>versionCode</code> 20. A customer has a device with "Eggs" installed. In an update to your APKs, you decide to remove "Eggs" and use "Ham" exclusively, targeting all devices with it. If you increment Ham's <code>versionCode</code> to 11, customers with Eggs already installed won't receive the update because Eggs has a higher <code>versionCode</code>. Therefore you will need to set your <code>versionCode</code> to 21 or higher before submitting an update.</p> <p><strong>2. Use the same package name for each APK within the same application listing.</strong></p> <p>Each APK for the same application listing must use the same package name in the manifest. See <a href="https://developer.android.com/guide/topics/manifest/manifest-element.html#package">package</a> for details.</p> <p>Every app in the Appstore is identified by its package name. Each app's package name must be unique, and for <a href="../catalog/getting-started-catalog-ingestion.html">catalog integration</a>, the package name cannot include the term <code>amazon</code>.</p> <div class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note:</b> A common reason APKs fail is due to <a href="../app-submission/upload-app-file.html#duplicate-package-name">duplicate package names</a> for <em>different apps</em>. Different apps must have different package names. However, when you have multiple APKs for the same app, each APK must use the same package name. Additionally, when you submit new versions of the APKs, the package names must remain the same from one version to the next.</div> <h3 id="example-of-versioncode-with-multiple-apks">Example of versionCode with multiple APKs</h3> <p>Let's walk through an example of <code>package</code> names and <code>versionCode</code> with multiple APKs. Suppose that for the same app, you're building separate APKs — one APK for Fire tablets and one APK for Amazon Fire TV devices. The attributes for your first APK's manifest might look like this:</p> <p><strong>APK 1's manifest</strong>:</p> <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;manifest</span> <span class="na">xmlns:android=</span><span class="s">"http://schemas.android.com/apk/res/android"</span> <span class="na">package=</span><span class="s">"com.mycompany.myapp"</span><span class="nt">&gt;</span> <span class="nt">&lt;/manifest&gt;</span> </code></pre></div></div> <p><strong>APK 1's build.gradle file</strong>:</p> <pre><code> defaultConfig { minSdkVersion 19 targetSdkVersion 23 versionCode 13 versionName "1.0.6" } </code></pre> <p><strong>APK 2's manifest</strong>:</p> <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;manifest</span> <span class="na">xmlns:android=</span><span class="s">"http://schemas.android.com/apk/res/android"</span> <span class="na">package=</span><span class="s">"com.mycompany.myapp"</span><span class="nt">&gt;</span> <span class="nt">&lt;/manifest&gt;</span> </code></pre></div></div> <p><strong>APK 2's build.gradle file</strong>:</p> <pre><code> defaultConfig { minSdkVersion 22 targetSdkVersion 23 versionCode 14 versionName "1.0.6" } </code></pre> <p>Note that in these code samples, the only difference is the <code>versionCode</code> and, for the sake of variety, the <code>minSdkVersion</code>. The <code>package</code> name remains the same. The manifest and <code>build.gradle</code> file for each app might differ in other ways (declaring different features or intents, for example), but the <code>package</code> names should remain the same. In contrast, each <code>versionCode</code> should use a unique value.</p> <p>(The Appstore does not perform logic checks to ensure the APKs are sufficiently different from each other.)</p> <h3 id="how-multiple-apk-support-on-amazon-differs-from-google-play">How multiple APK support on Amazon differs from Google Play</h3> <p>One way multiple APKs differ on Amazon (versus Google Play), is that with the Amazon Appstore, when you upload multiple APKs, you manually select the supported devices for each APK.</p> <p>For example, suppose more than one APK is compatible for the same device. The supported devices are not automatically selected based on the same logic that Google Play uses (where the highest supported API level for the device is automatically selected, or where a higher <code>versionCode</code> determines the device support).</p> <p>Instead, with Amazon's Appstore, after you upload the first APK, you will see the supported devices automatically selected based on the filtering logic. If you want to support different devices with a second APK, you must manually remove the supported devices from the first APK. Then after you upload the second APK, you can select the devices you want to support with the second APK. The Appstore won't let you support the same device with multiple APKs. (The concept is the same as with Google Play — one APK per device — but the selection process for this on Amazon is manual).</p> <div class="bs-callout bs-callout-primary"><span class="calloutTitle">When devices are unavailable for the second APK</span><br><br>Note that many developers often experience confusion around this point. They upload the second APK and see all devices as incompatible, or they cannot select any of the devices. The reason is because those devices are already selected for the first APK, so they need to deselect the devices in the first APK to make them available for the second APK.</div> <div class="alert alert-success" role="alert"><i class="fa fa-check-square-o"></i> <b>Tip:</b> The steps for uploading multiple APKs are described in detail in <a href="../app-submission/upload-app-file.html#add-multiple-apks">Add multiple APKs for the same app</a>. This section appears in <a href="../app-submission/upload-app-file.html">Step 1: Upload Your App File</a>.</div> <hr> <p id="tech-docs-updated-date"><small><i>Last updated: Oct 17, 2024</i></small></p> </div> </div> </div><!--/.container--> </div><!--/.page-container--> <style> .dpFooter .dpfNav { min-height: 220px; } </style> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/css/search-fullpage.css"> <link rel="stylesheet" href="https://amzndevresources.com/jekyll/js/unload.js"> </div> <section class="dp-content-slot dp-content-pixel-tracker-slot"> <div class="dp-content-slot-inner container"> </div> </section> <footer class='dpFooter'> <a class='dpfBackToTopLink' href='#'>Back to top</a> <nav class="dpfNav accordion clearfix"> <div class='dpfWidth'> <div class='dpfnHideRightMargin'> <div class='dpfnColWrap'> <div class="dpfnCol"> <div class="dpfnGroup accrItem"> <div class='dpIconArrow accrHandle'></div> <h3>Resources</h3> <ul> <li><a href="/apps-and-games/blogs">Appstore Developer Blog</a></li> <li><a href="/apps-and-games/documentation">Technical Documentation</a></li> <li><a href="/apps-and-games/devhuddle">Amazon Developer Huddle</a></li> </ul> </div> </div> <div class="dpfnCol"> <div class="dpfnGroup accrItem"> <div class='dpIconArrow accrHandle'></div> <h3>Supported devices</h3> <ul> <li><a href="/apps-and-games/fire-tv">Amazon Fire TV</a></li> <li><a href="/apps-and-games/fire-tablets">Fire tablets</a></li> </ul> </div> </div> </div> <div class='dpfnColWrap'> <div class="dpfnCol"> <div class="dpfnGroup accrItem"> <div class='dpIconArrow accrHandle'></div> <h3>Other services & APIs</h3> <ul> <li><a href="/apps-and-games/small-business-program">Small Business Accelerator Program</a></li> <li><a href="/docs/reports-promo/promo-overview.html ">Developer Promotions Console</a></li> <li><a href="/apps-and-games/alexa-for-video-publishers">Alexa for video publishers</a></li> <li><a href="/apps-and-games/login-with-amazon">Login with Amazon</a></li> <li><a href="/docs/amazon-data-portability/overview.html">Amazon Data Portability</a></li> <li><a href="/frustration-free-setup">Frustration-Free Setup</a></li> <li><a href="/incentives-api">Amazon Incentives API</a></li> <li><a href="/apps-and-games/merch">Amazon Merch on Demand</a></li> <li><a href="/docs/music/landing_home.html">Amazon Music</a></li> </ul> </div> </div> <div class="dpfnCol"> <div class="dpfnGroup accrItem"> <div class='dpIconArrow accrHandle'></div> <h3>Support</h3> <ul> <li><a href="https://community.amazondeveloper.com/">Appstore Developer Community</a></li> <li><a href="/docs/app-submission/faq-landing.html">FAQs</a></li> <li><a href="/support/contact-us">Contact Us</a></li> </ul> </div> <div class="dpfnGroup accrItem"> <div class='dpIconArrow accrHandle'></div> <h3>Legal</h3> <ul> <li><a href="/terms-and-agreements">Terms & Agreements</a></li> <li><a href="https://www.amazon.com/gp/help/customer/display.html?nodeId=GX7NJQ4ZB8MHFRNJ">Privacy Notice</a></li> </ul> </div> </div> </div> </div> </div> </nav> <div class="dpfSocialLocal clearfix"> <div class='dpfWidth'> <div class='dpfLocale'> <nav class="dpLangSwitcher dpsfFlyout"> <span class='dplsTitle'>Language</span> <div class='dplsSwitch'> <span class="dplsCurrent dpsfFlyoutCurrent"> <i class='dpsfIcon dpsfIconGlobe'></i> English </span> <div class='dplsOptionsWrap dpsfFlyoutWrap'> <ul class="dplsOptions dpsfFlyoutContent"> <li class="dplsOption dpsfFlyoutItem dplsOptionActive"> <a data-locale="en_US" href="/docs/app-submission/device-filtering-and-compatibility.html"> English </a> </li> <li class="dplsOption dpsfFlyoutItem "> <a data-locale="zh_CN" href="/zh/docs/app-submission/device-filtering-and-compatibility.html"> Chinese (中文) </a> </li> <li class="dplsOption dpsfFlyoutItem "> <a data-locale="ja_JP" href="/ja/docs/app-submission/device-filtering-and-compatibility.html"> Japanese (日本語) </a> </li> </ul> </div> </div> </nav> </div> <div class="dpfSocial"> <span class="dpfSocialTitle"> Follow Us: </span> <a href="https://www.youtube.com/channel/UCT9ApARFgQJOeqD-ygmxnJQ"> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logo-youtube.png" alt="youtube_icon"/> </a> <a href="https://www.linkedin.com/showcase/amazon-appstore-developers"> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logo_linkedin._CB1704305834_.png" alt="linkedin_icon"/> </a> <a href="https://www.twitter.com/AmazonAppDev"> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logo_X.png" alt="X_icon"/> </a> <a href="https://www.facebook.com/AmazonAppDev"> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/logo_facebook02.png" alt="facebook_icon"/> </a> <a href="/apps-and-games/blog"> <img src="https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/dex/logo-blog._V290989945_.png" alt="blog_icon"/> </a> </div> </div> </div> <div class="dpfAreaOfInterest dpsfFlyout"> <span class='dpfaCurrent'> <i class='dpsfIcon dpsfIconDots'></i> </span> <div class="dpfWidth dpsfFlyoutWrap"> <div class="dpfaItems dpsfFlyoutContent"> <h3><hza:string id="area_of_interest_title" /></h3> <div class="dpfaItem dpsfFlyoutItem"> <a href="/alexa"> <span class='dpfaiText'>Alexa</span> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/platform-logos/white/Alexalogoheaderwhite._V506548913_.png" alt="Alexa" /> </a> </div> <div class="dpfaItem dpsfFlyoutItem"> <a href="/apps-and-games"> <span class='dpfaiText'>Amazon Appstore</span> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/platform-logos/white/Appstorelogowhite.png" alt="Amazon Appstore" /> </a> </div> <div class="dpfaItem dpsfFlyoutItem"> <a href="https://aws.amazon.com"> <span class='dpfaiText'>Amazon Web Services</span> <img src="https://m.media-amazon.com/images/G/01/mobile-apps/dex/platform-logos/white/AWS_logo_RGB_WHT._CB1506540482_.png" alt="Amazon Web Services" /> </a> </div> </div> </div> </div> <div class="dpfCopyright"> © 2010-2024, Amazon.com, Inc. or its affiliates. All Rights Reserved. </div> </footer> </div></body> <!-- Google Tag Manager (noscript) --> <noscript><iframe sandbox src="https://www.googletagmanager.com/ns.html?id=GTM-5LVXJD4" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> </html>

Pages: 1 2 3 4 5 6 7 8 9 10