tag:blogger.com,1999:blog-67557096430449471792026-02-11T16:14:30.585-08:00Android Developers BlogThe official Android Developers blog covering the latest news on app development tools, platform updates, training, and documentation for developers across every Android device.Birnahttp://www.blogger.com/profile/04044883525253664551[email protected]Blogger1961125tag:blogger.com,1999:blog-6755709643044947179.post-88632914828776802682026-01-29T09:00:00.000-08:002026-01-29T09:00:00.128-08:00Accelerating your insights with faster, smarter monetization data and recommendations<name content="IMG" twitter:image=""><p><em>Posted by </em><span style="font-style: italic; white-space-collapse: preserve;"><span style="font-family: inherit;">Phalene Gowling, Product Manager, Google Play</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;"></span></p><div class="separator" style="clear: both; text-align: center;"><span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUu8IbGbe8xG6oEOPleIJJBclT5w4KzFwx0J6PDnDwjNtswk6F5V2AfGHLEIeiRAsh4aoYPRgg1TY1jd_oSNmEqN8yIUvEkKQdxc9ZlOH9dNhEGMgChsqSsNbCx2YJVxOonczumFbBr-ILpzb3fuDbe2BhCNwE5S6yR-bGd7RtOIF-EdYcJhAUptCfGrY/s4209/260127_Header.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUu8IbGbe8xG6oEOPleIJJBclT5w4KzFwx0J6PDnDwjNtswk6F5V2AfGHLEIeiRAsh4aoYPRgg1TY1jd_oSNmEqN8yIUvEkKQdxc9ZlOH9dNhEGMgChsqSsNbCx2YJVxOonczumFbBr-ILpzb3fuDbe2BhCNwE5S6yR-bGd7RtOIF-EdYcJhAUptCfGrY/s16000/260127_Header.png" /></a></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">To build a thriving business on Google Play, you need more than just data </span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">– </span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">you need a clear path to action. Today, we’re announcing a suite of upgrades to the Google Play Console and beyond, giving you greater visibility into your financial performance and specific, data-backed steps to improve it.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span><span style="background-color: transparent; color: black; font-family: inherit; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></span></p><p><span><span id="docs-internal-guid-345b2028-7fff-c651-aa6a-f452e1dea9a9" style="font-family: inherit;"></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">From new, actionable recommendations to more granular sales reporting, here’s how we’re helping you maximize your ROI.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span id="docs-internal-guid-ecdbda26-7fff-b144-a674-48fd0db048d4"><span style="font-family: inherit; font-size: x-large;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">New: Monetization insights and recommendations</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span style="font-family: inherit; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Launch Status: Rolling out today</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"> Monetize with Play</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> overview page is designed to be your ultimate command center. Today, we are upgrading it with a new dynamic insights section designed to </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">give you a clearer view of your revenue drivers.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><div class="separator" style="clear: both;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG2PJK3eO0myJfVBYX5UaeTzmjBXj9FX_oqYFx3UjdX3tjpPzh-D7ChSh5mFXxoyj9cj379KL1CzOh_JRnWfPbanAf5aR_XgAFHOw49coGHuApSQGmJSIn3E-wSrhh_H8fshWd-RqzHt4qHwWY3p8eeXqpTkTCJmh4sGPx386iJCunarcEV0eMqdif7Ho/s16000/VOP+Recos%20(1).gif" /></div><div class="separator" style="clear: both;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><div class="separator" style="clear: both;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This new insights carousel highlights the visible and invisible value Google Play delivers to your bottom line – including recovered revenue. Alongside these insights, y</span><span style="white-space-collapse: preserve;">ou can now track these critical signals alongside your core performance metrics:</span></span></div><div class="separator" style="clear: both;"><span style="font-family: inherit; white-space-collapse: preserve;"><br /></span></div></name><span id="docs-internal-guid-e4116b9d-7fff-4204-6c17-087bd39debf2"><span style="font-family: inherit;"><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px; text-align: left;"><li><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Optimize conversion:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> Track your new </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Cart Conversion Rate</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></li><li aria-level="1" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Reduce churn:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> Track cancelled subscriptions over time.</span></p></li><li aria-level="1" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Optimize pricing:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> Monitor your Average Revenue Per Paying User (ARPPU).</span></p></li><li aria-level="1" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p role="presentation" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Increase buyer reach:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> Analyze how much of your engaged audience convert to buyers.</span></p></li></ul></span></span><span><span style="font-family: inherit;"><div><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">But we aren’t just showing you the data – we’re helping you act on it</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Starting today, Play Console will surface customized, </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">actionable recommendations</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. If there are relevant opportunities – for example, a high churn rate – we will suggest specific, high-impact steps to help you reach your next monetization goal. Recommendations include effort levels and estimated ROI (where available), helping you prioritize your roadmap based on actual business value. </span><a href="https://support.google.com/googleplay/android-developer/answer/16770947" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Learn more</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></span></div><div><span id="docs-internal-guid-0e3541ed-7fff-eeb6-8b17-7ab0bae48408"><div><br /></div></span></div></span></span><div><span><span style="font-family: inherit;"><br /></span></span><div class="separator" style="clear: both;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_FupxqyHb3fm18u-MwmVOQQJ03q1oP83VNdLjgPIDFJyJfZC3VA3CHw87e5lTiC3UbHA5nsn8SiANsF1vVk344AyGZGVbfkYY0itRhTfO3JeQDmmkind4ZEVluipANEEwqsiU9A_EiwZyIF0AuabfwV2pFp1uTdobdjK7STe0Q6CWb6cPIPo7_wtDq2Q/s16000/Recos.png" /></div><div class="separator" style="clear: both;"><span style="font-family: inherit; font-size: x-large; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><div class="separator" style="clear: both;"><span style="font-family: inherit; font-size: x-large; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Granular visibility: Sales Channel reporting</span><span style="font-family: inherit; font-size: x-large; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span></div><div class="separator" style="clear: both;"><span style="font-style: italic; white-space-collapse: preserve;"><span style="font-family: inherit;">Launch Status: Recently launched</span></span></div></div><span><span style="font-family: inherit;"><span id="docs-internal-guid-0232a2b0-7fff-95d7-7139-7c41d4b515eb"><div><span style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-444ea79a-7fff-321c-0a0a-ad9e1467ed9f"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">We recently rolled out new </span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Sales Channel data</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> in your financial reporting. This allows you to attribute revenue to specific surfaces - including your app, the Play Store, and platforms like Google Play Games on PC. </span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span><span id="docs-internal-guid-497347cd-7fff-6bd8-203e-f29d90b1b420" style="font-family: inherit;"></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">For native-PC game developers and media & entertainment subscription businesses alike, this granularity allows you to calculate the precise ROI of your cross-platform investments and understand exactly which channels are driving your growth. </span><a href="https://support.google.com/googleplay/android-developer/answer/6135870#zippy=%2Cestimated-sales" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Learn more</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span></span></p><div style="font-family: Arial, sans-serif; font-size: 11pt;"><span style="font-size: 11pt; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div></span></span></div></span></span></span><div class="separator" style="clear: both;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqeq3IqcooM2gNTJi7fVGvw49OF8ocTaj0FZg6CZF-s0xwar5pq7zNC6GuYc6COEKzOqwmb7HmLkEzpao3ybFRkZFMxFI4BB_uIJfwen3MzmI24vaK9bN7w5FfA5-FTk1tkPo9_N__cEO3MeTe74ZeoQtGDMGGQ-Ny5yMBSTKUW9e7pASztV670aEIdH0/s16000/20_download.gif" /></div><div class="separator" style="clear: both;"><span style="font-family: inherit; font-size: x-large; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><div class="separator" style="clear: both;"><span style="font-family: inherit; font-size: x-large; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Operational efficiency: The Orders API</span><span style="font-family: inherit; font-size: x-large; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span></div><div class="separator" style="clear: both;"><span style="font-family: inherit; font-style: italic; white-space-collapse: preserve;">Launch Status: Available now</span></div><span><span style="font-family: inherit;"><span id="docs-internal-guid-598fa3a1-7fff-f90f-7c15-06df086d902c" style="font-family: inherit;"><div><span style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-598fa3a1-7fff-f90f-7c15-06df086d902c"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span id="docs-internal-guid-5e506628-7fff-55f4-43a4-ead966fb356f"><span><span style="font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">The </span><a href="https://developers.google.com/android-publisher/api-ref/rest/v3/orders" style="text-decoration-line: none;"><span style="color: #1155cc; font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Orders API</span></a><span style="font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> provides programmatic access to one-time and recurring order transaction details. If you haven't integrated it yet, this API allows you to ingest real-time data directly into your internal dashboards for faster reconciliation and improved customer support.</span></span></span></p></span></span></div></span></span></span><div class="separator" style="clear: both;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRm6oskAWoQqp64r1eyOonGHsXbRjubwH9emshyphenhyphen6Rd4yMbMklBf5WBQcXWanyj6qiwcA3JBtu-vTU7uw7ouyt6WwrJBc8OSEJ5ZuFkLeWLOoioCAprr-i006Ykg8Ewn3Dp4WobAkIvBsJ6VGXnbkR8WZrenez7UfZnPzbqpauNM74baDpFHmg8bSUhT1Q/s16000/Frame%201739328245.png" /></div><div class="separator" style="clear: both;"><span style="font-family: inherit; white-space-collapse: preserve;">Feedback so far has been overwhelmingly positive: </span></div><span><span style="font-family: inherit;"><div><span style="font-family: inherit;"><blockquote><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Level Infinite (Tencent) </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">says the API </span><span style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> “works so well that we want every app to use it."</span></blockquote></span></div><div><span id="docs-internal-guid-dbd2c3c4-7fff-567b-08bd-1fbb6d50ea36"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit; font-size: x-large;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Continuous improvements towards objective-led reporting</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">You’ve told us that the biggest challenge isn't just accessing data, but connecting the dots across different metrics to see the full picture. We’re enhancing reporting that goes beyond data dumps to provide straightforward, actionable insights that help you reach business objectives faster.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span id="docs-internal-guid-7cb3419b-7fff-8f74-3af6-346681e9f278"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our goal is to create a more cohesive product experience centered around </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">your</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">objectives</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. By shifting from static reporting to dynamic, goal-orientated tools, we’re making it easier to track and optimize for revenue, conversion rates, and churn. These updates are just the beginning of a transformation designed to help you turn data into measurable growth.</span></span></span></p><div><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span></div><div><span style="white-space-collapse: preserve;"><br /></span></div><div><span style="white-space-collapse: preserve;"><br /></span></div><div><span style="white-space-collapse: preserve;"><br /></span></div><div><span style="white-space-collapse: preserve;"><br /></span></div><div><span style="white-space-collapse: preserve;"><br /></span></div><div><span style="white-space-collapse: preserve;"><br /></span></div><div><span style="white-space-collapse: preserve;"><br /></span></div></span></span>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-50247444245921303442026-01-28T09:00:00.000-08:002026-02-03T06:44:56.317-08:00How Automated Prompt Optimization Unlocks Quality Gains for ML Kit’s GenAI Prompt API<name content="IMG" twitter:image=""><p><em>Posted by Chetan Tekur, PM at AI Innovation and Research, Chao Zhao, SWE at AI Innovation and Research, Paul Zhou, Prompt Quality Lead at GCP Cloud AI and Industry Solutions, and Caren Chang, Developer Relations Engineer at Android</em></p><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzM3vaSLDllo5iph05S1l97RLQ1XKgYStArRkBvdEJ2qejXt-frMkDB_qHxsjoVEQDVXCPjOUYwtXDLB91MaeddmZsFqgeWKFyokTcWTMRY2rxuGp9Y-5ZCRDc7SfivBUukNaC3wmLfVMzykxvl3fm3kh_Be_C-Zo2BdeJhU87mddSniZTJGa0efyWd9Y/s4209/Prompt-API-Banner%20(1).png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzM3vaSLDllo5iph05S1l97RLQ1XKgYStArRkBvdEJ2qejXt-frMkDB_qHxsjoVEQDVXCPjOUYwtXDLB91MaeddmZsFqgeWKFyokTcWTMRY2rxuGp9Y-5ZCRDc7SfivBUukNaC3wmLfVMzykxvl3fm3kh_Be_C-Zo2BdeJhU87mddSniZTJGa0efyWd9Y/s16000/Prompt-API-Banner%20(1).png" /></a></div><span style="font-family: inherit;"><br /><span id="docs-internal-guid-e305b9fe-7fff-1e4b-b89c-fc9b239792e5"><span style="font-family: inherit;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="color: #1f1f1f; white-space-collapse: preserve;"><b><span style="font-family: inherit; font-size: x-large;">Automated Prompt Optimization (APO)</span></b></span></p></span></span></span></name><div><name content="IMG" twitter:image=""><span id="docs-internal-guid-ea993e2b-7fff-8452-d660-3bc80be09d93"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">To further help bring your ML Kit Prompt API use cases to production, we are excited to announce </span><a href="https://docs.cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/zero-shot-optimizer#optimizing_for_smaller_models" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Automated Prompt Optimization (APO) targeting On-Device models on Vertex AI</span></a><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Automated Prompt Optimization is a tool that helps you automatically find the optimal prompt for your use cases.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The era of On-Device AI is no longer a promise—it is a production reality. With the release of </span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Gemini Nano v3</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, we are placing unprecedented language understanding and multimodal capabilities directly into the palms of users. Through the Gemini Nano family of models, we have wide coverage of supported devices across the Android Ecosystem. But for developers building the next generation of intelligent apps, access to a powerful model is only step one. The real challenge lies in </span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">customization</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: How do you tailor a foundation model to expert-level performance for your specific use case without breaking the constraints of mobile hardware?</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">In the server-side world, the larger LLMs tend to be highly capable and require less domain adaptation. Even when needed, more advanced options such as LoRA (Low-Rank Adaptation) fine-tuning can be feasible options. However, the unique architecture of Android AICore prioritizes a </span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">shared, memory-efficient system model</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. This means that deploying custom LoRA adapters for every individual app comes with challenges on these shared system services.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">But there is an alternate path that can be equally impactful. By leveraging </span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Automated Prompt Optimization (APO)</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> on Vertex AI, developers can achieve quality approaching fine-tuning, all while working seamlessly within the native Android execution environment. By focusing on superior system instruction, APO enables developers to tailor model behavior with greater robustness and scalability than traditional fine-tuning solutions.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span id="docs-internal-guid-5c954ba0-7fff-cdf3-65af-51fe569d5d6b"><span style="font-family: inherit;"><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Note: </span><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Gemini Nano V3 is a quality optimized version of the highly acclaimed </span><a href="https://developers.googleblog.com/en/introducing-gemma-3n/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Gemma 3N</span></a><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> model. Any prompt optimizations that are made on the open source Gemma 3N model will apply to Gemini Nano V3 as well. On </span><a href="https://developers.google.com/ml-kit/genai#prompt-device" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">supported devices</span></a><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, ML Kit GenAI APIs leverage the </span><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">nano-v3</span><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> model to maximize the quality for Android Developers</span></span></span></p><div><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4O-6TGBs-g06EHQHaDaoJRSlG5LrgeZfwGHwzBdM87LkbrQ0s6OZVD5J5SXufoy07KdcB10qIy7iAopssbt1fKJpPpWheSHdbETtg8Vyt9ZDn-Yy6xUhGl2WFkVe5LcR-6zhN-t3texV_arqoDIwmz8UlULlzmZ4M17uMBdraiJtEh_vRa4G8S3jGuDY/s960/APO%20block%20diagram.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="960" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4O-6TGBs-g06EHQHaDaoJRSlG5LrgeZfwGHwzBdM87LkbrQ0s6OZVD5J5SXufoy07KdcB10qIy7iAopssbt1fKJpPpWheSHdbETtg8Vyt9ZDn-Yy6xUhGl2WFkVe5LcR-6zhN-t3texV_arqoDIwmz8UlULlzmZ4M17uMBdraiJtEh_vRa4G8S3jGuDY/s16000/APO%20block%20diagram.jpg" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div></span></div></span></name></div><div><name content="IMG" twitter:image=""><span id="docs-internal-guid-a60a3ab8-7fff-6d1f-553d-9011b03e465a"><span style="font-family: inherit;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">APO treats the prompt not as a static text, but as a programmable surface that can be optimized. It leverages server-side models (like Gemini Pro and Flash) to propose prompts, evaluate variations and find the optimal one for your specific task. This process employs three specific technical mechanisms to maximize performance:</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span style="font-family: inherit;"><span id="docs-internal-guid-6685dd1c-7fff-204c-93e0-3bae18fad340"></span></span></p><ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: decimal; margin-left: -12pt; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Automated Error Analysis:</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> APO analyzes error patterns from training data to Automatically identify specific weaknesses in the initial prompt.</span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: decimal; margin-left: -12pt; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Semantic Instruction Distillation:</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> It analyzes massive training examples to distill the "true intent" of a task, creating instructions that more accurately reflect the real data distribution.</span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: decimal; margin-left: -12pt; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Parallel Candidate Testing:</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Instead of testing one idea at a time, APO generates and tests numerous prompt candidates in parallel to identify the global maximum for quality.</span></span></p></li></ol><div><span style="color: #1f1f1f;"><span style="white-space-collapse: preserve;"><br /></span></span></div><div><span id="docs-internal-guid-638fae10-7fff-cef2-e426-75382acd45f1"><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 6pt;"><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit; font-size: x-large;">Why APO Can Approach Fine Tuning Quality</span></span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">It is a common misconception that fine-tuning always yields better quality than prompting. For modern foundation models like Gemini Nano v3, prompt engineering can be impactful by itself:</span></span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; margin-left: -12.75pt; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Preserving General capabilities:</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Fine-tuning ( PEFT/LoRA) forces a model's weights to over-index on a specific distribution of data. This often leads to "catastrophic forgetting," where the model gets better at your specific syntax but worse at general logic and safety. APO leaves the weights untouched, preserving the capabilities of the base model.</span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; margin-left: -12.75pt; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Instruction Following & Strategy Discovery:</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Gemini Nano v3 has been rigorously trained to follow complex system instructions. APO exploits this by finding the </span><span style="background-color: transparent; color: #1f1f1f; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">exact</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> instruction structure that unlocks the model's latent capabilities, often discovering strategies that might be hard for human engineers to find. </span></span></p></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span id="docs-internal-guid-55aac14a-7fff-9bab-3900-ba14ee98dd83"><span style="font-family: inherit;"><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To validate this approach, we evaluated APO across diverse production workloads. Our validation has shown consistent </span><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">5-8% accuracy gains</span><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> across various use cases.Across multiple deployed on-device features, APO provided significant quality lifts.</span></span></span></p><div dir="ltr" style="margin: 0px auto; width: fit-content;"></div><span style="font-family: inherit;"><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /><br /></span></span><p></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 6pt;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit; font-size: x-large;"><span id="docs-internal-guid-641026f9-7fff-7618-0512-c76ffd65aaad" style="font-weight: normal;"><div align="left" dir="ltr" style="margin-left: -20.25pt;"><table style="border-collapse: collapse; border: none;"><colgroup><col width="152"></col><col width="125"></col><col width="125"></col><col width="125"></col><col width="125"></col></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 6pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Use Case</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 6pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Task Type</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 6pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Task Description</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 6pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Metric</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 6pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">APO Improvement</span></p></td></tr><tr style="height: 0pt;"><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Topic classification</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Text classification</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Classify a news article into topics such as finance, sports, etc</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Accuracy</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">+5%</span></p></td></tr><tr style="height: 0pt;"><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Intent classification</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Text classification</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Classify a customer service query into intents</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Accuracy</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">+8.0%</span></p></td></tr><tr style="height: 0pt;"><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Webpage translation</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Text translation</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Translate a webpage from English to a local language</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">BLEU</span></p></td><td style="background-color: #f8fafd; border-bottom: solid #000000 0.75pt; border-color: rgb(0, 0, 0); border-left: solid #000000 0.75pt; border-right: solid #000000 0.75pt; border-style: solid; border-top: solid #000000 0.75pt; border-width: 0.75pt; overflow-wrap: break-word; overflow: hidden; padding: 6pt 9pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">+8.57%</span></p></td></tr></tbody></table></div></span></span></span></h2><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 6pt;"><span style="color: #1f1f1f; font-family: inherit; font-size: xx-large; white-space-collapse: preserve;">A Seamless, End-to-End Developer Workflow</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">It is a common misconception that fine-tuning always yields better quality than prompting. For modern foundation models like Gemini Nano v3, prompt engineering can be impactful by itself:</span></span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; margin-left: -12.75pt; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Preserving General capabilities:</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Fine-tuning ( PEFT/LoRA) forces a model's weights to over-index on a specific distribution of data. This often leads to "catastrophic forgetting," where the model gets better at your specific syntax but worse at general logic and safety. APO leaves the weights untouched, preserving the capabilities of the base model.</span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; margin-left: -12.75pt; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Instruction Following & Strategy Discovery:</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Gemini Nano v3 has been rigorously trained to follow complex system instructions. APO exploits this by finding the </span><span style="background-color: transparent; color: #1f1f1f; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">exact</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> instruction structure that unlocks the model's latent capabilities, often discovering strategies that might be hard for human engineers to find. </span></span></p></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span id="docs-internal-guid-55aac14a-7fff-9bab-3900-ba14ee98dd83"><span style="font-family: inherit;"><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To validate this approach, we evaluated APO across diverse production workloads. Our validation has shown consistent </span><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">5-8% accuracy gains</span><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> across various use cases.Across multiple deployed on-device features, APO provided significant quality lifts.</span></span></span></p></span></div></span></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><span id="docs-internal-guid-1f807f6a-7fff-57c8-bcf4-d94f6b2cb3a0"><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 6pt;"><span style="color: #1f1f1f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit; font-size: large;">Conclusion</span></span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The release of </span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Automated Prompt Optimization (APO)</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> marks a turning point for on-device generative AI. By bridging the gap between foundation models and expert-level performance, we are giving developers the tools to build more robust mobile applications. Whether you are just starting with </span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Zero-Shot Optimization</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> or scaling to production with </span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Data-Driven</span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> refinement, the path to high-quality on-device intelligence is now clearer.</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Launch your on-device use cases to production today with ML Kit’s Prompt API and Vertex AI’s Automated Prompt Optimization. </span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Relevant links: </span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit;"><span id="docs-internal-guid-48074f87-7fff-43d7-102d-11786658c541"></span></span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 6pt;"><span style="font-family: inherit;"><a href="https://developers.google.com/ml-kit/genai/prompt/android/get-started" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">ML Kit Prompt API</span></a><span style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">,</span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/prompt-optimizer" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Vertex AI Prompt Optimizer documentation</span></span></a></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #1f1f1f; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><a href="https://developers.googleblog.com/en/introducing-gemma-3n/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Gemma 3N Announcement Blog</span></span></a></p></li></ul><div><span face=""Google Sans Text", sans-serif" style="color: #1f1f1f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-32900006518820310412026-01-27T09:00:00.000-08:002026-02-02T07:58:11.622-08:00The Embedded Photo Picker<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY1wEobfsqoXUEoE0OKVXwr70_ve9cWyEyoEXLddqYn98SHHRT3o29pWUojzFFP00wy-t0S8xfXd9AxAZssnEmaSyKIh9IaWGSCVsE_A2PWqAfm7W1YcivEREfNNgdBLgrSehRI4fv1kSoOxs4PK8yk_3GJM1qexLvdD2ONFWpIWmK4igwTwS9zhqs_AI/s1280/AndroidPhotoPicker_Blogger.gif" property="og:image"></meta>
<div class="separator"></div><h1 style="text-align: left;"><name content="IMG" twitter:image=""><em style="font-size: medium; font-weight: 400;">Posted by Roxanna Aliabadi Walker, Product Manager and Yacine Rezgui, Developer Relations Engineer</em></name></h1><h1><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY1wEobfsqoXUEoE0OKVXwr70_ve9cWyEyoEXLddqYn98SHHRT3o29pWUojzFFP00wy-t0S8xfXd9AxAZssnEmaSyKIh9IaWGSCVsE_A2PWqAfm7W1YcivEREfNNgdBLgrSehRI4fv1kSoOxs4PK8yk_3GJM1qexLvdD2ONFWpIWmK4igwTwS9zhqs_AI/s16000/AndroidPhotoPicker_Blogger.gif" /></h1><span style="font-family: inherit; font-size: x-large;"><b>The Embedded Photo Picker: A more seamless way to privately request photos and videos in your app</b></span><div><span style="font-size: x-large;"><b><br /></b></span><name content="IMG" twitter:image=""><div class="separator" style="clear: both; text-align: center;"><span style="border: none; display: inline-block; height: 181px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 610px;"><img height="181" src="https://blogger.googleusercontent.com/img/a/AVvXsEjyYRSFf_nh2g6IPRK7cvFTGgrn-tcdmM_ANQ9BL4YlmLP7prxhaVjo2ujsQz2L9pTzshFwSFUXPiN-NG6gPYwV-jOSyvs-DiCKM4NIfSATmIkcDK143FEEvLkHD1OMRMsmP8s7Y_RwuRZfS4zzkYm2ZAEE5ij09jmCzNRWeA9B-FXR5PvI2t54Ikfjvjc" style="margin-left: 0px; margin-top: 0px;" width="610" /></span></div><p><span><span face=""Google Sans", sans-serif" style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-3bf7a061-7fff-c0c8-dbd7-836db9733d0c"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"></span></span></span></span></p><span style="font-family: inherit;"><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><br /></span></name></div>Get ready to enhance your app's user experience with an exciting new way to use the Android photo picker! The new embedded photo picker offers a seamless and privacy-focused way for users to select photos and videos, right within your app's interface. Now your app can get all the same benefits available with the photo picker, including access to cloud content, integrated directly into your app’s experience.</span></name><div><br /></div><div><span style="font-family: inherit; font-size: x-large;"><b>Why embedded?</b></span></div><div><span style="font-family: inherit; font-size: x-large;"><span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></span></div><span id="docs-internal-guid-6d097a78-7fff-e0ae-633c-a936f3442dc3"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">We understand that many apps want to provide a highly integrated and seamless experience for users when selecting photos or videos. The embedded photo picker is designed to do just that, allowing users to quickly access their recent photos without ever leaving your app. They can also explore their full library in their preferred cloud media provider (e.g., Google Photos), including favorites, albums and search functionality. This eliminates the need for users to switch between apps or worry about whether the photo they want is stored locally or in the cloud.</span></span></span><br /><span style="font-family: inherit; font-size: x-large;"><b><br />Seamless integration, enhanced privacy</b></span><div><span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></div><div><span style="font-family: inherit;"><span id="docs-internal-guid-30392399-7fff-5950-9c88-344623faf4e7"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">With the embedded photo picker, your app doesn't need access to the user's photos or videos until they actually select something. This means greater privacy for your users and a more streamlined experience. Plus, the embedded photo picker provides users with access to their entire cloud-based media library, whereas the standard photo permission is restricted to local files only.</span></span></span></div><div><span style="font-family: inherit;"><span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></span></div><span style="font-family: inherit; font-size: x-large;"><b>The embedded photo picker in Google Messages</b></span><div><span style="font-family: inherit;"><br /></span></div><div><span style="font-family: inherit;">Google Messages showcases the power of the embedded photo picker. Here's how they've integrated it:</span></div><div><ul style="text-align: left;"><li><span style="font-family: inherit;"><b>Intuitive placement: </b>The photo picker sits right below the camera button, giving users a clear choice between capturing a new photo or selecting an existing one.</span></li><li><span style="font-family: inherit;"><b>Dynamic preview:</b> Immediately after a user taps a photo, they see a large preview, making it easy to confirm their selection. If they deselect the photo, the preview disappears, keeping the experience clean and uncluttered.</span></li><li><span style="font-family: inherit;"><b>Expand for more content: </b>The initial view is simplified, offering easy access to recent photos. However, users can easily expand the photo picker to browse and choose from all photos and videos in their library, including cloud content from Google Photos.</span></li><li><span style="font-family: inherit;"><b>Respecting user choices:</b> The embedded photo picker only grants access to the specific photos or videos the user selects, meaning they can stop requesting the photo and video permissions altogether. This also saves the Messages from needing to handle situations where users only grant limited access to photos and videos.</span></li></ul><div style="align-items: flex-start; clear: both; display: flex; flex-wrap: wrap; gap: 16px; justify-content: center; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYB1a2iMLle1b_po25Yz2BrOVmJbQsAIqSL9fDYtDYSwg7j3yWet_PK-eR8w9L4cPUW3WaIrmQKw9SzIme2zNRtgE2JtHZVySj63AHT4aYyTHvcCFX4z0SXaRpRYNgoJSKKRAyvxejQ_V4YBfdu7ToQJ-WjMId3FCXREndaIaYY2Sdv5QhGSaCKm3nOTk/s1094/Messages%20and%20collapsed-picker_optimized.gif">
<img height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYB1a2iMLle1b_po25Yz2BrOVmJbQsAIqSL9fDYtDYSwg7j3yWet_PK-eR8w9L4cPUW3WaIrmQKw9SzIme2zNRtgE2JtHZVySj63AHT4aYyTHvcCFX4z0SXaRpRYNgoJSKKRAyvxejQ_V4YBfdu7ToQJ-WjMId3FCXREndaIaYY2Sdv5QhGSaCKm3nOTk/w293-h640/Messages%20and%20collapsed-picker_optimized.gif" style="height: auto; max-width: 100%;" width="293" />
</a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSOEjOGn_EiAzqAC8_pDMkxK3hUVWdd9GiJo2mCRq0g2q1NuagelfjXJxj0qZgtZ1vKDOLeQdePLQAT6PUbDKQ5WxZEDS1hOGH1jUpSB5vO_3bx4O7btuu-bciB7bBJWh1sS2b0Z06hq6a3u3lMiE2Z3qQB66PQ948BRh8gmkupgtbVD74y6mTSLvjp9s/s902/Messages%20and%20picker_optimized.gif">
<img height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSOEjOGn_EiAzqAC8_pDMkxK3hUVWdd9GiJo2mCRq0g2q1NuagelfjXJxj0qZgtZ1vKDOLeQdePLQAT6PUbDKQ5WxZEDS1hOGH1jUpSB5vO_3bx4O7btuu-bciB7bBJWh1sS2b0Z06hq6a3u3lMiE2Z3qQB66PQ948BRh8gmkupgtbVD74y6mTSLvjp9s/w292-h640/Messages%20and%20picker_optimized.gif" style="height: auto; max-width: 100%;" width="292" />
</a>
</div><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><span style="font-family: inherit; font-size: x-large;"><b>Implementation</b></span><div><span style="font-family: inherit;"><span id="docs-internal-guid-492f71a7-7fff-adfc-c8c0-bdaaaaa066bc"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Integrating the embedded photo picker is made easy with the </span><a href="https://developer.android.com/jetpack/androidx/releases/photopicker" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Photo Picker Jetpack library</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. </span></span></p></span><span><div><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-15288c3d-7fff-2a74-1da8-17ea3aabe3bd"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-family: inherit; font-size: x-large;"><b>Jetpack Compose</b></span></span></span></span></div><div><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-family: inherit;"><br /></span></span></span></span></div></span></span><span style="font-family: inherit;">First, include the Jetpack Photo Picker library as a dependency.</span><span style="font-family: inherit;"><span><div><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-family: inherit;"><br /></span></span></span></span></div><div><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-family: inherit;"><pre style="color: #333333; line-height: 16.25px; margin: 0px;">implementation(<span style="color: #a31515;">"androidx.photopicker:photopicker-compose:1.0.0-alpha01"</span>)</pre></span></span></span></span></div></span></span></div><div><span style="font-family: inherit;"><br /></span></div><div><span id="docs-internal-guid-3e71b970-7fff-1cfd-c66c-99956bb7d352"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">The</span></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">EmbeddedPhotoPicker</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">composable function provides a mechanism to include the embedded photo picker UI directly within your Compose screen. This composable creates a</span></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">SurfaceView</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">which hosts the embedded photo picker UI. It manages the connection to the</span></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">EmbeddedPhotoPicker</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">service, handles user interactions, and communicates selected media URIs to the calling application. </span></span></span></div><br /><pre style="color: #333333; line-height: 16.25px; margin: 0px;">@Composable
<span style="color: blue;">fun</span> EmbeddedPhotoPickerDemo() {
<span style="color: green;">// We keep track of the list of selected attachments</span>
<span style="color: blue;">var</span> attachments <span style="color: blue;">by</span> remember { mutableStateOf(emptyList<Uri>()) }
<span style="color: blue;">val</span> coroutineScope = rememberCoroutineScope()
<span style="color: green;">// We hide the bottom sheet by default but we show it when the user clicks on the button</span>
<span style="color: blue;">val</span> scaffoldState = rememberBottomSheetScaffoldState(
bottomSheetState = rememberStandardBottomSheetState(
initialValue = SheetValue.Hidden,
skipHiddenState = <span style="color: blue;">false</span>
)
)
<span style="color: green;">// Customize the embedded photo picker</span>
<span style="color: blue;">val</span> photoPickerInfo = EmbeddedPhotoPickerFeatureInfo
.Builder()
<span style="color: green;">// Set limit the selection to 5 items</span>
.setMaxSelectionLimit(5)
<span style="color: green;">// Order the items selection (each item will have an index visible in the photo picker)</span>
.setOrderedSelection(<span style="color: blue;">true</span>)
<span style="color: green;">// Set the accent color (red in this case, otherwise it follows the device's accent color)</span>
.setAccentColor(0xFF0000)
.build()
<span style="color: green;">// The embedded photo picker state will be stored in this variable</span>
<span style="color: blue;">val</span> photoPickerState = rememberEmbeddedPhotoPickerState(
onSelectionComplete = {
coroutineScope.launch {
<span style="color: green;">// Hide the bottom sheet once the user has clicked on the done button inside the picker</span>
scaffoldState.bottomSheetState.hide()
}
},
onUriPermissionGranted = {
<span style="color: green;">// We update our list of attachments with the new Uris granted</span>
attachments += it
},
onUriPermissionRevoked = {
<span style="color: green;">// We update our list of attachments with the Uris revoked</span>
attachments -= it
}
)
SideEffect {
<span style="color: blue;">val</span> isExpanded = scaffoldState.bottomSheetState.targetValue == SheetValue.Expanded
<span style="color: green;">// We show/hide the embedded photo picker to match the bottom sheet state</span>
photoPickerState.setCurrentExpanded(isExpanded)
}
BottomSheetScaffold(
topBar = {
TopAppBar(title = { Text(<span style="color: #a31515;">"Embedded Photo Picker demo"</span>) })
},
scaffoldState = scaffoldState,
sheetPeekHeight = <span style="color: blue;">if</span> (scaffoldState.bottomSheetState.isVisible) 400.dp <span style="color: blue;">else</span> 0.dp,
sheetContent = {
Column(Modifier.fillMaxWidth()) {
<span style="color: green;">// We render the embedded photo picker inside the bottom sheet</span>
EmbeddedPhotoPicker(
state = photoPickerState,
embeddedPhotoPickerFeatureInfo = photoPickerInfo
)
}
}
) { innerPadding ->
Column(Modifier.padding(innerPadding).fillMaxSize().padding(horizontal = 16.dp)) {
Button(onClick = {
coroutineScope.launch {
<span style="color: green;">// We expand the bottom sheet, which will trigger the embedded picker to be shown</span>
scaffoldState.bottomSheetState.partialExpand()
}
}) {
Text(<span style="color: #a31515;">"Open photo picker"</span>)
}
LazyVerticalGrid(columns = GridCells.Adaptive(minSize = 64.dp)) {
<span style="color: green;">// We render the image using the Coil library</span>
itemsIndexed(attachments) { index, uri ->
AsyncImage(
model = uri,
contentDescription = <span style="color: #a31515;">"Image ${</span>index + 1<span style="color: #a31515;">}"</span>,
contentScale = ContentScale.Crop,
modifier = Modifier.clickable {
coroutineScope.launch {
<span style="color: green;">// When the user clicks on the media from the app's UI, we deselect it</span>
<span style="color: green;">// from the embedded photo picker by calling the method deselectUri</span>
photoPickerState.deselectUri(uri)
}
}
)
}
}
}
}
}</pre><div><span style="font-family: inherit;"><br /></span></div><span style="font-family: inherit; font-size: x-large;"><b>Views</b></span><span style="font-family: inherit;"><br /><br /></span><div><span style="font-family: inherit;">First, include the Jetpack Photo Picker library as a dependency.</span><div><br /><div><pre style="color: #333333; line-height: 16.25px; margin: 0px;">implementation(<span style="color: #a31515;">"androidx.photopicker:photopicker:1.0.0-alpha01"</span>)</pre></div><div><span face="Arial, sans-serif" style="font-size: 11pt; white-space-collapse: preserve;"><br /></span></div><div><span style="white-space-collapse: preserve;"><span style="font-family: inherit;">To add the embedded photo picker, you need to add an entry to your layout file. </span></span></div><div><span style="white-space-collapse: preserve;"><span style="font-family: inherit;"><br /></span></span></div><div><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><view class=<span style="color: #a31515;">"androidx.photopicker.EmbeddedPhotoPickerView"</span>
android:id=<span style="color: #a31515;">"@+id/photopicker"</span>
android:layout_width=<span style="color: #a31515;">"match_parent"</span>
android:layout_height=<span style="color: #a31515;">"match_parent"</span> /></pre></div><div><span style="font-family: inherit;"><br /></span></div><div><span style="font-family: inherit;">And initialize it in your activity/fragment.</span></div><div><br /></div><div><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: green;">// We keep track of the list of selected attachments</span>
<span style="color: blue;">private</span> <span style="color: blue;">val</span> _attachments = MutableStateFlow(emptyList<Uri>())
<span style="color: blue;">val</span> attachments = _attachments.asStateFlow()
<span style="color: blue;">private</span> <span style="color: blue;">lateinit</span> <span style="color: blue;">var</span> picker: EmbeddedPhotoPickerView
<span style="color: blue;">private</span> <span style="color: blue;">var</span> openSession: EmbeddedPhotoPickerSession? = <span style="color: blue;">null</span>
<span style="color: blue;">val</span> pickerListener = <span style="color: blue;">object</span> <span style="color: #2b91af;">EmbeddedPhotoPickerStateChangeListener</span> {
<span style="color: blue;">override</span> <span style="color: blue;">fun</span> onSessionOpened (newSession: EmbeddedPhotoPickerSession) {
openSession = newSession
}
<span style="color: blue;">override</span> <span style="color: blue;">fun</span> onSessionError (throwable: Throwable) {}
<span style="color: blue;">override</span> <span style="color: blue;">fun</span> onUriPermissionGranted(uris: List<Uri>) {
_attachments += uris
}
<span style="color: blue;">override</span> <span style="color: blue;">fun</span> onUriPermissionRevoked (uris: List<Uri>) {
_attachments -= uris
}
<span style="color: blue;">override</span> <span style="color: blue;">fun</span> onSelectionComplete() {
<span style="color: green;">// Hide the embedded photo picker as the user is done with the photo/video selection</span>
}
}
<span style="color: blue;">override</span> <span style="color: blue;">fun</span> onCreate(savedInstanceState: Bundle?) {
<span style="color: blue;">super</span>.onCreate(savedInstanceState)
setContentView(R.layout.main_view)
<span style="color: green;">//</span>
<span style="color: green;">// Add the embedded photo picker to a bottom sheet to allow the dragging to display the full photo library</span>
<span style="color: green;">//</span>
picker = findViewById(R.id.photopicker)
picker.addEmbeddedPhotoPickerStateChangeListener(pickerListener)
picker.setEmbeddedPhotoPickerFeatureInfo(
<span style="color: green;">// Set a custom accent color</span>
EmbeddedPhotoPickerFeatureInfo.Builder().setAccentColor(0xFF0000).build()
)
}</pre><span style="font-family: inherit;"></span><div><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-family: inherit;"><br /></span></span></div><div><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-family: inherit;">You can call different methods of </span><span style="color: #188038; font-family: Roboto Mono, monospace;"><span style="font-size: 11pt; white-space-collapse: preserve;">EmbeddedPhotoPickerSession</span></span></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="font-family: inherit;">to interact with the embedded picker.</span></div><div><br /></div><div><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: green;">// Notify the embedded picker of a configuration change</span>
openSession.notifyConfigurationChanged(newConfig)
<span style="color: green;">// Update the embedded picker to expand following a user interaction</span>
openSession.notifyPhotoPickerExpanded(<span style="color: green;">/* expanded: */</span> <span style="color: blue;">true</span>)
<span style="color: green;">// Resize the embedded picker</span>
openSession.notifyResized(<span style="color: green;">/* width: */</span> 512, <span style="color: green;">/* height: */</span> 256)
<span style="color: green;">// Show/hide the embedded picker (after a form has been submitted)</span>
openSession.notifyVisibilityChanged(<span style="color: green;">/* visible: */</span> <span style="color: blue;">false</span>)
<span style="color: green;">// Remove unselected media from the embedded picker after they have been</span>
<span style="color: green;">// unselected from the host app's UI</span>
openSession.requestRevokeUriPermission(removedUris)</pre></div><div><span style="font-family: inherit;"><br /></span></div><div><span style="font-family: inherit;">It's important to note that the embedded photo picker experience is available for users running Android 14 (API level 34) or higher with SDK Extensions 15+. <a href="https://developer.android.com/training/data-storage/shared/photo-picker/embedded#device-availability">Read more about photo picker device availability</a>.</span></div><div><span id="docs-internal-guid-37dd1c67-7fff-4bfa-2b90-f28a2a2564ec"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;">For enhanced user privacy and security, the system renders the embedded photo picker in a way that prevents any drawing or overlaying. This intentional design choice means that your UX should consider the photo picker's display area as a distinct and dedicated element, much like you would plan for an advertising banner.<br /><br />If you have any feedback or suggestions, submit tickets to our </span><a href="https://developer.android.com/about/versions/14/feedback#create_vote" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="background-color: white; color: #1769e0; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">issue tracker</span></a><span face="Arial, sans-serif" style="background-color: white; color: #202124; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><div><span face="Arial, sans-serif" style="background-color: white; color: #202124; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span></div><div><span style="font-family: inherit; font-size: x-large;"><b><br /></b></span></div></div></div></div></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-29542086298160238212026-01-26T19:30:00.000-08:002026-01-26T19:30:00.121-08:00Beyond the smartphone: How JioHotstar optimized its UX for foldables and tablets<span style="font-family: inherit;"><i>Posted by Prateek Batra, Developer Relations Engineer, Android Adaptive Apps</i></span><name content="IMG" twitter:image=""><p></p></name><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxkdTthP8A7AMul1rBwU1dJgplW3Ckc2iwnD0K19coPlps-xHa4HcMJoo-6FqUFPCDBAERlTO0qZ4oduKoyBFxLvnY8FtyQ2JecKqJPt9l2rAA9U-LW4URdgB1Z5mWJcboiEq4QeMc8npaUl_v8ItwEDR76wQA3V6s3xgmFfki34hShzyHGSnlq755XzE/s8419/Beyond%20Phones%20How%20JioHotstar%20Built%20an%20Adaptive%20UX%20Blog%20.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="2507" data-original-width="8419" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxkdTthP8A7AMul1rBwU1dJgplW3Ckc2iwnD0K19coPlps-xHa4HcMJoo-6FqUFPCDBAERlTO0qZ4oduKoyBFxLvnY8FtyQ2JecKqJPt9l2rAA9U-LW4URdgB1Z5mWJcboiEq4QeMc8npaUl_v8ItwEDR76wQA3V6s3xgmFfki34hShzyHGSnlq755XzE/s16000/Beyond%20Phones%20How%20JioHotstar%20Built%20an%20Adaptive%20UX%20Blog%20.png" /></a></div><br /></div><div><br /></div><div><span style="font-family: inherit;"><span id="docs-internal-guid-220a4402-7fff-671c-c5c1-4665259d844c"><span face="Arial, sans-serif" style="font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Beyond Phones: How JioHotstar Built an Adaptive UX</span></span></span></div><div><br /></div><div><a href="https://play.google.com/store/apps/details?id=in.startv.hotstar&hl=en_IN" style="font-family: inherit; text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">JioHotstar</span></a><span style="background-color: white; color: #444746; font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: white; font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">is a leading streaming platform in India, serving a user base exceeding 400 million. With a vast content library encompassing over 330,000 hours of video on demand (VOD) and real-time delivery of major sporting events, the platform operates at a massive scale.</span></div><div><span style="font-family: inherit;"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">T</span><span style="background-color: white; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">o help ensure a premium experience for its vast audience, JioHotstar elevated the viewing experience by optimizing their app for foldables and tablets. They accomplished this by following Google’s adaptive app guidance and utilizing resources like</span><span style="background-color: white; color: #444746; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><a href="https://developer.android.com/design/ui/large-screens/samples" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">samples</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><a href="https://github.com/android/large-screen-codelabs" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">codelabs</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><a href="https://developer.android.com/guide/topics/large-screens/large-screen-cookbook" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">cookbooks</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and </span><a href="https://developer.android.com/guide/topics/large-screens" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">documentation</span></a><span style="background-color: white; color: #444746; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="background-color: white; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">to help create a consistently seamless and engaging experience across all display sizes.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; color: #444746; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-64c03026-7fff-1bb2-a98a-9a93c53967f8"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-size: 18pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">JioHotstar's large screen challenge</span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: white; color: #444746; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-f7c3fd7e-7fff-355d-78ff-eab6df19dbd9"></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">JioHotstar offered an excellent user experience on standard phones and the team wanted to take advantage of new form factors. To start, the team evaluated their app against the </span><a href="https://developer.android.com/docs/quality-guidelines/large-screen-app-quality" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">large screen app quality guidelines</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> to understand the optimizations required to extend their user experience to foldables and tablets. To achieve </span><a href="https://developer.android.com/docs/quality-guidelines/large-screen-app-quality?hl=en#tier_1_best_large_screen_differentiated" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Tier 1</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> large screen app status, the team implemented two strategic updates to adapt the app across various form factors and differentiate on foldables. By addressing the unique challenges posed by foldable and tablet devices, JioHotstar aims </span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">to deliver</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> a high-quality and immersive experience across all display sizes and aspect ratios.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-75f81b7f-7fff-b6db-2a79-cd5199bf2129"><span face=""Google Sans", sans-serif" style="font-size: 18pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">What they needed to do</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;"><br /></span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-35690295-7fff-d426-4a6d-ded8dbc3d789"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">JioHotstar’s user interface, designed primarily for standard phone displays, encountered challenges in adapting hero image aspect ratios, menus, and show screens to the diverse screen sizes and resolutions of other form factors. This often led to image cropping, letterboxing, low resolution, and unutilized space, particularly in landscape mode. To help fully leverage the capabilities of tablets and foldables and deliver an optimized user experience across these device types, JioHotstar focused on refining the UI to ensure optimal layout flexibility, image rendering, and navigation across a wider range of devices.</span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;"><br /></span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-45c30fe9-7fff-e408-7197-4293cfed2e1a"><span face=""Google Sans", sans-serif" style="font-size: 18pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">What they did</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span><span face=""Google Sans", sans-serif" style="color: #3ddc84; font-size: 18pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For a better viewing experience on large screens, JioHotstar took the initiative to enhance its app by incorporating </span><a href="https://developer.android.com/develop/ui/compose/layouts/adaptive/use-window-size-classes" style="font-family: inherit; text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">WindowSizeClass</span></a><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and creating optimized layouts for compact, medium and extended widths. This allowed the app to adapt its user interface to various screen dimensions and aspect ratios, ensuring a consistent and visually appealing UI across different devices.</span></p></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span id="docs-internal-guid-5f6d2eb9-7fff-fa4c-4f36-255526a935a8"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">JioHotstar followed this pattern using Material 3 Adaptive library to know how much space the app has available. First invoking the</span></span></span><span><span face=""Google Sans", sans-serif" style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span></span></span><span id="docs-internal-guid-13cbb1fc-7fff-3ea0-4aff-5af0ca3ce1f4"><a href="https://developer.android.com/reference/kotlin/androidx/compose/material3/adaptive/package-summary#currentWindowAdaptiveInfo(kotlin.Boolean)" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">currentWindowAdaptiveInfo()</span></span></a></span><span id="docs-internal-guid-30bd9ab3-7fff-9940-b3a9-52599c6ffeed"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;"> </span>function</span></span></span><span style="font-family: inherit;">, </span><span style="font-family: inherit;"><span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">then using new layouts accordingly for the three window size classes:</span></span></span></span></p><span style="font-family: inherit;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;"><br /></span></span></span></p><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: blue;">val</span> sizeClass = currentWindowAdaptiveInfo().windowSizeClass
<span style="color: blue;">if</span>(sizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_EXPANDED_LOWER_BOUND)) {
showExpandedLayout()
} <span style="color: blue;">else</span> <span style="color: blue;">if</span>(sizeClass.isHeightAtLeastBreakpoint(WIDTH_DP_MEDIUM_LOWER_BOUND)) {
showMediumLayout()
} <span style="color: blue;">else</span> {
showCompactLayout()
}<br /></pre><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The breakpoints are in order, from the biggest to the smallest, as internally the API checks for with a greater or equal then, so any width that is at least greater or equal then </span><span style="background-color: transparent; color: #188038; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">EXPANDED</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> will always be greater than </span><span style="background-color: transparent; color: #188038; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">MEDIUM</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span id="docs-internal-guid-08ca4571-7fff-bc2a-dd7f-20660ca00457"><span style="font-family: inherit;"><br /><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JioHotstar is able to provide the premium experience unique to foldable devices: </span><span id="docs-internal-guid-74bb3cf1-7fff-526d-abb0-dba9002e9e45"><a href="https://developer.android.com/develop/ui/compose/layouts/adaptive/foldables/make-your-app-fold-aware#tabletop_posture" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">Tabletop Mode</span></span></a></span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">.</span> This feature conveniently relocates the video player to the top half of the screen and the video controls to the bottom half when a foldable device is partially folded for a handsfree experience.</span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dxLEgYNx_Syfr2ap7c2-pIyOKpisds2iCZPuodCjfEY6qmmGvD68lfeiJ_Gh2w_tU2NU7pHtgAqfRDYTVEmiQ' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div></span></div><div style="text-align: left;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;"><br /></span></span></span></div><div><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">To accomplish this, also using the Material 3 Adaptive library, the same </span></span></span><span id="docs-internal-guid-0020e610-7fff-17c4-638e-421605d5fdc0"><a href="https://developer.android.com/reference/kotlin/androidx/compose/material3/adaptive/Posture#isTabletop()" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">currentWindowAdaptiveInfo()</span></span></a></span><span style="font-family: inherit;"><span style="font-family: inherit;"> </span>can</span><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;"> be used to query for the tabletop mode. Once the device is held in tabletop mode, a change of layout to match the top and bottom half of the posture can be done with a column to place the player in the top half and the controllers in the bottom half:</span></span></span></div><div><span style="white-space-collapse: preserve;"><br /></span><span style="font-family: inherit;"><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: blue;">val</span> isTabletTop = currentWindowAdaptiveInfo().windowPosture.isTabletop
<span style="color: blue;">if</span>(isTabletopMode) {
Column {
Player(Modifier.weight(1f))
Controls(Modifier.weight(1f))
}
} <span style="color: blue;">else</span> {
usualPlayerLayout()
}</pre><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-a8b0f8c2-7fff-2815-1358-989526214405"></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-707771a4-7fff-5162-acae-bb0647b3758b"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">JioHotstar is now meeting the </span><a href="https://developer.android.com/docs/quality-guidelines/large-screen-app-quality" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Large Screen app quality guidelines</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for Tier 1. The team leveraged </span><a href="https://developer.android.com/adaptive-apps" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">adaptive app</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> guidance, utilizing </span><a href="https://developer.android.com/design/ui/large-screens/samples" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">samples</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><a href="https://github.com/android/large-screen-codelabs" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">codelabs</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><a href="https://developer.android.com/guide/topics/large-screens/large-screen-cookbook" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">cookbooks</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and </span><a href="https://developer.android.com/guide/topics/large-screens" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">documentation</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to incorporate these recommendations.</span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;"><b id="docs-internal-guid-e7c70eec-7fff-5537-efd0-a05b1fe5dd99" style="font-weight: normal;"><br /></b></span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-9df7aa2e-7fff-3c4f-b174-d84418a709dc"></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-664aeea6-7fff-eed6-835d-a1f7ddcfe0a2"></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">To further improve the user experience, JioHotstar increased touch target sizes, to the recommended 48dp, on video discovery pages, ensuring accessibility across large screen devices. Their video details page is now adaptive, adjusting to screen sizes and orientations. They moved beyond simple image scaling, instead leveraging window size classes to detect window size and density in real time and load the most appropriate hero image for each form factor, helping to enhance visual fidelity. Navigation was also improved, with layouts adapting to suit different screen sizes.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Now users can view their favorite content from JioHotstar on large screens devices with an improved and highly optimized viewing experience.</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;"><span id="docs-internal-guid-87b0ce7b-7fff-992e-0fcd-2ac73366b01f"></span></span></span></p><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></p><blockquote><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Achieving Tier 1 large screen app status with Google is a milestone that reflects the strength of our shared vision. At JioHotstar, we have always believed that optimizing for large screen devices goes beyond adaptability, it’s about elevating the viewing experience for audiences who are rapidly embracing foldables, tablets, and connected TVs.</span></p><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-f2b4d23f-7fff-b4ba-6dca-f1972de0d851"></span></span></p><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Leveraging Google's Jetpack libraries and guides allowed us to combine our insights on content consumption with their expertise in platform innovation. This collaboration allowed both teams to push boundaries, address gaps, and co-create a seamless, immersive experience across every screen size.</span></p><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Together, we’re proud to bring this enhanced experience to millions of users and to set new benchmarks in how India and the world experience streaming.</span></p><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;"><span id="docs-internal-guid-46e5d24c-7fff-d718-dda6-249ac7912035"></span></p><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Sonu Sanjeev</span><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Senior Software Development Engineer</span></p></blockquote><p style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: left;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></p></span></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-5208831521336969602026-01-26T09:00:00.000-08:002026-01-26T09:00:00.111-08:00Trade-in mode on Android 16+ <name content="IMG" twitter:image=""><p><span style="font-family: inherit;"></span></p><h4 style="text-align: left; white-space-collapse: preserve;"><b style="font-size: x-large;"><i>Supporting Longevity through Faster Diagnostics</i></b></h4><p><span style="font-family: inherit;"><i>Posted by <span style="white-space-collapse: preserve;">Rachel S, Android Product Manager</span></i></span></p><p><span style="font-family: inherit;"><i></i></span></p><div class="separator" style="clear: both; text-align: center;"><span style="font-family: inherit;"><i><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6Aq4lb9qsSAAh7hBxqYjCIYImJREOYZUqPO7yYdvbr-81VWa3lPQdkT-ekLr3Xd-YBWbEShGKr0fuYMoW0skg_vtHrzQxYf42jUqkAgqwo-11igWWNa_gxW-Rpb1TJAGgeumE0LjzoJej8efMSW6Ce7mUmaA0x_n6RxG6-5SpYQYIofO7bRF31J2v4wI/s4209/Android_TradeIN_Mode_Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6Aq4lb9qsSAAh7hBxqYjCIYImJREOYZUqPO7yYdvbr-81VWa3lPQdkT-ekLr3Xd-YBWbEShGKr0fuYMoW0skg_vtHrzQxYf42jUqkAgqwo-11igWWNa_gxW-Rpb1TJAGgeumE0LjzoJej8efMSW6Ce7mUmaA0x_n6RxG6-5SpYQYIofO7bRF31J2v4wI/s16000/Android_TradeIN_Mode_Blog.png" /></a></i></span></div><span style="font-family: inherit;"><span style="font-family: inherit; white-space-collapse: preserve;"><p style="font-style: italic;"><i style="font-family: inherit;">Trade-in mode: faster assessment of a factory-reset phone or tablet, bypassing setup wizard, a new feature on Android 16 and above.</i></p><h3 style="text-align: left;"><span style="font-family: inherit; font-size: x-large;">Supporting device longevity</span></h3></span></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">Android is committed to making devices last longer. With device longevity comes device circularity: phones and tablets traded-in and resold. <span style="font-family: inherit;"><a href="https://www.gsma.com/solutions-and-impact/connectivity-for-good/external-affairs/climate-action/rethinking-mobile-phones/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">GSMA reported</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> that secondhand phones have around 80-90% lower carbon emissions than new phones. The secondhand device market has grown substantially both in volume and value, a trend projected to continue.</span></span></p><p><span id="docs-internal-guid-7ebb36e1-7fff-1fb1-9f1b-742bf18d2765"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-family: inherit;">Android 16 and above offers an easy way to access device information on any factory reset phone or tablet via the new </span><span style="color: #188038; font-family: Roboto Mono, monospace;"><span style="font-size: 10pt; white-space-collapse: preserve;">tradeinmode </span></span></span></span><span><span style="font-family: inherit;">parameter, accessed via adb commands. This means you can view quality indicators of a phone or tablet, skipping each setup wizard step. Simply connect a phone or tablet with adb, and use </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">tradeinmode</span><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="font-family: inherit;"><a href="https://androidsource.devsite.corp.google.com/docs/core/perf/trade-in-mode" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">commands</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span></span></span><span style="font-family: inherit;">to get information about the device.</span></p><p><span id="docs-internal-guid-aaa80139-7fff-cde7-5ee4-78a7e10ff168"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit; font-size: large;">Trade-in mode: What took minutes, now takes seconds </span></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Faster trade-in processing – </span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">By bypassing setup wizard, trade-in mode improves device trade ins. The mode enables immediate access to understand the ‘health’ of a device, helping everyone along the secondhand value chain check the quality of devices that are wiped. We’ve already seen significant increases in processing secondhand Android devices! </span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Secure evaluation </span><span style="font-weight: 700; white-space-collapse: preserve;">– </span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">To ensure the device information is only accessed in secure situations, the device must 1) be factory reset, 2) not have cellular service, 3) not have connectivity or a connected account, and 4) be running a non-debuggable build.</span></span></p><p><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">Get device health information with one command – </span></span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">You can view all the below device information with adb command from your workstation</span> </span></span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">adb shell tradeinmode getstatus</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">, skipping setup wizard: </span></span></p><p></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Device information </span></span></p></li><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Device IMEI(s) </span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Device serial number </span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Brand </span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Model </span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Manufacturer </span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Device model, e.g., Pixel 9</span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Device brand, e.g., Google</span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Device manufacturer, e.g., Google</span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Device name, e.g., tokay</span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">API level to ensure correct OS version, e.g., launch_level : 34</span></span></p></li></ul><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Battery heath </span></span></p></li><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Cycle count</span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Health</span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">State, e.g., unknown, good, overheat, dead, over_voltage, unspecified_failure, cold, fair, not_available, inconsistent</span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Battery manufacturing date </span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Date first used </span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Serial number (to help provide indication of genuine parts, if OEM supported)</span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Part status, e.g., replaced, original, unsupported</span></span></p></li></ul><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Storage </span></span></p></li><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Useful lifetime remaining </span></span></p></li><li aria-level="2" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Total capacity </span></span></p></li></ul><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Screen Part status, e.g., replaced, original, unsupported</span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Foldables (number of times devices has been folded and total fold lifespan) </span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Moisture intrusion </span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">UICCS information i.e., Indication if there is an e-SIM or removable SIM and the microchip ID for the SIM slot</span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Camera count and location, e.g., 3 cameras on front and 2 on back</span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">Lock detection for select device locks</span></span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">And the list keeps growing! Stay up to date </span><a href="https://androidsource.devsite.corp.google.com/docs/core/perf/trade-in-mode" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">here</span></a><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. </span></span></p></li></ul><div><span style="white-space-collapse: preserve;"><br /></span></div><div><span id="docs-internal-guid-97633792-7fff-687e-131b-86e29c702b30"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Run your own tests – </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Trade-in mode enables you to run your own diagnostic commands or applications by entering the evaluation flow using </span></span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">tradeinmode evaluate</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">. The device will automatically factory reset on reboot after evaluation mode to ensure nothing remains on the device. </span></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Ensure the device is running an approved build – </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Further, when connected to the internet, with a single command </span></span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">tradeinmode getstatus --challenge</span><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face=""Google Sans Text", sans-serif" style="background-color: white; color: #d01884; font-size: 10pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">CHALLENGE</span><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">you can test the device’s operating system (OS) authenticity, to be sure the device is running a trusted build. If the build passes the test, you can be sure the diagnostics results are coming from a trusted OS. </span></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">There’s more</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> – You can use commands to factory reset, power off, reboot, reboot directly into trade-in mode, check if trade-in mode is active, revert to the previous mode, and pause tests until system services are ready. </span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Want to try it? </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Learn more about the </span><a href="https://source.android.com/docs/core/perf/trade-in-mode" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">developer steps and commands</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. </span></span></p><div><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span></div><p></p></name>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-83969529779970389682026-01-21T09:00:00.000-08:002026-01-21T09:00:00.112-08:00Ready to review some changes but not others? Try using Play Console’s new Save for later feature<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg1EmDV3Y8uNfK-CXOMdkXyxrWV2Le1mOJm-dz8w0EwrHf18-dKg-jQ-egS82IuvMhTVETf22pgosyKDOw4g33rlvhYOSoyHSEEF4k4klhNzKkTOlo0ByXvuMyuVwI7sLpQezY4IzDaTN8lUeMD9V6NDHA3axVQ8X0CxB7bOrugKEaYrpJ0YbBUWoWDbs/s4209/260120_Header.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg1EmDV3Y8uNfK-CXOMdkXyxrWV2Le1mOJm-dz8w0EwrHf18-dKg-jQ-egS82IuvMhTVETf22pgosyKDOw4g33rlvhYOSoyHSEEF4k4klhNzKkTOlo0ByXvuMyuVwI7sLpQezY4IzDaTN8lUeMD9V6NDHA3axVQ8X0CxB7bOrugKEaYrpJ0YbBUWoWDbs/s4209/260120_Header.png" style="display: none;" />
<span id="docs-internal-guid-d8610420-7fff-dab5-6b1b-0271a5af5774"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><i><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Posted by Georgia Doyle, Senior UX Writer and Content Designer, </span></i><i><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">and</span></i><i><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> Kanu Tibrewal, </span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Software Engineer</span></i></p></span><span><div><span face=""Google Sans Text", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg1EmDV3Y8uNfK-CXOMdkXyxrWV2Le1mOJm-dz8w0EwrHf18-dKg-jQ-egS82IuvMhTVETf22pgosyKDOw4g33rlvhYOSoyHSEEF4k4klhNzKkTOlo0ByXvuMyuVwI7sLpQezY4IzDaTN8lUeMD9V6NDHA3axVQ8X0CxB7bOrugKEaYrpJ0YbBUWoWDbs/s4209/260120_Header.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg1EmDV3Y8uNfK-CXOMdkXyxrWV2Le1mOJm-dz8w0EwrHf18-dKg-jQ-egS82IuvMhTVETf22pgosyKDOw4g33rlvhYOSoyHSEEF4k4klhNzKkTOlo0ByXvuMyuVwI7sLpQezY4IzDaTN8lUeMD9V6NDHA3axVQ8X0CxB7bOrugKEaYrpJ0YbBUWoWDbs/s16000/260120_Header.png" /></a></div><span face=""Google Sans Text", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span><div><span><span style="font-family: inherit;"><p dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">We’ve launched a new Save for later feature on Google Play Console’s </span><a href="https://play.google.com/console/about/publishingoverview/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Publishing overview</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> to give you more control over when you send changes for review. </span></p></span></span><span style="font-family: inherit;"><br />In the past, changes to your app were bundled together before being sent for review. This presented challenges if you needed to reprioritize changes, or if the changes were no longer relevant. For example, updates to your test tracks grouped with marketing changes that need to be rescheduled. This lack of flexibility meant that if some changes were ready for review but not others, you could end up delaying urgent fixes, or publishing changes that you weren’t quite ready to make.<br /><br />Now, you have the ability to hold back the changes you’re not ready to have reviewed.</span></div><p style="text-align: left;"><span style="font-size: large; font-weight: 700; white-space-collapse: preserve;">How it works</span></p><span style="font-family: inherit;">In the 'Changes not yet sent for review' section of the Publishing overview page, select ‘Save for later’ on the groups of changes that you don’t want to include in your next review. You can view and edit the list of saved changes, and return them to the Publishing overview if you change your mind. Once the review has started, your saved changes will be added back to ‘Changes not yet sent for review’. </span><div><span style="font-family: inherit;"></span><span><span face=""Google Sans Text", sans-serif"><br /><p dir="ltr" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; vertical-align: baseline; white-space-collapse: preserve;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT42ooaXQWCbZ8YOQuf1CJlIVGCViuEfaxEqzEpue3HhC_oz-ywLsnYD_H5ozkHzNf4IHUuzaqZWYyAmjOtXU9GeK5VcZhv6Ux3TroijzXYWE08zwvwcm28SKNrOBeF5blLls7WxJ4cHZSsUUUYV9kVWdClRQZrbJRc-O_9q1n7pLCy1JQaQvDa25YYWc/s6888/Blog%20post%20image.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="3796" data-original-width="6888" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT42ooaXQWCbZ8YOQuf1CJlIVGCViuEfaxEqzEpue3HhC_oz-ywLsnYD_H5ozkHzNf4IHUuzaqZWYyAmjOtXU9GeK5VcZhv6Ux3TroijzXYWE08zwvwcm28SKNrOBeF5blLls7WxJ4cHZSsUUUYV9kVWdClRQZrbJRc-O_9q1n7pLCy1JQaQvDa25YYWc/s16000/Blog%20post%20image.jpg" /></a></div><p></p><p dir="ltr" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; vertical-align: baseline; white-space-collapse: preserve;"></p><div class="separator" style="clear: both; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: center; vertical-align: baseline; white-space-collapse: preserve;"><br /></div><span id="docs-internal-guid-7ba0bbd1-7fff-5481-d988-0913ad2d2b38" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: large;"><b>Integration with our pre-review checks</b></span></p></span></span></span></span></div><div><span style="font-family: inherit;"><br /></span></div><div><span style="font-family: inherit;">Save for later also works with our <a href="https://support.google.com/googleplay/android-developer/answer/14807773">pre-review checks</a>. Pre-review checks look for issues in your changes that may prevent your app from being published, so that you can fix them before you send changes for review. If checks find issues with your app, there are two ways you can proceed:</span></div><div><span style="font-family: inherit;"><br /></span></div><span style="font-family: inherit;"><ul style="text-align: left;"><li><span style="font-family: inherit;">If issues are isolated to an individual track, we’ll show you an error beside that change, so you know what to save for later in order to proceed to review with your other changes.</span></li><li><span style="font-family: inherit;">If you have issues that affect your whole app, for example, App content issues, Save for later will be unavailable and you will need to fix them before you can send any changes for review.</span></li></ul></span><p style="text-align: left;"><span style="white-space-collapse: preserve;"><b><span style="font-size: large;">Greater flexibility in your workflows</span></b></span></p><span style="font-family: inherit;">Our goal for Save for later is to give you greater flexibility over your release schedule. With this feature you can manage what changes you send for review, and address issues affecting individual tracks without holding up ready-to-release changes, so you can iterate faster and minimize the impact of rejections on your release timeline.</span><div><div><p style="text-align: left;"><span style="font-family: inherit;"><span style="font-size: large; white-space-collapse: preserve;"><b>So, what's next?</b></span></span></p></div><div><span style="font-family: inherit;">We're committed to continuously improving your publishing experience. Save for later is a significant step towards providing you with more granular control over this all-important stage in the journey to publishing your app. We'll continue to gather your feedback and look at ways we can provide greater flexibility to the review and publishing process.</span></div><div><span style="font-family: inherit;"><br />We're excited to see how Save for later helps you to streamline your release process and bring your app innovations to users even faster.</span></div><name content="IMG" twitter:image=""><p></p></name></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-54232956234140661612026-01-15T09:18:00.000-08:002026-01-15T09:19:39.721-08:00LLM flexibility, Agent Mode improvements, and new agentic experiences in Android Studio Otter 3 Feature Drop<p><span id="docs-internal-guid-18ab9e17-7fff-a297-f90b-a9da132401eb" style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Posted by Sandhya Mohan</span><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: none; vertical-align: baseline; white-space-collapse: preserve;">, Senior Product Manager and Trevor Johns</span><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: none; vertical-align: baseline; white-space-collapse: preserve;">, Developer Relations Engineer</span></span></p><div style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: center; vertical-align: baseline;"><div style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;"><span><span><span><span><span><span><span><span id="docs-internal-guid-9fe3e435-7fff-c053-aeb0-d903869df6a0"><span id="docs-internal-guid-2efdb18d-7fff-3bf9-ae2a-c511897ba914"><span><div style="background-color: transparent; text-align: left; white-space-collapse: preserve;"><span face="Google Sans, sans-serif"><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><div class="separator" style="clear: both; font-size: 14.6667px; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyi8f9NPn46NIHLa275zb2Tj-geOZKmWoMTsqXRgSoQAY6uWgN6emY5xYUSBHaSHqJo6YnbatGysKSc5x3mTnpQNMmVuUldGDUvGnuRgudpEXOrsi0Ac88B3seFegA4Rnexp_VbuTjkcT9FOcJvjf5nRg1zZU4c5SuzRStNzM3O4SKqM_yDs1dSuShb_U/s1481/Rev_date-Otter_3-Anim.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="963" data-original-width="1481" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyi8f9NPn46NIHLa275zb2Tj-geOZKmWoMTsqXRgSoQAY6uWgN6emY5xYUSBHaSHqJo6YnbatGysKSc5x3mTnpQNMmVuUldGDUvGnuRgudpEXOrsi0Ac88B3seFegA4Rnexp_VbuTjkcT9FOcJvjf5nRg1zZU4c5SuzRStNzM3O4SKqM_yDs1dSuShb_U/s16000/Rev_date-Otter_3-Anim.gif" /></a></div><span face=""Google Sans", sans-serif"><p dir="ltr" style="font-size: 11pt; line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt;"><br /></span></p><span style="font-family: inherit;">We are excited to announce that Android Studio Otter 3 Feature Drop is now stable! This feature-packed release brings a huge update to your agentic workflows in Android Studio, and offers you more flexibility and control for how you use AI to help you build Android apps. </span></span><p></p><ul style="text-align: left;"><li><span face="Google Sans, sans-serif"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Bring Your Own Model: </span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">You can now use any LLM to power the AI functionality in Android Studio.</span></span></span></li><li><span face="Google Sans, sans-serif"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Agent Mode Enhancements:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> You can now more easily have Agent Mode interact with your app on devices, review and accept suggested changes, and have multiple conversations threads.</span></span></span></li><li><span face="Google Sans, sans-serif"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Run user journey tests using natural language:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> with Journeys in Android Studio.</span></span></span></li><li><span face="Google Sans, sans-serif"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Enable Agent Mode to connect to more tools: </span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">including the ability to connect to remote servers via MCP.</span></span></span></li><li><span face="Google Sans, sans-serif"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Build, iterate and test your UI: </span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">with UI agentic experiences in Android Studio. </span></span></span></li><li><span face="Google Sans, sans-serif"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Build deep links using natural language:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> with the new app links assistant. </span></span></span></li><li><span face="Google Sans, sans-serif"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Debug R8 optimized code:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> with Automatic Logcat retracing.</span></span></span></li><li><span face="Google Sans, sans-serif"><span><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><b>Simplify Android library modules: </b>with the Fused library plugin.</span></span></span></li></ul><p dir="ltr" style="font-size: 14.6667px; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Here’s a deep dive into what’s new:</span></p><h3 dir="ltr" style="font-size: 14.6667px; line-height: 1.2; margin-bottom: 4pt; margin-top: 16pt;"><span style="background-color: transparent; font-family: inherit; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Bring Your Own Model (BYOM)</span></h3><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; font-family: inherit; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Every developer has a unique workflow when using AI, and different companies have different policies on AI model usage. With this release, Android Studio now brings you more flexibility by allowing you to choose the LLM that powers the AI functionality in Android Studio, giving you more control over performance, privacy, and cost.</span></p><h4 dir="ltr" style="line-height: 1.2; margin-bottom: 4pt; margin-top: 14pt;"><span style="background-color: transparent; font-family: inherit; font-size: medium; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Use a remote model</span></h4><p dir="ltr" style="font-size: 14.6667px; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span id="docs-internal-guid-2e472d39-7fff-be1f-16dc-8e060b9d09ba" style="font-family: inherit;"></span></span></p><p dir="ltr" style="background-color: white; line-height: 1.2; margin-bottom: 12pt; margin-top: 0pt; padding: 8pt 0pt 0pt;"><span style="background-color: transparent; font-family: inherit; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">You can now integrate remote models—such as OpenAI’s GPT, Anthropic’s Claude, or a similar model—directly into Android Studio. This allows you to leverage your preferred model provider without changing your IDE. To get started, configure a remote model provider in Settings by adding your API endpoint and key. Once configured, you can select your custom model directly from the picker in the AI chat window.</span></p><div class="separator" style="clear: both; font-size: 14.6667px; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyDWL_0kjXE07Cx9Psoa1LJiv3N7YzyWfRiOzJP4YBfr6A_lUlJ5W_y2DgESniQencUD6xZPUYb1KP7eJmr5bs3SHwKVNtxHcsa9BkGrB3iFNAdZ2HXwcrJ0p3A5Nl9tmy-4jRqTkhWSakWwginj3Kxb0GCNFXHexbEts0Ib3oiQCvFE9C_zpO9wjRmDI/s1999/img1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1240" data-original-width="1999" height="396" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyDWL_0kjXE07Cx9Psoa1LJiv3N7YzyWfRiOzJP4YBfr6A_lUlJ5W_y2DgESniQencUD6xZPUYb1KP7eJmr5bs3SHwKVNtxHcsa9BkGrB3iFNAdZ2HXwcrJ0p3A5Nl9tmy-4jRqTkhWSakWwginj3Kxb0GCNFXHexbEts0Ib3oiQCvFE9C_zpO9wjRmDI/w640-h396/img1.png" width="640" /></a></div><span id="docs-internal-guid-4138d3c3-7fff-b812-61e8-ef82e0a3b02c"><div style="text-align: center;"><span style="background-color: white; font-family: times; font-style: italic;">Enter the remote model provider information.</span></div></span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span><p style="font-size: 14.6667px;"></p></span></span></div></span></span></span></span></span></span></span></span></span></span><div><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span id="docs-internal-guid-14e52c89-7fff-3b45-ed20-c0de56289e52"><h4 dir="ltr" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; line-height: 1.2; margin-bottom: 4pt; margin-top: 14pt; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-b0bffee1-7fff-13c3-ea4e-bda508db0fb1"><span style="font-family: inherit; font-size: medium; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Use a local model</span></span></h4></span><span><div style="background-color: white; font-style: normal; font-variant: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 0pt; padding: 8pt 0pt 0pt; text-align: left; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;"><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">If you have limited internet connectivity, strict data privacy requirements, or a desire to experiment with open-source research, Android Studio now supports local models via providers like </span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">LM Studio</span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> or </span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Ollama</span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. While Gemini in Android Studio remains the default recommendation—tuned specifically for Android development with full context awareness—if you have a specific model preference, Android Studio supports it.</span></span></div><div style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><div class="separator" style="clear: both; font-family: "Google Sans", sans-serif; font-size: 11pt; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq2feqKPj2kdA0D55Q6kk6RrHVg-5xYuPkeukdWN1s-21tuc1swBzuP-FTjEPzq9-aoF3n8mHZIZtRcY13-W-TSbqgVwyL6QEAvOSgrjjrACDJroKtHGZKasBGWflU0rBww9CtRrEsaSoXDC8xMH39aJ_7aqdFXcXmqj5DqruNqLnYNOBMtmvhYC7jbJo/s1018/Img2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="944" data-original-width="1018" height="371" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq2feqKPj2kdA0D55Q6kk6RrHVg-5xYuPkeukdWN1s-21tuc1swBzuP-FTjEPzq9-aoF3n8mHZIZtRcY13-W-TSbqgVwyL6QEAvOSgrjjrACDJroKtHGZKasBGWflU0rBww9CtRrEsaSoXDC8xMH39aJ_7aqdFXcXmqj5DqruNqLnYNOBMtmvhYC7jbJo/w400-h371/Img2.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><span style="background-color: white; font-family: times; font-style: italic; text-align: left;">Model picker in Android Studio.</span></div></div><div class="separator" style="background-color: transparent; clear: both; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-align: center; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><span style="background-color: white; font-size: 10.5pt; font-style: italic; text-align: left;"><br /></span></div></span></span></span></span></span></span></span></span></span></span></span></span></span></span><div class="separator" style="clear: both; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: center; vertical-align: baseline;"><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span id="docs-internal-guid-d2f52c1c-7fff-d63d-6506-1bdcd5d17433"><div style="background-color: white; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">A local model offers an alternative to the LLM support built into Android Studio, and typically requires significant local system RAM and hard drive space to run well. However, Gemini in Android Studio provides the best Android development experience because Gemini is tuned for Android and supports all features of Android Studio. With Gemini, you can choose from a variety of models for your Android development tasks, including the no-cost default model or models accessed with a paid Gemini API key.</span></div></span><span><h4 dir="ltr" style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 4pt; margin-top: 14pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-family: inherit; font-size: medium; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Use your Gemini API key</span></h4><div style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span></div><p dir="ltr" style="background-color: transparent; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="background-color: transparent; font-family: inherit; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">While Android Studio includes access to a default Gemini model with generous quotas at no cost, some developers need more. By adding your Gemini API key, Android Studio can directly access all the latest Gemini models available from Google.</span></p><p dir="ltr" style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><b id="docs-internal-guid-4e5e3e9f-7fff-502c-8c0b-0a0cc0fead1f" style="font-weight: normal;"><span style="font-family: inherit;"><br /></span></b></p><p dir="ltr" style="background-color: transparent; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">For example, this allows you to use the most recent </span><a href="https://android-developers.googleblog.com/2025/11/gemini-3-is-now-available-for-ai.html" style="text-decoration: none;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Gemini 3 Pro</span></a><span face=""Google Sans Text", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> and </span><a href="https://android-developers.googleblog.com/2025/12/build-smarter-apps-with-gemini-3-flash.html" style="text-decoration: none;"><span face=""Google Sans Text", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Gemini 3 Flash</span></a><span face=""Google Sans Text", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> models (among others) with expanded context windows and quota. This is especially useful for developers who are using Agent Mode for extended coding sessions, where this additional processing power can provide higher fidelity responses.</span></span></p><p dir="ltr" style="background-color: transparent; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"></p><div style="background-color: transparent; text-align: left;"><span style="font-family: inherit; white-space-collapse: preserve;"><br /></span></div><span style="background-color: transparent; font-family: inherit; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><div style="text-align: left;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">You can also</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> </span><a href="https://android-developers.googleblog.com/2025/11/gemini-3-is-now-available-for-ai.html" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">read more about how we're rolling out Gemini 3 to all Android Studio users</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, including Gemini Code Assist subscribers and developers accessing the default Gemini in Android Studio model at no-cost.</span></div></span><p style="background-color: transparent;"></p><p dir="ltr" style="background-color: white; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"></span></p><h3 dir="ltr" style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 4pt; margin-top: 16pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-family: inherit; font-size: medium; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Agent Mode enhancements</span></h3><div style="background-color: transparent; text-align: left;"><span style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-66190eab-7fff-0f44-23fa-5eb3987caeae" style="font-family: inherit; font-weight: normal;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Agent Mode is the semi-autonomous AI assistant in Android Studio that aids in your software development, used by many developers, including </span><a href="https://android-developers.googleblog.com/2026/01/ultrahuman-launches-features-15-faster.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">the Ultrahuman team</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. Get more out of Agent Mode with these new updates.</span></span></span></div></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><div><h4 style="text-align: left;"><span style="font-family: inherit;">Run your app and interact with it on devices</span></h4><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span><span face=""Google Sans", sans-serif"><span><p dir="ltr" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: normal; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Agent Mode can now deploy an application to the connected device, inspect what is currently shown on the screen, take screenshots, check Logcat for errors, and interact with the running application. This lets the agent help you with changes or fixes that involve re-running the application, checking for errors, and verifying that a particular update was made successfully (for example, by taking and reviewing screenshots).</span></p><p dir="ltr" style="background-color: transparent; color: black; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: normal; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></p><p dir="ltr" style="background-color: transparent; color: black; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: normal; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></p><div class="separator" style="background-color: transparent; clear: both; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-align: center; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSAdDmTLT7SRyX9NwWyZ2CxoUSqq8J1492x1quQaxYOZs0vHoLsVClK6Mda8VM4CXZcsD9Od7es1VrARVXijBeYmVMQjZfqHXFMW7He58iFpErUGsKX8jI89v1nXL3bBNvp5lR6FIxvp9yp17b62-1-Lp0hMgcxJK7nQ5xWQIDSFGZNfqInwcjQSc0MHg/s1734/img3.png" style="font-size: 14pt; margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1175" data-original-width="1734" height="434" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSAdDmTLT7SRyX9NwWyZ2CxoUSqq8J1492x1quQaxYOZs0vHoLsVClK6Mda8VM4CXZcsD9Od7es1VrARVXijBeYmVMQjZfqHXFMW7He58iFpErUGsKX8jI89v1nXL3bBNvp5lR6FIxvp9yp17b62-1-Lp0hMgcxJK7nQ5xWQIDSFGZNfqInwcjQSc0MHg/w640-h434/img3.png" width="640" /></a></div><div class="separator" style="background-color: transparent; clear: both; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-align: center; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-style: italic;"><span style="font-family: times;">Agent mode uses device actions to deploy and verify changes.</span></span></div><p style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></p><h4 dir="ltr" style="background-color: white; font-style: normal; font-variant: normal; font-weight: normal; line-height: 1.68; margin-bottom: 0pt; margin-top: 24pt; padding: 0pt 0pt 12pt; text-align: left; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="background-color: transparent; font-family: inherit; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Find and review changes using the changes drawer</span></h4><div style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: normal; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span id="docs-internal-guid-05b24e69-7fff-1bac-04d1-f124c6a65cbb" style="font-family: inherit;"><span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">You can now see and manage all changes made by the AI agent using the changes drawer. When the agent makes changes to your codebase, you can see the files that were edited in </span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Files to review</span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. From there, you can keep or revert the changes individually or all together. Click an individual file in the drawer to see the code diff in the editor and make refinements if needed. With the changes drawer, you can keep track of edits made by the agent during your chat and revisit specific changes without scrolling back through your conversation history.</span></span></span></span></div><p dir="ltr" style="background-color: transparent; color: black; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: normal; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span><span face=""Google Sans Text", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></span></span></p><p dir="ltr" style="background-color: transparent; color: black; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: normal; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span></span></span></p><div class="separator" style="background-color: transparent; clear: both; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-align: center; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkdfdxUNGiImREkFkobr2Wh_l0F4uXW4O05K8-sCk4mJSIPjW3DIOAo7hOJkMk-XEoOU8E85SQSMUZczu2a-qi9T5K6x5Byea37LjEVTsbkP1PQbhgV6QNEqDb4hfK99vz9dlMh73Su1idhoGadfEwocDgsIQANUJt00fRKcmKhkW_RPZLIUMfX8Wnels/s1999/img4.png" style="font-size: 14pt; margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1056" data-original-width="1999" height="338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkdfdxUNGiImREkFkobr2Wh_l0F4uXW4O05K8-sCk4mJSIPjW3DIOAo7hOJkMk-XEoOU8E85SQSMUZczu2a-qi9T5K6x5Byea37LjEVTsbkP1PQbhgV6QNEqDb4hfK99vz9dlMh73Su1idhoGadfEwocDgsIQANUJt00fRKcmKhkW_RPZLIUMfX8Wnels/w640-h338/img4.png" width="640" /></a></div></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: times;"><i><span style="text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial;">See all the files that the agent has proposed edits to in the changes drawer.</span></i></span><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span><p style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"></p><div style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span id="docs-internal-guid-70267263-7fff-27c0-3419-2c9757d3f2d6" style="font-family: inherit;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Note: If the </span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Don't ask to edit files</span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> setting is disabled in </span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Agent Options </span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 23px; overflow: hidden; width: 24px;"><img height="23" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA2CAYAAACSjFpuAAAGa0lEQVR4AexYe1BUVRj/scICJobaDAoEsjqlJv5jM1mNTZozRpCgZbEgD2WVHDVI1EZxRUO0UlN8lAbKW6xBoZLMGSdTp7I/CpAQx9EFR54zEuMD4Y+AzvfhvUKwLN67O6CzO/ud893veX73u+eec67Gx1fX+SSTBk/4zw7wcS+wvYL2Cg7xO2B/RId4gSwOz15Bi7doiBvYKzjEC2RxeDavoEajweIlMcjMykXRdyeZiF8SYwDpLI5QpYHNAc6dG4Dg4Plwd3eXh0r8vHkheDMgSJbZirEpwBEjRiB8UQSPPSEhHiHBQUzEkzAsLAxkQ7ytyKYA9QIcAfjj4kVcv3ZNxkA8yUgXHr5IltuCsQpAJycnTH3BH/5TH5D/NERFRSMwIBAdHR3Izs7sNXaSdXZ2IuCtILb1Fz6SP8WimL2cFAgeDWAfCTzGjsWRjExs3bYdySkPaOs2zF/wLlvn5majtraG+e4NyQgkycg2WfhI/hSLYnp5epFaFakCSG/BhNUJcHN7GrU1NSivKJeprKwEm5OMOHG8wOwAC08cx5bNSbhUVib7UYyamlqOGRcfDwcHB7P+A1GoAjhz5mt47vnJaG5uAr04jBvWQ6KkTUaUlpZYHENJyZ/YtClR9iP/tWvi0NTUxLEph8Ug/RioAhgcsoBDp6eloa2tjXlzjZubmzxHR44cac6M5a2tbThyOI35kJB3uFfaKAZIb0CdTsd5Kysrue+r0WqdodeHIy09Q56j6YePIDQ0DP29SCouV3A43QSdeFzdmFfSKAZ47949VIg5R0kjIqKp60Xuo0Zh3/4v8X6oHs7OzqivrwfNL63WBaH6MKTuPQBz1VwUGcXxKgXQu3fvMq+kUQyQkn196CAvA7Nmz4JUTZJLtNSwDB4eHqirq0N83Eos/2ApVq6IRdyHK9BQ3wBPT09ERERK5nJPsebMnsOxD4kcskIBowrgjRs3cPLk95w2VN9zwaY59/Irr6K9vR1bkzeDbNlQNMSnpGwRug68PusNOGm1QvrwL8Wi2NXVVQ8VCjhVACnfsfx8vtPTp78IR0dHEjHpdBN4M20ymbiCLOzW3Lx5E9VVVTwP/fx0ssZJqwXFog3CN8fyZblSRjXATrEbEX8BxgHESwNp/7edWY2D+RSd6GQbraMT99QM02gwbJhGxAITydSQ+ewDjKoXG2YaUGnpX+KR6wJFrlXVJq7seD8/eHl5k6gH+fj4wE9Urr29AybTw30qLTe0SaCYFLuHk4ILVQB9fX0RFDSP0+bkZHMvNS0tLfj9t1+5GhuNSfAdP15S8QspMTGJdefPncP91lZZR0xWZgZ1CAx8u4cfCx+xUQUwZlksNOKR+uXsWZiuX++VOj09jXck48aNQ2rqfuw/cAhfHUzDF7v3wmOsBxobGpGR0bWgd3emeXvm5zMc2yBydNc9Kq8Y4PDhT2Ha1GmcLyen92mBFM3N/2DD+o9x9eoVuoS3txcILF2UXyrDunWrcefOHbrsRfm5OSzzF6eU4a6uzCtpFAO8f79FVM3EOSdNmsx9X01jYwPWrV2DVSuXw5go9qqCYmMNMBoTcfv27b5cWCbFpGr+/xFmgwE2igFS/KKi49RhScxSuLq6MG+uoWWh/O9yEDU2NJgzY7mLiwtiDAbmiwq7cvCFgkYVwAsXzuPKlcsYM2YMduxMRTKdCQV9krJNgDZAqkJ/45o8ZQrbko/kv3NXKkaPfgaVlRWgHP35W9KpAkjr3r7UVD5J0Pyi+UJEc5M+Kn362Q6EzO86cfQ1kIUL38P27Z+DbMmHfIkoFi0Xe/bsFmth11rZl/9AZKoAUoLaulp8FL9Knl88zzZuQOGJAlKLzxGL4en9LPPdG1ob9WFd27uCgm9hFD7sK+Yo9RTT0qPcPZ45XjVACkynBJpbMpVfQlZWJn4s/oFP5FERXScDspUoMjKal4HiU8XIFWtoufCR/cVcpZiSrZreKgDNDeDo0TzQseqlGTMwYeJE2Yx4kpFOWg5kpZUZmwIkAHl5eTzkXbv2QPqyTTwJ88RaRzbE24psCpAGffqnYhSKVz19TKJvN7du3QLx9Po/ffoUmdiUbA6Qjj20t6SPSYujo2CIiQbxmWK/STqbohPBbQ5Q5BjUvx3goN5+KyS3V9AKN3FQQ9grOKi33wrJ7RW0wk0c1BD2Cg7q7bdC8ie+gv8BAAD//+14uroAAAAGSURBVAMA2Q2kG6Xovi8AAAAASUVORK5CYII=" style="margin-left: 0px; margin-top: 0px;" width="24" /></span></span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, Agent Mode will request permission for every individual change. Each change must be accepted before it appears in the changes drawer. To allow multiple file edits to appear in the drawer simultaneously, enable the </span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Don't ask to edit files</span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> option.</span></span></span></div><p dir="ltr" style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span><span face=""Google Sans Text", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></span></span></p><p dir="ltr" style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span></span></span></p><div class="separator" style="background-color: transparent; clear: both; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDs6HIS2cHwpe4Gkin9PDUAVqVTOur9ZgNCqJt8U01OrTPRqFaR3BvbmiUI21g0CxyISNlpu52j36ydNn-D5Po9nykHA5nM24beGeMN7zhXR8bcAkSQ-pQ93rRcc4TIjaryAQHWkZAVplVovDZPSNwv1repT-9F9VXEmKPUD7tcfFQFjqmJwQ7VvRzQMk/s713/img6.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="215" data-original-width="713" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDs6HIS2cHwpe4Gkin9PDUAVqVTOur9ZgNCqJt8U01OrTPRqFaR3BvbmiUI21g0CxyISNlpu52j36ydNn-D5Po9nykHA5nM24beGeMN7zhXR8bcAkSQ-pQ93rRcc4TIjaryAQHWkZAVplVovDZPSNwv1repT-9F9VXEmKPUD7tcfFQFjqmJwQ7VvRzQMk/w400-h120/img6.png" width="400" /></a></div><span face=""Google Sans", sans-serif" id="docs-internal-guid-36108e56-7fff-f537-96b9-517804705a61" style="background-color: transparent; color: black; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; text-decoration-line: none; white-space: pre-wrap;"><div style="text-align: center;"><span style="font-family: times;"><span face=""Google Sans Text", sans-serif" style="background-color: white; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Accept</span><span face=""Google Sans Text", sans-serif" style="background-color: white; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline;"> a change to add it to the changes drawer.</span></span></div><div style="font-size: 11pt; font-weight: 400; text-align: center;"><br /></div></span><p style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"></p><h4 dir="ltr" style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 4pt; margin-top: 14pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-family: inherit; font-size: medium; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Manage multiple conversation threads</span></h4><div style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span id="docs-internal-guid-09609aec-7fff-4b80-0f2e-c97e08fa7f88"><span face="Google Sans, sans-serif" style="font-size: 11pt;"><br /></span><div style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">You can now organize your conversations with Gemini in Android Studio into multiple threads. This lets you create a new chat or agent thread when you need to start with a clean slate, and you can go back to older conversations in the history tab. Using separate threads for each distinct task can improve response quality by limiting the scope of the AI's context to only the topic at hand.</span></div><p dir="ltr" style="font-family: "Google Sans", sans-serif; font-size: 11pt; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></p><div style="font-family: "Google Sans", sans-serif; font-size: 11pt;"><span face=""Google Sans Text", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div></span></div><p dir="ltr" style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"></p><div style="text-align: left;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span id="docs-internal-guid-429e8298-7fff-a149-083a-3b6c8b629b9f" style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">To start a new thread, click New Conversation </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 39px; overflow: hidden; width: 34px;"><img alt="The New Chat plus sign." height="39" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAA0CAYAAAD19ArKAAAA+UlEQVR4AezWUQrCMAwG4LDDDEEEzyPsKPPBHWXgmWSXUfJQKHlJHH8DLb8QZtc0Cd/2sOl6u397jEk6/XHw7AdHcYoHBfiqBKFgaRSHUQYLUTwIBUujuKVc16do2PuodTPxeb6IBmpQW6fZ4LYRes3B0aJePYp7Quj9AcXRROB6FAeDuuXGF9fvjn1/SzQKWTRf87RHOeddxxfftpcsyyMcReyfM9qjnPOu44t7Atn7FKd4UICvShAKlkZxGGWwEMUt1HF8RMPeR62biet3hwZqUFun2eC2EXrNwdGiXr0z4l7NlH0OnsJcNaF4hZHyl+IpzFWTbsV/AAAA//82DU77AAAABklEQVQDAKKYmqtoqktYAAAAAElFTkSuQmCC" style="margin-left: 0px; margin-top: 0px;" width="34" /></span></span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. To see your conversation history, click Recent Chats. </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 35px; overflow: hidden; width: 38px;"><img alt="The Recent Chats word
bubble." height="35" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA0CAYAAADfRPtlAAACSElEQVR4AexYPUvDUBQ9FMSlStr+AZ3EL+pa6y7+A1E7CA4arauCHwglIrhIK520DqL4J7RuhW7tIlL/QmOGjgXtjQQkWJP2JulLeaU3yXvJO/ece3pLksjs/MLXMEcEQ/6RAsNusHRQOih4BeRPVHCDHOlJBx1LJPgF0kHBDXKkJx10LFHngng8DlXNolAo4v7+kRWEQViE2YFmf9kOEhFNu0AqlYKiKGxChEFYhEnYXEC2wNXVdUSjUdRqNezv7yGTWWMFYRAWYRL2wAVOT0+ZHO7ubvD5qZvHnA1hEBZhWNh03G/05uAfWRQlbs42m01z78XGwrKwOZhsgZzkQayVAoOosp85pIN+VjcIbOlgEFX2M4d00M/qBoHNdtAwfm7PEolEEHx7zsEW+Pb2bibd3NxCLPZz22ZOCLJhC3x6ekCr1UIymUQ+f+36WTCfL2Axlfa9DGyBuq7j6OgQlUoFhmG4JhyLJbCj7mJjI4NIhE2ja15PkElksVhANqu6fhYs3d6g3W5jeXkFBweHGBsb70qSc8ITgf0QKL++QNNyHdd1zMzMIZfTMDEx2Q/Uv2sGJpBYfXw0cHJyjEajAfoXPj49Qzq9RKc8i4EKJBXUt+fnOZTLzxgdGcH2tmr2JZ3zIvwU6Jof9WKpdIvffel6scOFQgi0OP7uS2uOuxdKIImx+rJer6NardIUK4QTSGqoLy8vLzovkq9oyAohBbIU2RZLgbaChG4oHQydZTbC0kFbQUI3lA6GzjIbYemgrSChGw69g98AAAD//00Q+MMAAAAGSURBVAMAjv8uAA57l6cAAAAASUVORK5CYII=" style="margin-left: 0px; margin-top: 0px;" width="38" /></span></span></span></span></div><p></p><p dir="ltr" style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 35px; overflow: hidden; width: 38px;"><br /></span></span></span></span></p><p dir="ltr" style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"></span></span></span></p><div class="separator" style="background-color: transparent; clear: both; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFz0NfgAuibms12G_rhJfgL1aR9_7ZQ3rDpFt-GTyXsbHJP2784nkKpYoS-T4a-mgGFVKwXjXWYV22wRnT0Ndlr9blJ1S69Op8NGYwMgDIG6Lreg9ptZ6xR3IQozrDN-RgJff_ozOgWumMD9daPVOpzdwIRVthjXN65-BarfbFOLfZH1uho-xb9nXAB_M/s846/img9.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="472" data-original-width="846" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFz0NfgAuibms12G_rhJfgL1aR9_7ZQ3rDpFt-GTyXsbHJP2784nkKpYoS-T4a-mgGFVKwXjXWYV22wRnT0Ndlr9blJ1S69Op8NGYwMgDIG6Lreg9ptZ6xR3IQozrDN-RgJff_ozOgWumMD9daPVOpzdwIRVthjXN65-BarfbFOLfZH1uho-xb9nXAB_M/w400-h224/img9.png" width="400" /></a></div><span face=""Google Sans", sans-serif" id="docs-internal-guid-28fa56a7-7fff-cf2c-dd28-79b107f1b1d1" style="background-color: transparent; color: black; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><div style="text-align: center;"><span style="font-family: times; font-style: italic;">See prior conversations in the “Recent Chats” tab.</span></div></span><span face=""Google Sans", sans-serif" id="docs-internal-guid-6eaebfab-7fff-04dc-3dc5-fb66cfd90620" style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><p dir="ltr" style="color: #434343; font-size: 11pt; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span><span face=""Google Sans Text", sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></span></span></p><p dir="ltr" style="color: #434343; font-size: 11pt; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span><span face=""Google Sans Text", sans-serif" style="color: #434343; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></span></span></p><div style="text-align: left;"><span style="font-family: inherit;">Your conversation history is saved to your account, so if you have to sign out or switch accounts you can resume right where you left off when you come back.</span></div></span></span><h3 dir="ltr" style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 4pt; margin-top: 16pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-family: inherit; font-size: medium; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Journeys for Android Studio</span></h3><p dir="ltr" style="background-color: transparent; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span id="docs-internal-guid-2c7550b4-7fff-29c5-9b94-14a127fa0cd7"></span></span></p><div style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Running end-to-end UI tests can improve confidence that you’re shipping a high-quality app to production, but writing and maintaining those tests can be difficult, brittle, and limited in what you’re able to test. </span><a href="https://developer.android.com/studio/gemini/journeys" style="text-decoration: none;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Journeys for Android Studio</span></a><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> leverages the reasoning and vision capabilities of Gemini to enable you to write and maintain end-to-end UI tests using natural language instructions—and it’s now available in the latest stable release of Android Studio when you enable it from Studio Labs in your Android Studio Settings.</span></span></div><p dir="ltr" style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"></p><div class="separator" style="background-color: transparent; clear: both; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF6fUlmYxJrDLxh-8Vv_QbUxvawisraOvVSBoT_GaC1WI0LiQMD9XxhJDRhqRRQQ9rwjgHCVYRGI-iJW9wGZmT3bqBvZd-A9WR3o8pM3u66n45mpHGg68OqmjbjpoLrxdjRxLMRUASxbIlobZZFcNsiXsSa0ru5_kwVsnqQCqHXUCrF_H_RP2-sOrIvxE/s1290/img10.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="916" data-original-width="1290" height="454" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF6fUlmYxJrDLxh-8Vv_QbUxvawisraOvVSBoT_GaC1WI0LiQMD9XxhJDRhqRRQQ9rwjgHCVYRGI-iJW9wGZmT3bqBvZd-A9WR3o8pM3u66n45mpHGg68OqmjbjpoLrxdjRxLMRUASxbIlobZZFcNsiXsSa0ru5_kwVsnqQCqHXUCrF_H_RP2-sOrIvxE/w640-h454/img10.png" width="640" /></a></div><div class="separator" style="background-color: transparent; clear: both; color: black; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><span id="docs-internal-guid-dd2b029e-7fff-8202-30ac-74c5f17f371a"><span style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-family: times;">Journeys for Android Studio.</span></span></span></div><div class="separator" style="background-color: transparent; clear: both; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><br /></div><span face=""Google Sans", sans-serif" id="docs-internal-guid-eb88b4d0-7fff-b8cb-1ed1-c917f6576a17" style="background-color: transparent; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><div style="text-align: left;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">These natural language instructions are converted into interactions that Gemini performs directly on your app. This not only makes your tests easier to write and understand, but also enables you to define complex assertions that Gemini evaluates based on what it “sees” on the device screen. Because Gemini reasons about </span><span style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">how</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> to achieve your goals, these tests are more resilient to subtle changes in your app's layout, significantly reducing flaky tests when running against different app versions or device configurations.</span></span></div><div style="color: black; font-size: 11pt; text-align: left;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div></span><p style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"></p><div class="separator" style="background-color: transparent; clear: both; color: black; font-family: "Google Sans", sans-serif; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoSLOwQpiA5sylD3zgrdVyt0y2kLokc_3QI96Cp4mQMZWbGqpH7-rYhwoDiOeKHW6ZIvQKiNGmSQ8NaDvHmFcRo5ziJXqtYmuZfab6ebDBQR3AaD7_l2U5-KE8CgkHnfiNdSinY5DBVi3Pue4I2L9oFPF6QZ6xfnuvbrU-IPprUGuMwE1JWfUuTwUve7Y/s1728/img11.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1117" data-original-width="1728" height="414" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoSLOwQpiA5sylD3zgrdVyt0y2kLokc_3QI96Cp4mQMZWbGqpH7-rYhwoDiOeKHW6ZIvQKiNGmSQ8NaDvHmFcRo5ziJXqtYmuZfab6ebDBQR3AaD7_l2U5-KE8CgkHnfiNdSinY5DBVi3Pue4I2L9oFPF6QZ6xfnuvbrU-IPprUGuMwE1JWfUuTwUve7Y/w640-h414/img11.gif" width="640" /></a></div><span id="docs-internal-guid-98be4f2b-7fff-bff7-e0e2-1c13d3f72a20" style="background-color: transparent;"><span style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: times;">Journeys for Android Studio.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span><span face="Google Sans, sans-serif" style="background-color: transparent;"><span style="font-size: 14px; white-space-collapse: preserve;"><i><br /></i></span></span><div style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span id="docs-internal-guid-d15eb5cf-7fff-4bfb-159f-40fc0f3aee23" style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">You can </span><a href="https://developer.android.com/studio/gemini/journeys" style="text-decoration-line: none;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">write and run journeys </span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">directly from Android Studio against any local or remote device. The IDE provides a new editor experience for crafting your test steps in an XML file, using either a code view or a dedicated design view. When you run a journey, Android Studio provides rich, detailed results that help you follow Gemini's execution. The test panel breaks down the entire journey into its discrete steps, showing you screenshots for each action, what action was taken, and Gemini's reasoning for why it took that action, making debugging and validation clearer than ever. And because journeys are run as Gradle tasks, you can run them from the command line after you authenticate with a Google Cloud Project. </span></span></div><h3 dir="ltr" style="background-color: transparent; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 4pt; margin-top: 16pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-family: inherit; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Support for remote MCP servers</span></h3><p dir="ltr" style="background-color: transparent; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span id="docs-internal-guid-5f951dfb-7fff-6ab6-d005-aa337ae7b2b1"></span></p><div style="background-color: transparent; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Android Studio now lets you connect directly to remote Model Context Protocol (MCP) servers such as Figma, Notion, Canva, Linear, and more. This significantly reduces your context switching since it enables the AI agent in Android Studio to leverage external tools, helping you stay in your flow. For example, you can connect to Figma's remote MCP server to access files and provide this information to Agent Mode, </span><span face="Arial, sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">generating more accurate code from your designs.</span><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> To learn more about how to add an MCP server, see </span><a href="https://developer.android.com/studio/gemini/add-mcp-server" style="text-decoration: none;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Add an MCP server</span></a><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span></span></div><p dir="ltr" style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span></p><p dir="ltr" style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"></p><div class="separator" style="background-color: transparent; clear: both; color: black; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzYtyCvGDl4RQE_fPszhhg94-KAi8JkGrF0yVuUwms-mjTA6A2_y1v-ky2xmlH4Fng4w72W_i5L_NgBwcNINaDqV7_AhmAOCAnCvv_rcUgOPcZuNKkaF0NJ0gmF7B_pCY3MN5oh22n-DBR3ZN7ipwH2U9l63L_RElL2u2IvJoqM2CESh1CKSaOZ1VEygU/s1800/img12.png" style="font-family: "Google Sans", sans-serif; font-size: 11pt; margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1402" data-original-width="1800" height="498" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzYtyCvGDl4RQE_fPszhhg94-KAi8JkGrF0yVuUwms-mjTA6A2_y1v-ky2xmlH4Fng4w72W_i5L_NgBwcNINaDqV7_AhmAOCAnCvv_rcUgOPcZuNKkaF0NJ0gmF7B_pCY3MN5oh22n-DBR3ZN7ipwH2U9l63L_RElL2u2IvJoqM2CESh1CKSaOZ1VEygU/w640-h498/img12.png" width="640" /></a><span style="background-color: white; font-style: italic;"><span style="font-family: times;">Connect to the Figma remote MCP server in Android Studio Settings.</span></span></div><span face=""Google Sans", sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><div style="font-size: 11pt; text-align: center;"><span style="background-color: white; font-size: 10.5pt; font-style: italic;"><br /></span></div></span><p style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"></p><p dir="ltr" style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"></p><div class="separator" style="background-color: transparent; clear: both; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0PwqLWhH5S1W1tVRraB5ZWjilEC6CMKgWuZDgsd5v7OU7rAXGAYd0acEzqY2NJt5N3ncE5NM5cVhqUaE9kDIfBR2HaHKMuOqMXSkg7jwQBu77fkylHhrM1khkDgZe4saYzHC16LZqCg2ImWEHGxXKIz6Y0cuPKmPF6cltsHooZTwZ9x2DAbbP71yaQiQ/s930/img13.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="515" data-original-width="930" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0PwqLWhH5S1W1tVRraB5ZWjilEC6CMKgWuZDgsd5v7OU7rAXGAYd0acEzqY2NJt5N3ncE5NM5cVhqUaE9kDIfBR2HaHKMuOqMXSkg7jwQBu77fkylHhrM1khkDgZe4saYzHC16LZqCg2ImWEHGxXKIz6Y0cuPKmPF6cltsHooZTwZ9x2DAbbP71yaQiQ/w640-h354/img13.gif" width="640" /></a></div><span style="background-color: transparent; font-family: times;"><span id="docs-internal-guid-163f3d01-7fff-ce0d-8d31-6aa72c17dfea"><span face=""Google Sans", sans-serif" style="background-color: white; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Quickly add a screen to your app using the Figma remote MCP server.</span></span><br /></span><p style="background-color: transparent; color: black; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"></p><h3 dir="ltr" style="background-color: white; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.68; margin-bottom: 0pt; margin-top: 12pt; padding: 0pt 0pt 12pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-family: inherit; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Supercharge your UI development with Agent Mode</span></h3><p dir="ltr" style="background-color: transparent; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-fb390d30-7fff-9cc6-12ba-1f066c73720f"></span></span></p><div style="background-color: white; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Gemini in Android Studio is now integrated into the UI development workflow directly from within the </span><a href="https://developer.android.com/develop/ui/compose/tooling/previews" style="text-decoration: none;"><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Compose Preview</span></a><span face=""Google Sans", sans-serif" style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> panel, helping you go from design to a high-quality implementation faster. These new agentic capabilities are designed to assist you at every stage of development, from initial code generation to iteration, refinement, and debugging, with entry points in the context of your work.</span></span></div></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><div><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span><span><span id="docs-internal-guid-87ab84f9-7fff-f6bc-9860-f8f066d0a113"><h4 dir="ltr" style="background-color: transparent; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; line-height: 1.2; margin-bottom: 4pt; margin-top: 14pt; text-align: left; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-ecd2e10d-7fff-43d8-e00f-9c0725f25275"><span style="font-family: inherit; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Create new UI from a design mock</span></span></h4></span><span><div style="background-color: transparent; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><span face=""Google Sans Text", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div><span><div style="background-color: transparent; font-style: normal; font-variant: normal; font-weight: 400; text-align: left; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Accelerate your initial UI implementation by generating Compose code directly from a design mock. Simply click </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Generate Code From Screenshot</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> in an empty Preview panel, and Gemini will use the image to generate a starting implementation, saving you from writing boilerplate from scratch.</span></span></div><div style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-align: left; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><div style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: left; vertical-align: baseline;"><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span><span><span><span><div class="separator" style="background-color: transparent; clear: both; color: black; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkXocJsEg4G50gbWBMlXS2Af5sIHhTlgYDE-5kxz_rjbK8xKIQj79WS03uL7Cv5oUkL7ON04n3ZGdZ4I6KjE0mtbvF2MB-26e7deEq6KlcCmEBjyPwRTg_ynM3LyfV9cCI8vYigCBh177Fc8B2yXiXOez990qbOSVj3Xp8beJi4f8iMh6jYC1Bws71jLA/s1270/img14.gif" style="font-family: "Google Sans", sans-serif; font-size: 11pt; margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="848" data-original-width="1270" height="428" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkXocJsEg4G50gbWBMlXS2Af5sIHhTlgYDE-5kxz_rjbK8xKIQj79WS03uL7Cv5oUkL7ON04n3ZGdZ4I6KjE0mtbvF2MB-26e7deEq6KlcCmEBjyPwRTg_ynM3LyfV9cCI8vYigCBh177Fc8B2yXiXOez990qbOSVj3Xp8beJi4f8iMh6jYC1Bws71jLA/w640-h428/img14.gif" width="640" /></a><span style="background-color: white; font-style: italic;"><span style="font-family: times;">Generate code from a screenshot in an empty Preview panel.</span></span></div><span><div style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-align: center; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><span style="background-color: white; font-size: 10.5pt; font-style: italic;"><br /></span></div><div style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-align: center; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtyOTSTumasSxCTb74mIu7wjkkKeSVperCo8djolshcXQ0VcpohlLMviz-PCfz74QRlce2Zmbcle3BFVZJ7hJBdZAHwsPHoVDikVP7-Ut5DHLMFtg-gsFnEdxaDzOUAbM5GxeV46e7vo7TKKq4kXoSedd3IvzX6B84_QHbQuSQr2UuuQs2lA3piYTVPLo/s1535/img15.png" style="font-family: "Google Sans", sans-serif; font-size: 11pt; margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="840" data-original-width="1535" height="350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtyOTSTumasSxCTb74mIu7wjkkKeSVperCo8djolshcXQ0VcpohlLMviz-PCfz74QRlce2Zmbcle3BFVZJ7hJBdZAHwsPHoVDikVP7-Ut5DHLMFtg-gsFnEdxaDzOUAbM5GxeV46e7vo7TKKq4kXoSedd3IvzX6B84_QHbQuSQr2UuuQs2lA3piYTVPLo/w640-h350/img15.png" width="640" /></a><span style="font-style: italic;"><span style="font-family: times;">Example turning design into Compose code.</span></span></div></div><div style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant: normal; font-weight: 400; text-align: center; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><br /></div><div style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant: normal; font-weight: 400; text-align: center; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><br /></div><div style="background-color: transparent; font-variant: normal; text-align: left; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-237e4789-7fff-f15f-291e-d5126442af05"><h4 dir="ltr" style="font-family: "Google Sans", sans-serif; font-size: 11pt; line-height: 1.2; margin-bottom: 4pt; margin-top: 14pt;"><span id="docs-internal-guid-286b11f3-7fff-9429-ca04-56dab9762132" style="font-weight: normal;"></span></h4><h4 dir="ltr" style="font-size: 11pt; line-height: 1.2; margin-bottom: 4pt; margin-top: 14pt;"><span style="background-color: transparent; color: black; font-family: inherit; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">Match your UI with a target image</span></h4><div style="font-weight: 400;"><span style="font-family: times; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline;">Once you have an initial implementation, you can iteratively refine it to be pixel-perfect. Right-click your Compose Preview and select </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">AI Actions > Match UI to Target Image</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline;">. Upload a reference design, and the agent will suggest code changes to make your UI match the design as closely as possible.</span></span></span></div><div style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant: normal; font-weight: 400; text-align: left; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></span></div></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><div style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span><span><span><span><span><span face=""Google Sans", sans-serif" style="background-color: transparent; color: black; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibrxfCp2uHZti_khMbti3g56qW1EB3Rh-qUAfJ36pK-ZtSq0EwlnrwJNlt0EJPvimtsuhpmpGIT4VeFCZE0_6Sm3ydo1fKIKK8RXXe4dFKTFN-EGRmeMF8XqNDEtaRqy8rmgV4XdoRYgmlI1SifCDfeGcu3IeACQlpxqVa7itbWfjKewk-tx9TKsf0qkQ/s1398/img16.gif" style="font-size: 11pt; margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="828" data-original-width="1398" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibrxfCp2uHZti_khMbti3g56qW1EB3Rh-qUAfJ36pK-ZtSq0EwlnrwJNlt0EJPvimtsuhpmpGIT4VeFCZE0_6Sm3ydo1fKIKK8RXXe4dFKTFN-EGRmeMF8XqNDEtaRqy8rmgV4XdoRYgmlI1SifCDfeGcu3IeACQlpxqVa7itbWfjKewk-tx9TKsf0qkQ/w640-h380/img16.gif" width="640" /></a><span style="background-color: white; font-family: times; font-style: italic;">Example of using "Match UI to Target Image"</span></div></span><span face=""Google Sans", sans-serif" id="docs-internal-guid-91d5a9a8-7fff-9629-e773-0cfa63b603d1" style="background-color: transparent; color: black; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><div><span style="font-size: 10.5pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div></span><span face=""Google Sans", sans-serif" id="docs-internal-guid-c291aa76-7fff-bd47-90cf-38b0f3059d77"><h4 dir="ltr" style="background-color: white; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; line-height: 1.86667; margin-bottom: 0pt; margin-top: 24pt; padding: 0pt 0pt 12pt; text-decoration-line: none; white-space: pre-wrap;"><span id="docs-internal-guid-1c0f11d9-7fff-baf6-68ee-87b28aed079c" style="font-weight: normal;"><span style="background-color: transparent; font-family: inherit; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Iterate on your UI with natural language</span></span></h4></span><span face=""Google Sans", sans-serif"><div style="background-color: white; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="font-family: inherit;"><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">For more specific or creative changes, right-click on your preview and use the </span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">AI Actions > Change UI</span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. This capability now leverages Agent Mode to validate the results, making it more powerful and accurate. You can use natural language prompts like "change the button color to blue" or "add padding around this text," and Gemini will apply the code modifications instantly.</span></span></div><p dir="ltr" style="background-color: white; color: black; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 0pt; text-decoration-line: none; white-space: pre-wrap;"></p><div class="separator" style="background-color: transparent; clear: both; color: black; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqyfT5yCBzs0vbNqCG_NCGuAdyQoeKSjPgM9-a3vBoNVhjgOe_1XI8sfhGyQBUVjD0xzY4WD4mL2iGkcdEwiwc1jfkZwLJ8k1Opc2gDi4TEgtNQZKzLXqMZDHCDfYDQftqQlIsFe0UO3DZ6XuMAvZppNfHJeG2OLH4AVU5qQB_mbbpvWEJw-I8apXXM_o/s1999/img17.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1229" data-original-width="1999" height="394" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqyfT5yCBzs0vbNqCG_NCGuAdyQoeKSjPgM9-a3vBoNVhjgOe_1XI8sfhGyQBUVjD0xzY4WD4mL2iGkcdEwiwc1jfkZwLJ8k1Opc2gDi4TEgtNQZKzLXqMZDHCDfYDQftqQlIsFe0UO3DZ6XuMAvZppNfHJeG2OLH4AVU5qQB_mbbpvWEJw-I8apXXM_o/w640-h394/img17.png" width="640" /></a></div><span id="docs-internal-guid-5d9e02ee-7fff-c7d3-70a8-3512d8f2e3f9" style="background-color: transparent; color: black; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><div style="text-align: center;"><span style="font-family: times; font-style: italic;">Example of using "Change UI"</span></div></span><span style="background-color: transparent; color: black; font-size: 11pt; font-variant: normal; font-weight: 400; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span><p style="background-color: transparent; color: black; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"></p></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: inherit; font-size: medium;"><b>Find and fix UI quality issues</b></span><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span><span><span><span><span><span face=""Google Sans", sans-serif"><div style="background-color: transparent; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-family: times; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div><div style="background-color: white; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 0pt; text-align: left; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span id="docs-internal-guid-382a7ba3-7fff-0556-3ba7-8f1be1abe6de" style="font-family: inherit;"><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Verifying your UI is high-quality and more accessible is a critical final step. The </span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">AI Actions > Fix all UI check</span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> tool audits your UI for common problems, such as accessibility issues. The agent will then propose and apply fixes to resolve the detected issues.</span></span></span></div><p dir="ltr" style="background-color: white; color: black; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; line-height: 1.2; margin-bottom: 12pt; margin-top: 0pt; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span></span></span></p><div class="separator" style="background-color: transparent; clear: both; color: black; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYsIKApRsCL_AY26fsCc_539tYP1jogBnNNb8hC-G3gQsZ5Ykuul9-HziwV7jN1OLd-F36RdOYg-M55ejb2A5th91tmiXt3oKCPxiY-auL9CyFEl1RKnIoMaaeGz6yTxFko-9K_qfnJ1-HUAZG-bCcPcB2mPqlocoVQkQHsOrhnRgFjIZygTZ_XVNvxAE/s1380/img18.gif" style="font-size: 11pt; margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="840" data-original-width="1380" height="390" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYsIKApRsCL_AY26fsCc_539tYP1jogBnNNb8hC-G3gQsZ5Ykuul9-HziwV7jN1OLd-F36RdOYg-M55ejb2A5th91tmiXt3oKCPxiY-auL9CyFEl1RKnIoMaaeGz6yTxFko-9K_qfnJ1-HUAZG-bCcPcB2mPqlocoVQkQHsOrhnRgFjIZygTZ_XVNvxAE/w640-h390/img18.gif" width="640" /></a></div><div class="separator" style="background-color: transparent; clear: both; color: black; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: white; font-style: italic;"><span style="font-family: times;">Entry point to trigger "Fix all UI check issues"</span></span></div><span style="background-color: transparent; color: black; font-variant: normal; font-weight: 400; text-decoration-line: none; vertical-align: baseline; white-space: pre-wrap;"><div style="font-size: 11pt; text-align: center;"><span style="background-color: white; font-size: 10.5pt; font-style: italic;"><br /></span></div></span></span><p style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"></p><div style="background-color: transparent; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span id="docs-internal-guid-4ebda711-7fff-4443-e901-cec33fb52181" style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">You can also find the same functionality by using the </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Fix with AI</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> button in Compose UI check mode:</span></span></span></div><div style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><br /></div><div style="background-color: transparent; color: black; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span face=""Google Sans", sans-serif" style="font-size: 11pt;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4tHOB-WQgF0NJ6dzfZsH8TUiHfNNaufmlmE0WI-aU4ganl85F7JbK0J0HyautZUFiDVWJX2p01bckAKUXfdEgvVATcCXOtdO8s1RELjfFHyNNaWTVR2paw6ImJglVaVHSSuprxDMWjqKp5eLEe3O5PMLHTMbiyezDX3yYGkEmk2MCGRqo3QBZ0YZB6M/s1999/img19.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1346" data-original-width="1999" height="430" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO4tHOB-WQgF0NJ6dzfZsH8TUiHfNNaufmlmE0WI-aU4ganl85F7JbK0J0HyautZUFiDVWJX2p01bckAKUXfdEgvVATcCXOtdO8s1RELjfFHyNNaWTVR2paw6ImJglVaVHSSuprxDMWjqKp5eLEe3O5PMLHTMbiyezDX3yYGkEmk2MCGRqo3QBZ0YZB6M/w640-h430/img19.png" width="640" /></a></div></span><span id="docs-internal-guid-fec19f69-7fff-d65d-a59a-4abac2157ad6"><div style="text-align: center;"><span style="background-color: white; font-family: times; font-style: italic;">"Fix with AI" in UI Check mode</span></div></span></span></div><div style="background-color: transparent; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></span></div><div style="background-color: transparent; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></span></span></div><div style="background-color: transparent; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">The features mentioned above are also accessible by the toolbar icon in the Preview panel: </span></div><div style="background-color: transparent; color: black; font-family: "Google Sans", sans-serif; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><span style="background-color: transparent; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><div><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span><span><span><span><span><div class="separator" style="background-color: transparent; clear: both; color: black; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-align: center; text-decoration-line: none; white-space: pre-wrap;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3oVVPS1qfxdpGDb47l3VvYxkqzVNyVxgfruGPjn6SrZY-Vg7nCoqn27rEC-6B-z5F40BRO83XfUGoRt5B8x0Kf_OA9i7orreUwmXPw1FExqbDFBXgbWRwIoH3PEpEy70PYnDCs42jHvdIfhqOv0GqIsKvsloxoRVQyxda-I-rJgTx7vBjDgzbSozO53o/s774/img20.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="748" data-original-width="774" height="309" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3oVVPS1qfxdpGDb47l3VvYxkqzVNyVxgfruGPjn6SrZY-Vg7nCoqn27rEC-6B-z5F40BRO83XfUGoRt5B8x0Kf_OA9i7orreUwmXPw1FExqbDFBXgbWRwIoH3PEpEy70PYnDCs42jHvdIfhqOv0GqIsKvsloxoRVQyxda-I-rJgTx7vBjDgzbSozO53o/s320/img20.png" width="320" /></a></div><span face=""Google Sans", sans-serif" id="docs-internal-guid-be6a0aad-7fff-767b-a6cf-27c2b0a4ff3a" style="background-color: transparent; color: black; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; text-decoration-line: none; white-space: pre-wrap;"><div style="text-align: center;"><span style="background-color: white; font-family: times; font-style: italic;">Second entry point to UI development AI features</span></div></span><span face=""Google Sans", sans-serif"><div style="background-color: transparent; font-size: 14.6667px; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-align: center; vertical-align: baseline; white-space-collapse: preserve;"><br /></div></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><div style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-family: inherit;"><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span><span><span><span><span><span face=""Google Sans", sans-serif"><span id="docs-internal-guid-811d49dd-7fff-eae8-3c5d-a128f0e18cc9"><p dir="ltr" style="background-color: white; line-height: 1.2; margin-bottom: 0pt; margin-top: 12pt; padding: 0pt 0pt 12pt; white-space-collapse: preserve;"><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Beyond iterating on your UI, Gemini also helps streamline your development environment.</span></p></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span>To accelerate your setup, you can:</span></span><span><span><span><span><span><span><span><span><span><span><span face="Google Sans, sans-serif"><span><span><span><span><span><span><span><span><span face=""Google Sans", sans-serif"><span><div style="background-color: transparent; white-space-collapse: preserve;"><ul style="text-align: left;"><li><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline;"><span id="docs-internal-guid-bfa69c8c-7fff-2170-b897-ee2f523ed0db" style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Generate Compose Previews</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">: This feature is now enhanced by Agent Mode to provide more accurate results. When working in a file that has Composable functions but no @Preview annotations, you can right-click on the Composable and select </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Gemini > Generate [Composable name] Preview</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. The agent will now better analyze your Composable to generate the necessary boilerplate with correct parameters, to help verify that a successfully rendered preview is added.</span></span></span></li></ul></div><div style="background-color: transparent; font-size: 14.6667px; white-space-collapse: preserve;"><span style="background-color: transparent; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline;"><span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></span></span></div><div style="background-color: transparent; white-space-collapse: preserve;"><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="font-weight: 400;"><div class="separator" style="clear: both; font-size: 11pt; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhzq0eDATmZo564swKU_Bz1kbQZS_xl9jRk9FXQ6JYHyDUzkIKEjfhu4Iyt6lxZOHxqrGWG2pvyj9Zjqzyvktnbl3uT186HgSM781CxadTmYOyIRAVrf9J9odp58SzJO-tQkd5Z6MCIXfe9euIR3IPLXcSRnyJ6zheAnDhdFMHGeyb0Df8T0-pLCJMqao/s1754/img21.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="842" data-original-width="1754" height="308" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhzq0eDATmZo564swKU_Bz1kbQZS_xl9jRk9FXQ6JYHyDUzkIKEjfhu4Iyt6lxZOHxqrGWG2pvyj9Zjqzyvktnbl3uT186HgSM781CxadTmYOyIRAVrf9J9odp58SzJO-tQkd5Z6MCIXfe9euIR3IPLXcSRnyJ6zheAnDhdFMHGeyb0Df8T0-pLCJMqao/w640-h308/img21.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><span style="font-family: times; font-style: italic;">Entry point to generate Compose Preview</span></div></span><span id="docs-internal-guid-7801a711-7fff-2a69-3ba4-36d03166c651"><div style="font-size: 11pt; font-weight: 400;"><span style="background-color: transparent; font-size: 10.5pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div><div style="font-size: 11pt; font-weight: 400;"><span style="background-color: transparent; font-size: 10.5pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div><div style="font-weight: 400;"><ul style="text-align: left;"><li><span style="background-color: transparent; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span id="docs-internal-guid-c35c6903-7fff-514b-73a0-bd71cef76f9c" style="font-family: inherit;"><span style="font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Fix Preview rendering errors:</span><span style="font-style: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> When a Compose Preview fails to render, Gemini can now analyze the error message and your code to find the root cause and apply a fix.</span></span></span></li></ul><div style="font-size: 11pt;"><br /></div><div class="separator" style="clear: both; font-size: 11pt; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQtwDw_DY3COnvTg7hhO7RgjCIK-KyRgorcGrX_AyApM2RFM86PiHmpUEPlkVuUizoVLI5FnRsTZy5AUU9l4kWMxf-yFHaM6So9DgQ9Lv4LhS3c5-i9h92goLsTks6qwnV7oWB4uFUPhDFe6_xAJnoWasN4y6v5az3N9zj_ecvYDT4xHn6AOb2gWg6HvA/s1380/img22.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="840" data-original-width="1380" height="390" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQtwDw_DY3COnvTg7hhO7RgjCIK-KyRgorcGrX_AyApM2RFM86PiHmpUEPlkVuUizoVLI5FnRsTZy5AUU9l4kWMxf-yFHaM6So9DgQ9Lv4LhS3c5-i9h92goLsTks6qwnV7oWB4uFUPhDFe6_xAJnoWasN4y6v5az3N9zj_ecvYDT4xHn6AOb2gWg6HvA/w640-h390/img22.gif" width="640" /></a></div><span id="docs-internal-guid-0f7577a5-7fff-2e39-7e9c-75938096fc3b"><div style="text-align: center;"><span style="font-family: times; font-style: italic;">Using "Fix with AI" on Preview render error</span></div></span><div style="font-size: 11pt;"><br /></div></div><div><span id="docs-internal-guid-d9c414f3-7fff-5f30-1f73-2cb8b03bc900"><h3 dir="ltr" style="font-size: 11pt; font-weight: 400; line-height: 1.38; margin-bottom: 0pt; margin-top: 10pt;"><span id="docs-internal-guid-29c3fab1-7fff-4891-4b27-0a90b123d2dd" style="font-weight: normal;"><span style="font-family: inherit; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">App Links Assistant</span></span></h3><p dir="ltr" style="font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">The App Links Assistant now integrat</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">es with Agent Mode to automate the creation of deep link logic, simplifying one of the most time-consuming steps of implementation. Instead of manually writing code to parse incoming intents and navigate users to the correct screen, you can now let Gemini generate the necessary code and tests. Gemini presents a diff view of the suggested code changes for your review and approval, streamlining the process of handling deep links and ensuring users are seamlessly directed to the right content in your app.</span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">To get started, open the App Links Assistant through the tools menu, then choose <b>Create Applink</b>. In the second step, <b>Add logic to handle the intent</b>, select <b>Generate code with AI assistance</b>. If a sample URL is available, enter it, and then click <b>Insert Code</b>.</span></p><p dir="ltr" style="font-size: 11pt; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></p><p dir="ltr" style="font-size: 11pt; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"></p><div class="separator" style="clear: both; font-weight: 400; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAPccmYx1rYaFx4-x4qvCHak1AWSkPLEdzDmVbO0OUW_gFuWtlED66nYkamKbWIoCWxqFT1-_EsrjTP-LzxH1vRp_9DxnsjVwSru7oEQtE0p4lX-4k4k4PgcgglGdLCXbLk1cvZtVnPaegdKJYZjBSdHnyOqzhbYgsjQJ5KMRpjZdWLhuVI2x-urfNw0Q/s1440/img23.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="810" data-original-width="1440" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAPccmYx1rYaFx4-x4qvCHak1AWSkPLEdzDmVbO0OUW_gFuWtlED66nYkamKbWIoCWxqFT1-_EsrjTP-LzxH1vRp_9DxnsjVwSru7oEQtE0p4lX-4k4k4PgcgglGdLCXbLk1cvZtVnPaegdKJYZjBSdHnyOqzhbYgsjQJ5KMRpjZdWLhuVI2x-urfNw0Q/w640-h360/img23.gif" width="640" /></a></div><span id="docs-internal-guid-b8c2a668-7fff-16b2-d21e-b9affe1810c9" style="font-weight: 400;"><div style="text-align: center;"><span style="font-family: times;"><i>App Links Assistant</i></span></div><div style="font-size: 11pt; text-align: center;"><br /></div></span><p style="font-size: 11pt; font-weight: 400;"></p><h3 dir="ltr" style="font-size: 11pt; font-weight: 400; line-height: 1.2; margin-bottom: 4pt; margin-top: 16pt;"><span id="docs-internal-guid-8caaf548-7fff-fc0a-5f1e-557873d9814c" style="font-weight: normal;"><span style="font-family: inherit; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Automatic Logcat Retracing</span></span></h3><div style="text-align: left;"><span id="docs-internal-guid-7424cf54-7fff-62bd-38dc-bb68a04d3d3e" style="font-family: inherit;"><p dir="ltr" style="background-color: white; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 8pt 0pt 12pt;"><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Debugging R8-optimized code just became seamless. Previously, when R8 was enabled</span><span style="background-color: transparent; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> </span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">(</span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">minifyEnabled = true</span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> in your </span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">build.gradle.kts</span><span style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> <span>file), it would obfuscate stack traces, changing class names, methods, and line numbers. To find the source of a crash, developers had to manually use the R8 retrace command line tool.</span></span></p><span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline;">Starting with </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Android Studio Otter 3</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> <b>Feature Drop</b> with </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">AGP versions 8.12 and above</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline;">, this extra step is no longer necessary. Logcat now automatically detects and retraces R8-processed stack traces, so you can see the original, human-readable stack trace directly in the IDE. This provides a much-improved debugging experience with no extra work required.</span></span></span></div><div style="font-size: 11pt; font-weight: 400; text-align: left;"><span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></span></div><div style="font-weight: 400; text-align: left;"><span style="font-size: 11pt;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBG0D5oiqzLpLrIuAPKmU48Rq180jKwrZnW1aS8x5JSaEubbaf1Cml3wWPXTtWPmVhDAJXNSQ3zIS03kbK_YN3R9rY9liXmLch8Rb2aHkHTkXWClkXfN5RY5iZ3KakJB14i1Z5VAh014TKcSUS3kWBGwcphpqEE-Xj7-Udn8a4Zl4m1RiW67Ru4sjvFRI/s1999/img24.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="508" data-original-width="1999" height="162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBG0D5oiqzLpLrIuAPKmU48Rq180jKwrZnW1aS8x5JSaEubbaf1Cml3wWPXTtWPmVhDAJXNSQ3zIS03kbK_YN3R9rY9liXmLch8Rb2aHkHTkXWClkXfN5RY5iZ3KakJB14i1Z5VAh014TKcSUS3kWBGwcphpqEE-Xj7-Udn8a4Zl4m1RiW67Ru4sjvFRI/w640-h162/img24.png" width="640" /></a></div></span><span id="docs-internal-guid-a4eadc37-7fff-ea88-66fa-cf130612ba07"><div style="text-align: center;"><span style="font-family: times;"><i>Logcat now automatically detects and retraces R8-processed stack traces</i></span></div></span><span style="font-size: 11pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></span></div><div style="font-weight: 400; text-align: left;"><span id="docs-internal-guid-ee0e0da1-7fff-2ace-6ee1-bc831c855b93"><h3 dir="ltr" style="font-size: 11pt; line-height: 1.2; margin-bottom: 4pt; margin-top: 16pt;"><span id="docs-internal-guid-928a3d09-7fff-e1b6-50cf-2c3dc892c9c6" style="font-weight: normal;"><span style="background-color: white; font-family: inherit; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Fused Library Plugin: Publish multiple Android libraries as one</span></span></h3><span style="font-size: 11pt;"><br /></span><div style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">The new Fused Library plugin bundled with Android Gradle Plugin 9.0 allows you to package multiple Android library modules into a single, publishable Android Library (AAR). </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">This was one of the most requested features </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">for Android Gradle Plugin, and we are making it available for you today. This plugin enables you to modularize your code and resources internally while simplifying the integration process for your users by exposing only a single dependency. In addition to streamlining project setup and version management, distributing a fused library can help reduce library size through improved code shrinking and offer better control over your internal implementation details. To learn more about the Fused Library plugin see </span><a href="https://developer.android.com/build/publish-library/fused-library" style="text-decoration-line: none;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Publish multiple Android libraries as one with Fused Library</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">.</span></span></div><p dir="ltr" style="font-size: 11pt; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></p><p dir="ltr" style="font-size: 11pt; line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><div class="separator" style="clear: both; font-size: 11pt; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRb0pJM2zfEW5zdZtaqMIK3HSuUTiYQysVfahvlsBdyuUFwcgvs5oidLnalD9aVMBfu0_ffLT4_zL5sJO5Ial7NjYn-eeYoy7TTS1w6ghuXhK0mGkkb5qCUC11aV3F0i6OUHV9Btb_LzB-T63bkrHl8US4vfHGEh2y-ZkbG_uD2Wdm0FMRf_ldjZnX1dQ/s598/img25.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="491" data-original-width="598" height="329" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRb0pJM2zfEW5zdZtaqMIK3HSuUTiYQysVfahvlsBdyuUFwcgvs5oidLnalD9aVMBfu0_ffLT4_zL5sJO5Ial7NjYn-eeYoy7TTS1w6ghuXhK0mGkkb5qCUC11aV3F0i6OUHV9Btb_LzB-T63bkrHl8US4vfHGEh2y-ZkbG_uD2Wdm0FMRf_ldjZnX1dQ/w400-h329/img25.png" width="400" /></a></div><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span><p style="font-size: 11pt;"></p><div><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><h3 dir="ltr" style="font-size: 11pt; line-height: 1.2; margin-bottom: 4pt; margin-top: 16pt;"><span id="docs-internal-guid-73314c81-7fff-be1b-6644-6fbce154d429" style="font-weight: normal;"><span style="font-family: inherit; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Get started</span></span></h3><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Ready to dive in and accelerate your development? </span><a href="https://developer.android.com/studio" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Download</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> Android Studio Otter 3 Feature Drop and start exploring these powerful new features today! </span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">As always, your feedback is crucial to us. </span><a href="https://developer.android.com/studio/known-issues" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Check known issues</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, </span><a href="https://developer.android.com/studio/report-bugs" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">report bugs</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, and be part of our vibrant community on </span><a href="https://www.linkedin.com/showcase/androiddev/posts/?feedView=all" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">LinkedIn</span></a>,<span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> </span><a href="https://medium.com/androiddevelopers" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Medium</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, </span><a href="https://www.youtube.com/c/AndroidDevelopers/videos" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">YouTube</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, or </span><a href="https://twitter.com/androidstudio" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">X</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. Let's build the future of Android apps together!</span></span></p></span></div></span></div><p dir="ltr" style="font-size: 11pt; font-weight: 400; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span></span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></p><div style="font-size: 11pt; font-weight: 400;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div></span></div></span></span></div></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div></div></div></div></div></div></div></div></div></div><span id="docs-internal-guid-377b5c0c-7fff-e54b-4c36-d5a2a9adc12e"><span><span id="docs-internal-guid-96ddcaee-7fff-2f05-6af9-dec64ed1dd8b"><span><span><span><span id="docs-internal-guid-2285ac3c-7fff-d8fb-6c54-510dfaf229c4"><p style="background-color: transparent; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></p></span></span></span></span></span></span></span>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-59707561638496200222026-01-08T14:00:00.000-08:002026-01-08T14:00:00.115-08:00Ultrahuman launches features 15% faster with Gemini in Android Studio<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiku1ed1IV-Huf_cjPTGYo-balQB9KvURo1SiUVVRbJ8LFvEyYa-qeAuUiqVopJtk4voTalEbvPli_HndhOsDhx-Mw-8KFyQjQZ-DCv-ZCwDeHho-jOa_g2YCmxVZTWDHtJhT1OBno7rI-p5kuhknlYq4Xy_x-t_LAuOhSSz8eTSQ9q8kC2gwN_AiRjTT0/s1600/UltrahumanxGiAS_Metdata.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiku1ed1IV-Huf_cjPTGYo-balQB9KvURo1SiUVVRbJ8LFvEyYa-qeAuUiqVopJtk4voTalEbvPli_HndhOsDhx-Mw-8KFyQjQZ-DCv-ZCwDeHho-jOa_g2YCmxVZTWDHtJhT1OBno7rI-p5kuhknlYq4Xy_x-t_LAuOhSSz8eTSQ9q8kC2gwN_AiRjTT0/s1600/UltrahumanxGiAS_Metdata.png" style="display: none;" />
<span style="font-family: inherit;"><i>Posted by Amrit Sanjeev, Developer Relations Engineer and Trevor Johns, Developer Relations Engineer</i></span><div><span style="font-family: inherit;"><br /></span></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXT1imFEAlLHEx_jsSGNoncVFjea3sQVk1lUqCdOnn4IAvhPJ6DzGdXR3FDqoxmewDeXqfHjoGgcR9Wnlt4_9PTZqTJ4yuOnAETzVITCYj-u5P5jFOtyyAFPSQL7CvuS2_NJOOA6pkP9eXJBaGOKRwKpp99ZymxweYwXVfCSgSmbyCWdjus7bJ09HUEgs/s1280/UltrahumanxGiAS_Banner.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXT1imFEAlLHEx_jsSGNoncVFjea3sQVk1lUqCdOnn4IAvhPJ6DzGdXR3FDqoxmewDeXqfHjoGgcR9Wnlt4_9PTZqTJ4yuOnAETzVITCYj-u5P5jFOtyyAFPSQL7CvuS2_NJOOA6pkP9eXJBaGOKRwKpp99ZymxweYwXVfCSgSmbyCWdjus7bJ09HUEgs/s16000/UltrahumanxGiAS_Banner.gif" /></a></div><br /><span style="font-family: inherit;"><br /></span></div><div><span style="font-family: inherit;"><br /></span></div><div><span id="docs-internal-guid-db706521-7fff-ed2c-7d28-0a342b2f4c1f" style="font-family: inherit;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://play.google.com/store/apps/details?id=com.ultrahuman.android&hl=en_US" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Ultrahuman</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> is a consumer health-tech startup that provides daily well-being insights to users based on biometric data from the company’s wearables, like the </span><a href="https://www.ultrahuman.com/ring/buy/us/" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">RING Air</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and the </span><a href="https://www.ultrahuman.com/m1/" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">M1 Live</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> Continuous Glucose Monitor (CGM). The Ultrahuman team leaned on </span><a href="https://d.android.com/gemini-in-android" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Gemini in Android Studio's</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> contextually aware tools to streamline and accelerate their development process.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Ultrahuman’s app is maintained by a lean team of just eight developers. They prioritize building features that their users love, and have a backlog of bugs and needed performance improvements that take a lot of time. The team needed to scale up their output of feature improvements, and also needed to handle their performance improvements, without increasing headcount. One of their biggest opportunities was reducing the amount of time and effort for their backlog: every hour saved on maintenance could be reinvested into working on features for their users.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwYchkwiSXHlnYgAAktmThlx0vGW0QbzqyGEUnODcXxnVoJyeIuMIrda55AUa0gaGvD2Y0fWEDjiCraTdYD-GqtAh8SnDgtTCQU6f4XSWCgKfjbVSkuMwplI3KB2-qfO2XrncE8fGAGvOUP_wtVPpTFL9ESoaL7UctCwEWuOM6zUOyINqqz8s_tqdZ_PM/s1280/UltrahumanxGiAS_Image_01.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwYchkwiSXHlnYgAAktmThlx0vGW0QbzqyGEUnODcXxnVoJyeIuMIrda55AUa0gaGvD2Y0fWEDjiCraTdYD-GqtAh8SnDgtTCQU6f4XSWCgKfjbVSkuMwplI3KB2-qfO2XrncE8fGAGvOUP_wtVPpTFL9ESoaL7UctCwEWuOM6zUOyINqqz8s_tqdZ_PM/s16000/UltrahumanxGiAS_Image_01.gif" /></a></div><br /><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><p></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Solving technical hurdles and boosting performance with Gemini</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The team integrated Gemini in Android Studio to see if the AI enhanced tools could improve their workflow by handling many Android tasks. First, the team turned to the </span><a href="https://developers.google.com/gemini-code-assist/docs/use-gemini-code-assist-chat" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Gemini chat</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> inside Android Studio. The goal was to prototype a </span><a href="https://learn.adafruit.com/introduction-to-bluetooth-low-energy/gatt" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">GATT Server</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> implementation for their application’s Bluetooth Low Energy (BLE) connectivity. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKQ0jnrWY870cNmMb93eYjErNhLOhSEg-0MVCOJYWGr6VH83CBVBX8E0ctXBP9ceIqucOPFPDvys5twgsm0RKJlD1C9K0q3E_3ob-tWwZUAQ2Bag0B2PiagADClVgS7A4DGhyiOqz94JMLL026bT_rGXX9AaADlwewhumzQr-GlBkOlnKC0DH65kbiB00/s1280/UltrahumanxGiAS_Image_02.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKQ0jnrWY870cNmMb93eYjErNhLOhSEg-0MVCOJYWGr6VH83CBVBX8E0ctXBP9ceIqucOPFPDvys5twgsm0RKJlD1C9K0q3E_3ob-tWwZUAQ2Bag0B2PiagADClVgS7A4DGhyiOqz94JMLL026bT_rGXX9AaADlwewhumzQr-GlBkOlnKC0DH65kbiB00/s16000/UltrahumanxGiAS_Image_02.png" /></a></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">As Ultrahuman’s Android Development Lead, Arka, noted, “</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Gemini helped us reach a working prototype in under an hour</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">—something that would have otherwise taken us several hours.” The BLE implementation provided by Gemini worked perfectly for syncing large amounts of health sensor data while the app ran in the background, improving the data syncing process and saving battery life on both the user's Android phone and Ultrahuman's paired wearable device.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Beyond this core challenge, Gemini also proved invaluable for finding algorithmic optimizations in a custom open-source library, pointing to helpful documentation, assisting with code commenting, and analyzing crash logs. The Ultrahuman team also used </span><a href="https://developer.android.com/studio/preview/gemini/ai-code-completion" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">code completion</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to help them breeze through writing otherwise repetitive code, </span><a href="https://developer.android.com/studio/gemini/generate-compose-previews" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Jetpack Compose Preview Generation</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to enable rapid iteration during UI design, and </span><a href="https://developer.android.com/studio/gemini/agent-mode" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Agent Mode</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for managing complex, project-wide changes, such as rendering a new stacked bar graph that mapped to backend data models and UI models.</span></p><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhddpb5QHeQ_SlX3gRk6Hj3aFhZ32LXDPHFmdQrZ-JHqY0nSZpq2oS5vfUzGL4vbhHWwOhzvLLmvKd0O7RKyYt1KesjEy3GyEb7cTmhsdEojea6RV7VJZur9uV80Vjm0OizSnpN1Mug3SUXlKpcNVlZyOBWxzr5H0_5U7F8Mt_mGNDwmoneanRxo1yAW8o/s1280/UltrahumanxGiAS_Image_03.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhddpb5QHeQ_SlX3gRk6Hj3aFhZ32LXDPHFmdQrZ-JHqY0nSZpq2oS5vfUzGL4vbhHWwOhzvLLmvKd0O7RKyYt1KesjEy3GyEb7cTmhsdEojea6RV7VJZur9uV80Vjm0OizSnpN1Mug3SUXlKpcNVlZyOBWxzr5H0_5U7F8Mt_mGNDwmoneanRxo1yAW8o/s16000/UltrahumanxGiAS_Image_03.png" /></a></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Transforming productivity and accelerating feature delivery</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">These improvements have saved the team dozens of hours each week. This reclaimed time is being used to deliver new features to Ultrahuman’s beta users 10-15% faster. For example, the team built a new in-app AI assistant for users, powered by </span><a href="https://docs.cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/2-5-flash" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Gemini 2.5 Flash</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. The UI design, architecture, and parts of the user experience for this new feature were initially suggested by Gemini in Android Studio—showcasing a full-circle AI-assisted development process. </span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Accelerate your Android development with Gemini</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Gemini's expert Android advice, closely integrated throughout Android Studio, helps Android developers spend less time digging through documentation and writing boilerplate code—freeing up more time to innovate.</span></p><br /><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Learn how </span><a href="http://d.android.com/gemini-in-android" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Gemini in Android Studio</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> can help your team resolve complex issues, streamline workflows, and ship new features faster. </span></span></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-27434121153991250462025-12-19T14:00:00.000-08:002026-01-05T10:06:53.024-08:00Media3 1.9.0 - What’s new<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUMVg00srjTLgh0s2Qc3SgvVpuVUdpzG0jIKkSSI62wa_yafiPGNTskbi87cxNUdHLGRu4KdvO5j82H5gXahXPMGxqOlkad6Kz3b9XMGHNucy2cTCsMclNJf8X_J48BV3CImRg9XwrvnVwlegI1zeS4jl4U5ViJ5xRmqiiZYt-cKMJf6mi0rUDrEiosWc/s1600/Android_Evergreen_Blogger_Banner_AI_WebandApp.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUMVg00srjTLgh0s2Qc3SgvVpuVUdpzG0jIKkSSI62wa_yafiPGNTskbi87cxNUdHLGRu4KdvO5j82H5gXahXPMGxqOlkad6Kz3b9XMGHNucy2cTCsMclNJf8X_J48BV3CImRg9XwrvnVwlegI1zeS4jl4U5ViJ5xRmqiiZYt-cKMJf6mi0rUDrEiosWc/s1600/Android_Evergreen_Blogger_Banner_AI_WebandApp.png" style="display: none;" />
<i>Posted by Kristina Simakova, Engineering Manager</i><div><i><br /></i></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzGjPggvA30UFha0SqYx1MaX1rfNZ25B8KXj6Kl77IxElIr0HhNvwqdzi281wAiapEps37vOi2wr2-jtpsIDLEIsKtMBW4leHSRtGDhwLQ-QYTpBNsTnshUQvOCJOd7rhL10X07WLTXvRgRd6oNnzwta3_NeiyaHo3-u8I5w1OWpW7SHwHvr5z4ca5bK4/s2933/Android_Evergreen_Hero_Banner_AI_WebandApp_OptionB.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="873" data-original-width="2933" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzGjPggvA30UFha0SqYx1MaX1rfNZ25B8KXj6Kl77IxElIr0HhNvwqdzi281wAiapEps37vOi2wr2-jtpsIDLEIsKtMBW4leHSRtGDhwLQ-QYTpBNsTnshUQvOCJOd7rhL10X07WLTXvRgRd6oNnzwta3_NeiyaHo3-u8I5w1OWpW7SHwHvr5z4ca5bK4/s16000/Android_Evergreen_Hero_Banner_AI_WebandApp_OptionB.png" /></a></div><br /><i><br /></i><div><h3 style="text-align: left;">Media3 1.9.0 – What's new?</h3></div><div>Media3 1.9.0 is out! Besides the usual bug fixes and performance improvements, the latest release also contains <b>four</b> new or largely rewritten modules:<br /><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">media3-inspector</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> - Extract metadata and frames outside of playback</span></p></li><span id="docs-internal-guid-9ffc6a01-7fff-b24f-9096-0aeee2e1a7eb"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">media3-ui-compose-material3</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> - Build a basic Material3 Compose Media UI in just a few steps</span></p></li></span><span><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">media3-cast</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> - Automatically handle transitions between Cast and local playbacks</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">media3-decoder-av1</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> - Consistent AV1 playback with the rewritten extension decoder based on the dav1d library</span></p></li></span></ul><span><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We also added caching and memory management improvements to </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">PreloadManager</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and provided several new </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ExoPlayer</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Transformer</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">MediaSession</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> simplifications. </span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This release also gives you the first experimental access to </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">CompositionPlayer</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to preview media edits. </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Read on to find out more, and as always please check out the full </span><a href="https://github.com/androidx/media/releases/tag/1.9.0" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">release notes</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for a comprehensive overview of changes in this release.</span></p></span><h3 style="text-align: left;">Extract metadata and frames outside of playback</h3>There are many cases where you want to inspect media without starting a playback. For example, you might want to detect which formats it contains or what its duration is, or to retrieve thumbnails.<span><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The new </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">media3-inspector</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> module combines all utilities to inspect media without playback in one place:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">MetadataRetriever</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> to read duration, format and static metadata from a </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">MediaItem</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">FrameExtractor</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> to get frames or thumbnails from an item. </span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">MediaExtractorCompat</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> as a direct replacement for the Android platform </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">MediaExtractor</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> class, to get detailed information about samples in the file.</span></p></li></ul><br /><div style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span id="docs-internal-guid-19ff3265-7fff-951a-00e8-97e17d42f5c6"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">MetadataRetriever</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">FrameExtractor</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> follow a simple </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">AutoCloseable</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> pattern. Have a look at our </span><a href="https://developer.android.com/media/media3/inspector" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">new guide pages</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for more details.</span></span></div><br /><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: blue;">suspend</span> <span style="color: blue;">fun</span> extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
<span style="color: blue;">val</span> thumbnail = frameExtractor.getThumbnail().await()
}
}</pre></span><h3 style="text-align: left;">Build a basic Material3 Compose Media UI in just a few steps</h3>In previous releases we started providing connector code between Compose UI elements and your Player instance. With Media3 1.9.0, we added a new module media3-ui-compose-material3 with fully-styled Material3 buttons and content elements. They allow you to build a media UI in just a few steps, while providing all the flexibility to customize style. If you prefer to build your own UI style, you can use the building blocks that take care of all the update and connection logic, so you only need to concentrate on designing the UI element. <span><span id="docs-internal-guid-40b94424-7fff-7cc7-c3ca-8ece4e4a6a6c"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Please check out our </span><a href="https://developer.android.com/media/media3/ui/compose" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">extended guide pages</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for the Compose UI modules.</span></span></span></span></div><div><span><span style="white-space-collapse: preserve;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We are also still working on even more Compose components, like a prebuilt seek bar, a complete out-of-the-box replacement for </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">PlayerView</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, as well as subtitle and ad integration.</span></p><br /><pre style="color: #333333; line-height: 16.25px; margin: 0px;">@Composable
<span style="color: blue;">fun</span> SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) <span style="color: green;">// Video surface and shutter logic</span>
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) <span style="color: green;">// Simple controls</span>
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}</pre><br /><div class="separator" style="clear: both; text-align: center;"><span style="border: none; display: inline-block; height: 186px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 283px;"><img height="186" src="https://blogger.googleusercontent.com/img/a/AVvXsEjMA3Yl64E8oDHTQzdKz0cwsgb14dYXtXHx_L9Huun81lBUvzJBzW2TiEuvgbFrfY092xKoAUDXoq3iYAz2L-w5A0tsqBgBd3vN68_VQ1r9HUxbXwzx8sjT2ukwTuGW_14XB8t-_vZ_W4QCTBQpgm9_jWYP5jJJHkzVJVtqSlvkcH8DWegiiIybk2Swkl0" style="margin-left: 0px; margin-top: 0px;" width="283" /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Simple Compose player UI with out-of-the-box elements</span></p></span><div style="line-height: 1.2; margin-bottom: 6pt; margin-top: 18pt; text-align: left;"><h3 style="text-align: left;">Automatically handle transitions between Cast and local playbacks</h3></div>The <a href="https://developer.android.com/media/media3/cast/create-castplayer">CastPlayer</a> in the <span style="color: #188038; font-family: "Roboto Mono", monospace; white-space-collapse: preserve;">media3-cast</span> module has been rewritten to automatically handle transitions between local playback (for example with <span style="color: #188038; font-family: "Roboto Mono", monospace; white-space-collapse: preserve;">ExoPlayer</span>) and remote Cast playback.</div><div><br /><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">When you set up your </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">MediaSession</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, simply build a </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">CastPlayer</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> around your </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">ExoPlayer</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and add a </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">MediaRouteButton</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to your UI and you're done!</span></p><br /><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: green;">// MediaSession setup with CastPlayer </span>
<span style="color: blue;">val</span> exoPlayer = ExoPlayer.Builder(context).build()
<span style="color: blue;">val</span> castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
<span style="color: blue;">val</span> session = MediaSession.Builder(context, castPlayer).build()
<span style="color: green;">// MediaRouteButton in UI </span>
@Composable <span style="color: blue;">fun</span> UIWithMediaRouteButton() {
MediaRouteButton()
}</pre></span><div class="separator" style="clear: both;"><br /><br /></div><span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><img height="151" src="https://blogger.googleusercontent.com/img/a/AVvXsEinO8BZ9H36QVSMLVFPkdHcWlolu50qHM_Fzj555r0bkZcr29XCqtAs05raRu2aAOhE2TPp6Zb4T-LZnKrMTHJRPrKkZD35yxIJm2uqtIqJODXPgHd1bMiB2Xoq4xujTmBFsg1NHn6_qB0YZb_SyAxe58i6JCt6BgJw7ksR8Rv2BdECAko_n91I-hycUzk" style="font-family: Arial, sans-serif; font-size: 11pt; margin-left: 0px; margin-top: 0px; text-align: left; white-space-collapse: preserve;" width="336" /></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">New CastPlayer integration in Media3 session demo app</span></p></span><br /><h3 style="text-align: left;">Consistent AV1 playback with the rewritten extension based on dav1d</h3>The 1.9.0 release contains a completely rewritten AV1 extension module based on the popular <a href="https://github.com/videolan/dav1d"><span style="color: #1155cc;">dav1d</span></a> library. <span><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">As with all extension decoder modules, please note that it requires </span><a href="https://github.com/androidx/media/tree/release/libraries/decoder_av1#readme" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">building from source </span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">to bundle the relevant native code correctly. Bundling a decoder provides consistency and format support across all devices, but because it runs the decoding in your process, it's best suited for content you can trust. </span></p></span><h3 style="text-align: left;">Integrate caching and memory management into PreloadManager</h3><div style="line-height: 1.2; margin-bottom: 6pt; margin-top: 18pt; text-align: left;"><span style="font-size: normal;"><span face="Arial, sans-serif"><span style="font-weight: normal; white-space-collapse: preserve;">We made our </span></span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;">PreloadManager</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;"> even better as well. It already enabled you to preload media into memory outside of playback and then seamlessly hand it over to a player when needed. Although pretty performant, you still had to be careful to not exceed memory limits by accidentally preloading too much. So with Media3 1.9.0, we added two features that makes this a lot easier and more stable:</span></span></div><span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Caching support –</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> When defining how far to preload, you can now choose </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">PreloadStatus.specifiedRangeCached(0, 5000)</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> as a target state for preloaded items. This will add the specified range to your cache on disk instead of loading the data to memory. With this, you can provide a much larger range of items for preloading as the ones further away from the current item no longer need to occupy memory. Note that this requires setting a </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">Cache</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> in </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">DefaultPreloadManager.Builder</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Automatic memory management – </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">We also updated our </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">LoadControl</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> interface to better handle the preload case so you are now able to set an explicit upper memory limit for all preloaded items in memory. It's 144 MB by default, and you can configure the limit in </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">DefaultLoadControl.Builder</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">. The </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">DefaultPreloadManager</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> will automatically stop preloading once the limit is reached, and automatically releases memory of lower priority items if required.</span></p></li></ol></span><h3 style="text-align: left;">Rely on new simplified default behaviors in ExoPlayer</h3>As always, we added lots of incremental improvements to ExoPlayer as well. To name just a few:<span><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Mute and unmute – </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">We already had a </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">setVolume</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> method, but have now added the convenience </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">mute</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> and </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">unmute</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> methods to easily restore the previous volume without keeping track of it yourself.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Stuck player detection – </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">In some rare cases the player can get stuck in a buffering or playing state without making any progress, for example, due to codec issues or misconfigurations. Your users will be annoyed, but you never see these issues in your analytics! To make this more obvious, the player now reports a </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">StuckPlayerException</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> when it detects a stuck state.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Wakelock by default – </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">The wake lock management was previously opt-in, resulting in hard to find edge cases where playback progress can be delayed a lot when running in the background. Now this feature is opt-out, so you don't have to worry about it and can also remove all manual wake lock handling around playback.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Simplified setting for CC button logic</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">–</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> Changing </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">TrackSelectionParameters</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> to say "turn subtitles on/off" was surprisingly hard to get right, so we added a simple boolean </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">selectTextByDefault</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> option for this use case.</span></p></li></ul></span><h3 style="text-align: left;">Simplify your media button preferences in MediaSession</h3>Until now, defining your preferences for which buttons should show up in the media notification drawer on Android Auto or WearOS required defining custom commands and buttons, even if you simply wanted to trigger a standard player method.<span><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Media3 1.9.0 has new functionality to make this a lot simpler – you can now </span><a href="https://developer.android.com/media/media3/session/control-playback#commands" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">define your media button preferences</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> with a standard player command, requiring no custom command handling at all.</span></p><br /><pre style="color: #333333; line-height: 16.25px; margin: 0px;">session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) <span style="color: green;">// choose an icon</span>
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) <span style="color: green;">// choose an action </span>
.build()
))</pre><br /><div class="separator" style="clear: both; text-align: center;"><span style="border: none; display: inline-block; height: 180px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 347px;"><img height="180" src="https://blogger.googleusercontent.com/img/a/AVvXsEiR2wrBZE2z7ajbDstQUVEPXzS-yu-JMHJ1z9tHp_xwAQnjwGCDVGmLSySyMJDjIWJ08sp1LhimZY0z-jUFTGc6gOTrtuKjPil0iBx603GiIQceEk5vBtyzeSkip5DyCZodIpzvGUeb_uiETZEwoQU1dfvB0V8Hqrxw2ktOA7C3MBVY6EIJeCIh9WI5w24" style="margin-left: 0px; margin-top: 0px;" width="347" /></span></div><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Media button preferences with fast forward button</span></p></span><div style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><h3 style="text-align: left;">CompositionPlayer for real-time preview</h3><span face="Arial, sans-serif"><span style="white-space-collapse: preserve;">The 1.9.0 release introduces CompositionPlayer under a new </span></span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">@ExperimentalApi</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> annotation. The annotation indicates that it is available for experimentation, but is still under development. </span></div><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">CompositionPlayer</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> is a new component in the Media3 editing APIs designed for real-time preview of media edits. Built upon the familiar Media3 </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Player</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> interface, </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">CompositionPlayer</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> allows users to see their changes in action before committing to the export process. It uses the same </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Composition</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> object that you would pass to </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Transformer</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for exporting, streamlining the editing workflow by unifying the data model for preview and export.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We encourage you to start using </span><a href="https://developer.android.com/reference/androidx/media3/transformer/CompositionPlayer" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">CompositionPlayer</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and share </span><a href="https://github.com/androidx/media/issues" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">your feedback</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and keep an eye out for forthcoming posts and updates to the documentation for more details.</span></p></span><h3 style="text-align: left;">InAppMuxer as a default muxer in Transformer</h3><div style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: left;"><span style="font-size: normal;"><span face="Arial, sans-serif" style="font-weight: normal;"><span style="white-space-collapse: preserve;">Transformer now uses </span></span><a href="https://developer.android.com/reference/androidx/media3/transformer/InAppMp4Muxer" style="font-weight: normal; text-decoration-line: none;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">InAppMp4Muxer</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;"> as the default muxer for writing media container files. Internally, </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;">InAppMp4Muxer</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;"> depends on the Media3 </span><a href="https://developer.android.com/reference/androidx/media3/muxer/package-summary" style="font-weight: normal; text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Muxer</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;"> module, providing consistent behaviour across all API versions. </span></span></div><span><div style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Note that while Transformer no longer uses the Android platform's </span><a href="https://developer.android.com/reference/android/media/MediaMuxer" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">MediaMuxer</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> by default, you can still provide </span><span face="Arial, sans-serif" style="color: #188038; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">FrameworkMuxer.Factory</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> via </span><a href="https://developer.android.com/reference/androidx/media3/transformer/Transformer.Builder#setMuxerFactory(androidx.media3.muxer.Muxer.Factory)" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">setMuxerFactory</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> if your use case requires it.</span></div></span><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"></h2><h3 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: left;">New speed adjustment APIs</h3><div style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: left;"><span style="font-size: normal;"><span face="Arial, sans-serif"><span style="font-weight: normal; white-space-collapse: preserve;">The 1.9.0 release simplifies speed adjustments APIs for media editing. We've introduced new methods directly on </span></span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;">EditedMediaItem.Builder</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;"> to control speed, making the API more intuitive. You can now change the speed of a clip by calling </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;">setSpeed(SpeedProvider provider)</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;"> on the </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;">EditedMediaItem.Builder</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: normal; vertical-align: baseline; white-space-collapse: preserve;">:</span></span></div><span><br /><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: blue;">val</span> speedProvider = <span style="color: blue;">object</span> : <span style="color: #2b91af;">SpeedProvider</span> {
<span style="color: blue;">override</span> <span style="color: blue;">fun</span> getSpeed(presentationTimeUs: <span style="color: #2b91af;">Long</span>): <span style="color: #2b91af;">Float</span> {
<span style="color: blue;">return</span> speed
}
<span style="color: blue;">override</span> <span style="color: blue;">fun</span> getNextSpeedChangeTimeUs(timeUs: <span style="color: #2b91af;">Long</span>): <span style="color: #2b91af;">Long</span> {
<span style="color: blue;">return</span> C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()</pre><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This new approach replaces the previous method of using </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Effects#createExperimentalSpeedChangingEffects()</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, which we've deprecated and will remove in a future release.</span></p></span><h3 style="text-align: left;">Introducing track types for EditedMediaItemSequence</h3></div><div>In the 1.9.0 release, <span style="background-color: #f8f9fa; color: #188038; font-family: "Roboto Mono", monospace; white-space-collapse: preserve;">EditedMediaItemSequence</span> requires specifying desired output track types during sequence creation. This change ensures track handling is more explicit and robust across the entire Composition. <span><p dir="ltr" style="background-color: white; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 8pt;"><span face=""Google Sans", sans-serif" style="background-color: transparent; color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This is done via a new </span><span style="background-color: #f8f9fa; color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">EditedMediaItemSequence.Builder</span><span face=""Google Sans", sans-serif" style="background-color: transparent; color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> constructor that accepts a set of track types (e.g., </span><span style="background-color: #f8f9fa; color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">C.TRACK_TYPE_AUDIO</span><span face=""Google Sans", sans-serif" style="background-color: transparent; color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, </span><span style="background-color: #f8f9fa; color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">C.TRACK_TYPE_VIDEO</span><span face=""Google Sans", sans-serif" style="background-color: transparent; color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">). </span></p><p dir="ltr" style="background-color: white; line-height: 1.2; margin-bottom: 8pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="background-color: transparent; color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To simplify creation, we've added new static convenience methods:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="color: #202124; font-family: "Google Sans", sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="background-color: white; line-height: 1.2; margin-bottom: 0pt; margin-top: 8pt;"><span style="background-color: #f8f9fa; color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)</span></p></li><li aria-level="1" dir="ltr" style="color: #202124; font-family: "Google Sans", sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="background-color: white; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: #f8f9fa; color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)</span></p></li><li aria-level="1" dir="ltr" style="color: #202124; font-family: "Google Sans", sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="background-color: white; line-height: 1.2; margin-bottom: 8pt; margin-top: 0pt;"><span style="background-color: #f8f9fa; color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)</span></p></li></ul><p dir="ltr" style="background-color: white; line-height: 1.2; margin-bottom: 0pt; margin-top: 8pt; padding: 0pt 0pt 8pt;"><span face=""Google Sans", sans-serif" style="background-color: transparent; color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We encourage you to migrate to the new constructor or the convenience methods for clearer and more reliable sequence definitions.</span></p><p dir="ltr" style="background-color: white; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 8pt;"><span face=""Google Sans", sans-serif" style="background-color: transparent; color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Example of creating a video-only sequence:</span></p><p dir="ltr" style="background-color: white; line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; padding: 0pt 0pt 8pt;"><span face=""Google Sans", sans-serif" style="background-color: transparent; color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p><pre style="color: #333333; line-height: 16.25px; margin: 0px;">EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()</pre><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">---</span></p><br /><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Please get in touch via the </span><a href="https://github.com/androidx/media/issues" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Media3 issue Tracker</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> if you run into any bugs, or if you have questions or feature requests. We look forward to hearing from you!</span></span></div></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-79515498145643667292025-12-19T09:00:00.000-08:002025-12-19T09:00:00.118-08:00Goodbye Mobile Only, Hello Adaptive: Three essential updates from 2025 for building adaptive apps<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFFPBX2aEy-BimBic-IaoVAZ7rxlSVic8wsgRsremTvpkH0fc2WlXx0GBj_fUFZYwnFTRiLjD6mYincdLsFxTE0fWoI-1WJxQYdaHXC00LSg48apySI-0oakfL9EI5IXDqUWivLBXzKQZXRuhCjMxCKMfOW8CLsu_KYcEpjXIKe-wLsF_uCfuPEni58Tc/s1600/Android%20adaptives%20festivity%2001-%20Meta.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFFPBX2aEy-BimBic-IaoVAZ7rxlSVic8wsgRsremTvpkH0fc2WlXx0GBj_fUFZYwnFTRiLjD6mYincdLsFxTE0fWoI-1WJxQYdaHXC00LSg48apySI-0oakfL9EI5IXDqUWivLBXzKQZXRuhCjMxCKMfOW8CLsu_KYcEpjXIKe-wLsF_uCfuPEni58Tc/s1600/Android%20adaptives%20festivity%2001-%20Meta.png" style="display: none;" />
<span style="font-family: inherit;"><i>Posted by Fahd Imtiaz – Product Manager, Android Developer</i></span><div><i><br /></i></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS6YgtA7YpSchhp35EkoNzH0UkEgoc7PDuREJem6tM7fNnlZBdWjFmbVdYgkJmaQqS8CXp049vxsBs2qKM9dNt9SvC6PxMlBln2WyazTi6rejDsRhKO5l3YfcZM0HFv-Ty15u-Ay-fbgHhuCFsCC4AJ_6CoWU2545NctvGtXnfPVxs2IXdFab6-bY9WpM/s4209/Android-adaptives-festivity-01-blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS6YgtA7YpSchhp35EkoNzH0UkEgoc7PDuREJem6tM7fNnlZBdWjFmbVdYgkJmaQqS8CXp049vxsBs2qKM9dNt9SvC6PxMlBln2WyazTi6rejDsRhKO5l3YfcZM0HFv-Ty15u-Ay-fbgHhuCFsCC4AJ_6CoWU2545NctvGtXnfPVxs2IXdFab6-bY9WpM/s16000/Android-adaptives-festivity-01-blog.png" /></a></div><br /><i><br /></i><div><span style="font-family: inherit;"><br /></span></div><div><span id="docs-internal-guid-29bc0da1-7fff-7b97-448a-742650b5e193"><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Goodbye Mobile Only, Hello Adaptive: Three essential updates from 2025 for building adaptive apps</span></h3><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In 2025 the Android ecosystem has grown far beyond the phone. Today, developers have the opportunity to reach over 500 million active devices, including foldables, tablets, XR, Chromebooks, and compatible cars.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="border: none; clear: left; display: inline-block; float: left; font-family: inherit; margin-bottom: 1em; margin-right: 1em;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEjy7xQFGWIHwwfOar8H6H2F78ZOb99K6CvpIFFk_yE7luF1RL0-Ipb0huxMPtIb7oRHi9m3mmZgvsP952TAMMQO_B6V8i7a0g8eKZuSBSCTeEMdAI20paSXSqoWUjIMvGHC75PeTQJb7zUzf72NNvirCOINRF8yDsy8xjEP9qNagJ8yPxQX07QiDwEcIJ4=s16000" style="margin-left: 0px; margin-top: 0px;" /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">These aren't just additional screens; they represent a higher-value audience. We’ve seen that users who own both a phone and a tablet spend 9x more on apps and in-app purchases than those with just a phone. For foldable users, that average spend jumps to roughly 14x more*.</span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This engagement signals a necessary shift in development:</span><a href="https://developer.android.com/adaptive-apps" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"> goodbye mobile apps, hello adaptive apps</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimETUlXG2aAIBTdEHtfxmnSaz5DRYuHrjuqU1y32a7t7XPPLspb57AMEx3dHb4yszpXuGRdjPHBo-aiQApt6MOlku9_q2YgS0w5Fh_ILS_foZvkoDml4KEyqY_fGvLiTDZLdVZ-JFaFB8zTES3nMvqx9DqtP-0W5GIlqdrxi1Ejd1UmJBKRZjamQYBskE/s1920/adaptive-apps.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimETUlXG2aAIBTdEHtfxmnSaz5DRYuHrjuqU1y32a7t7XPPLspb57AMEx3dHb4yszpXuGRdjPHBo-aiQApt6MOlku9_q2YgS0w5Fh_ILS_foZvkoDml4KEyqY_fGvLiTDZLdVZ-JFaFB8zTES3nMvqx9DqtP-0W5GIlqdrxi1Ejd1UmJBKRZjamQYBskE/s16000/adaptive-apps.png" /></a></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To help you build for that future, we spent this year releasing tools that make</span><a href="https://developer.android.com/develop/ui/compose/build-adaptive-apps" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;"> adaptive the default way to build</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Here are three key updates from 2025 designed to help you build these experiences.</span></span></p><span style="font-family: inherit;"><br /></span><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Standardizing adaptive behavior with Android 16</span></h3><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To support this shift, </span><a href="https://android-developers.googleblog.com/2025/01/orientation-and-resizability-changes-in-android-16.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Android 16 introduced significant changes</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to how apps can restrict orientation and resizability. On displays of at least 600dp, manifest and runtime restrictions are ignored, meaning apps can no longer lock themselves to a specific orientation or size. Instead, they fill the entire display window, ensuring your UI scales seamlessly across portrait and landscape modes. </span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Because this means your app context will change more frequently, it’s important to verify that you are preserving UI state during configuration changes. While Android 16 offers a temporary opt-out to help you manage this transition, Android 17 (SDK37) will make this behavior mandatory. To ensure your app behaves as expected under these new conditions, use the resizable emulator in Android Studio to </span><a href="https://developer.android.com/training/testing/different-screens" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">test your adaptive layouts today</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. </span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><h3 style="text-align: left;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Supporting screens beyond the tablet with Jetpack WindowManager 1.5.0</span></span></h3><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">As devices evolve, our existing definitions of "large" need to evolve with them. In October, we </span><a href="https://android-developers.googleblog.com/2025/10/jetpack-windowmanager-15-is-stable.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">released Jetpack WindowManager 1.5.0</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to better support the growing number of very large screens and desktop environments.</span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">On these surfaces, the standard "Expanded" layout, which usually fits two panes comfortably, often isn't enough. On a 27-inch monitor, two panes can look stretched and sparse, leaving valuable screen real estate unused. To solve this, WindowManager 1.5.0 introduced two new width window size classes: Large (1200dp to 1600dp) and Extra-large (1600dp+).</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIokPMA-olDxBKlYoTLAorZTwS9qaKd-kBOJJWMCxcP4ck5y2y5j1rw3m9HaJgHHsRCllHvSVAXPvhlAfvCOLoWU9UbcG2_xQz80wtp4rw00S5ZlwVc5f2fpnVjxXcY3olo6uRJmz9LzVxJt796npj52CTrTBoLy_UK1zLmNKfuI11EPFEFE9ordinMQw/s2048/window_size_classes_width.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="772" data-original-width="2048" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIokPMA-olDxBKlYoTLAorZTwS9qaKd-kBOJJWMCxcP4ck5y2y5j1rw3m9HaJgHHsRCllHvSVAXPvhlAfvCOLoWU9UbcG2_xQz80wtp4rw00S5ZlwVc5f2fpnVjxXcY3olo6uRJmz9LzVxJt796npj52CTrTBoLy_UK1zLmNKfuI11EPFEFE9ordinMQw/s16000/window_size_classes_width.png" /></a></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">These new breakpoints signal when to switch to high-density interfaces. Instead of stretching a typical list-detail view, you can take advantage of the width to show three or even four panes simultaneously. Imagine an email client that comfortably displays your folders, the inbox list, the open message, and a calendar sidebar, all in a single view. Support for these window size classes was added to </span><a href="https://developer.android.com/develop/ui/compose/layouts/adaptive" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Compose Material 3 adaptive </span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">in the </span><a href="https://developer.android.com/jetpack/androidx/releases/compose-material3-adaptive#1.2.0" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">1.2 release</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. </span></span></p><span style="font-family: inherit;"><br /></span><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Rethinking user journeys with Jetpack Navigation 3</span></h3><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Building a UI that morphs from a single phone screen to a multi-pane tablet layout used to require complex state management. This often meant forcing a navigation graph designed for single destinations to handle simultaneous views. First </span><a href="https://android-developers.googleblog.com/2025/05/announcing-jetpack-navigation-3-for-compose.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">announced at I/O 2025</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, Jetpack Navigation 3 </span><a href="https://android-developers.googleblog.com/2025/11/jetpack-navigation-3-is-stable.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">is now stable</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, introducing a new approach to handling user journeys in adaptive apps.</span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Built for Compose, </span><a href="https://developer.android.com/guide/navigation/navigation-3" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Nav3</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> moves away from the monolithic graph structure. Instead, it provides decoupled building blocks that give you full control over your back stack and state. This solves the single source of truth challenge common in split-pane layouts. Because Nav3 uses the Scenes API, you can display multiple panes simultaneously without managing conflicting back stacks, simplifying the transition between compact and expanded views.</span></span></p><span style="font-family: inherit;"><br /></span><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">A foundation for an adaptive future</span></h3><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEiVVxIR1V0FxAgqntIGr_8Ng4695SPyBJzV0UcwFI5hs0lYnbe3K88uEeUA7xtEt1AG3lPltX7TPOvOrPstYrARTPfSG--c0NibM3HRDcfC0dCq33mXRuK-MXfsfal9XmWx_pDilMXSJbnDTHKvko18Pgf_nyur65JZK1bQoPBpaG0HHnSX5TnAh21tvLw=s16000" style="margin-left: 0px; margin-top: 0px;" /><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br />This year delivered the tools you need, from optimizing for expansive layouts to the granular controls of </span><a href="https://developer.android.com/jetpack/androidx/releases/window#version_15_2" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">WindowManager</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and </span><a href="https://developer.android.com/guide/navigation/navigation-3" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Navigation 3</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. And, Android 16 began the shift toward truly flexible UI, with updates coming next year to deliver excellent adaptive experiences across all form factors. To learn more about </span><a href="https://android-developers.googleblog.com/2025/05/adaptiveapps-io25.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">adaptive development principles</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and get started, head over to </span><a href="http://d.android.com/adaptive-apps" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">d.android.com/adaptive-apps</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. </span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The tools are ready, and the users are waiting. We can’t wait to see what you build!</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-85aacf33-7fff-f3cf-d630-364e0b8b294f"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">*Source: internal Google data</span></span></span></p><div><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span></div></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-20974536592129911652025-12-18T09:00:00.000-08:002025-12-18T09:00:00.116-08:00Bringing Androidify to Wear OS with Watch Face Push<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNtDIxOiiEPObA6g_6dgbNwjmx8KzrCrU7te07duutzsAJT3LebLW-RhJ2gVjteDMdTHcL960a3ytrdhQg7npCDHpi22KA1jnWEOfj0BD7IjcvXzseNfeTOhZbQb6skbRzXt8-7zL09vcLrefJu5f8xdfe9rDJms-pLgVIqk4qQxa1DPVqiG3kAwtmzHE/s1600/Androidify-for-watch-faces-Meta.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNtDIxOiiEPObA6g_6dgbNwjmx8KzrCrU7te07duutzsAJT3LebLW-RhJ2gVjteDMdTHcL960a3ytrdhQg7npCDHpi22KA1jnWEOfj0BD7IjcvXzseNfeTOhZbQb6skbRzXt8-7zL09vcLrefJu5f8xdfe9rDJms-pLgVIqk4qQxa1DPVqiG3kAwtmzHE/s1600/Androidify-for-watch-faces-Meta.png" style="display: none;" />
<p><em>Posted by Garan Jenkin - Developer Relations Engineer</em></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpjjr7GPd0FzPqYWmu7MGN-OFEeVsMzx40UO7jwZjQ4bB6A6vqBik6DuUI0cgpUr4SWJ0ZFobOVbjFwiZ2zUdR_xkDBwXwDfZxqOzV351mXVxUXoThsuclzaij-haPSIJ-Mg0csk6WoCWeO_VgSvfAmLf6vgbDk-53yt6DZdhC4UnzoSSKJLP3JVKTghc/s4209/Androidify%20for%20watch%20faces-Blog.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpjjr7GPd0FzPqYWmu7MGN-OFEeVsMzx40UO7jwZjQ4bB6A6vqBik6DuUI0cgpUr4SWJ0ZFobOVbjFwiZ2zUdR_xkDBwXwDfZxqOzV351mXVxUXoThsuclzaij-haPSIJ-Mg0csk6WoCWeO_VgSvfAmLf6vgbDk-53yt6DZdhC4UnzoSSKJLP3JVKTghc/s16000/Androidify%20for%20watch%20faces-Blog.png" /></a></div><br /><em><br /></em><p></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><iframe allowfullscreen="" class="BLOG_video_class" height="306" src="https://www.youtube.com/embed/JgsPXZIKInw" width="584" youtube-src-id="JgsPXZIKInw"></iframe></span></div><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br />A few months ago we </span><a href="https://android-developers.googleblog.com/2025/09/androidify-ai-gemini-android-jetpack-compose-firebase-camerax.html" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">relaunched Androidify</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> as an app for generating personalized Android bots. Androidify transforms your selfie photo into a playful Android bot using </span><a href="https://android-developers.googleblog.com/2025/05/androidify-how-androidify-leverages-gemini-firebase-ml-kit.html" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Gemini and Imagen</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.</span><p></p><p><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">However, given that Android spans multiple form factors, </span><a href="https://android-developers.googleblog.com/2025/10/bringing-androidify-to-xr-with-jetpack.html" style="text-decoration-line: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">including our most recent addition, XR</span></a><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, we thought, how could we bring the fun of Androidify to Wear OS?</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 100%; max-width: 220px; overflow: hidden;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEiKQICs9OOBsmkQkMNT7QBj-qQ1rTxz24o0oEBmuLnx6JXZjr2bp9z8L243UmMjCP8uZoMjwYGE1oMGO2fkSki0UDTldg7LrYv69F-mEp8dfLvexBuQWP42FG5FJ3AiZYJjMSHbA39uHgnAdtvRIz4yTLqkyjNfdlUN9j4UUBdNqFa5HAv34SIHJVtURuw" /></span></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="color: #666666; font-style: italic;">An Androidify watch face<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">As Androidify bots are highly-personalized, the natural place to showcase them is the watch face. Not only is it the most frequently visible surface but also the most personal surface, allowing you to represent who you are.<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 100%; max-width: 335px; overflow: hidden;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><img border="0" data-original-height="383" data-original-width="495" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUFL6iMWpogIFloXAQMCF0a3c9BfNL5gdo3xv-916qFnpQ5Jv1qeFsXEmcBZVBl2iWPLkMFvoeL8mnrpERFeq_D6iGJLIAqTTCqDlGMfp9wF2BaYB7LCAWn_oNwFtvBky5amCB7tPL8xKBHk7Xwwq74eupVaW1dXQqR7B3z0fYVVGRYD5EvQtFtm379i4/s16000/demonstration.gif" /></span><br /><span style="color: #666666; font-style: italic;">Personalized Androidify watch face, generated from selfie image</span></span><br /><br /></span></p><div class="separator" style="clear: both; text-align: center;"></div><p><span style="color: #666666;">Androidify now has the ability to generate a watch face dynamically within the phone app and then send it to your watch, where it will automatically be set as your watch face. All of this happens within seconds!</span></p><p dir="ltr" style="margin-bottom: 16pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-size: 15pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">High-level design</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 100%; max-width: 432px; overflow: hidden;"><img height="274" src="https://blogger.googleusercontent.com/img/a/AVvXsEh0zWUzVp4kZpdgc04fcTRc2cVVEDqIISpBfAj4KFfyhyELAtKqLzJgDXMhJY5w9aNACtB5MgTAkKivjTcMrsONdgavv7qPp6cz5oDc6MQlzY2xOAowJ0NFv6LkcZxomVGIyzTgbCg7i5_AVcblkjzTsJ1WKSS57yAhyBH2OQalt7ZzK-IzUKVzQGvUjK8" style="margin-left: 0px; margin-top: 0px;" width="432" /><span style="color: #666666; font-style: italic;">End-to-end flow for watch face creation and installation</span></span></span></p><p><span style="color: #666666;">In order to achieve the end-to-end experience, a number of technologies need to be combined together, as shown in this high-level design diagram.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">First of all, the user’s avatar is combined with a pre-existing </span><a href="https://developer.android.com/training/wearables/wff" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Watch Face Format</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> template, which is then packaged into an APK. This is validated - for reasons which will be explained! - and sent to the watch.<br /><br /></span></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">On being received by the watch, the new </span><a href="https://developer.android.com/training/wearables/watch-face-push" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Watch Face Push API</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> - part of Wear OS 6- is used to install and activate the watch face.<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Let’s explore the details:</span></p><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 16pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #434343; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Creating the watch face templates</span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The watch face is created from a template, itself designed in</span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><a href="https://www.figma.com/community/plugin/1537485193225852308/watch-face-designer" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Watch Face Designer</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. </span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This is our new Figma plugin that allows you to create </span><a href="https://developer.android.com/training/wearables/wff" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Watch Face Format</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> watch faces directly within Figma.<br /><br /></span></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 100%; max-width: 447px; overflow: hidden;"><img height="242" src="https://blogger.googleusercontent.com/img/a/AVvXsEg2grARsqVXD-BvTZaB8j7U_dWU_Z96yfFrb4DVmhDU7-2Lx5rI9pzwao-xc5pFZvAUcOy0lwBw7NVyEiNL9e5QX3HZNHZZYSaMXk-BXbVeOx8fYhbnoE0FEGChV68H093KlLyplzFhIllPPuSASd_52qfInTZCwhqZxCagE6thDCTKb9vpUksRmCr1Grc" style="margin-left: 0px; margin-top: 0px;" width="447" /><br /><span style="color: #666666; font-style: italic;">An Androidify watch face template in Watch Face Designer</span></span></span></p><p><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The plugin allows the watch face to be exported in a </span><a href="https://developer.android.com/training/wearables/watch-face-designer/export" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">range of different ways</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, including as Watch Face Format (WFF) resources. These can then be easily incorporated as </span><a href="https://github.com/android/androidify/tree/main/watchface/src/main/assets" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">assets within the Androidify app</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, for dynamically building the finalized watch face.</span></p><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 16pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: #434343; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Packaging and validation</span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Once the</span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><a href="https://github.com/android/androidify/blob/main/watchface/src/main/java/com/android/developers/androidify/watchface/creator/WatchFaceCreator.kt#L49" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">template and avatar have been combined</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, </span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the </span><a href="https://github.com/google/pack" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Portable Asset Compiler Kit</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> (Pack) is used to assemble an APK.</span></p><p><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">In Androidify, Pack is used as a </span><a href="https://github.com/android/androidify/tree/main/watchface/src/main/jniLibs" style="text-decoration-line: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">native library on the phone</span></a><span face="'Google Sans',sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. </span><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">For more details on how Androidify interfaces with the Pack library, see the </span><a href="https://github.com/android/androidify/blob/main/watchface/pack-java/src/lib.rs" style="text-decoration-line: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">GitHub repository</span></a><span face="'Google Sans',sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">.</span></p><p><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">As a final step before transmission, the APK is checked by th</span><span face="'Google Sans',sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">e </span><a href="https://developer.android.com/training/wearables/watch-face-push#validation" style="text-decoration-line: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Watch Face Push validator</span></a><span face="'Google Sans',sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">.</span></p><p><span style="color: #666666;">This validator checks that the APK is suitable for installation. This includes checking the contents of the APK to ensure it is a valid watch face, as well as some performance checks. If it is valid, then the validator produces a token.</span></p><p><span style="color: #666666;">This token is required by the watch for installation.</span></p><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 16pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: #434343; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Sending the watch face</span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The Androidify app on Wear OS uses</span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><a href="https://github.com/android/androidify/blob/main/wear/src/main/java/com/android/developers/androidify/service/AndroidifyDataListenerService.kt" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">WearableListenerService</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">to listen for events on the Wearable Data Layer.</span></p><p><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">The phone app</span><span face="'Google Sans',sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> </span><a href="https://github.com/android/androidify/blob/main/watchface/src/main/java/com/android/developers/androidify/watchface/transfer/WearAssetTransmitter.kt" style="text-decoration-line: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">transfers the watch face</span></a><span face="'Google Sans',sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> </span><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">by using a combination of</span><span face="'Google Sans',sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> </span><span face="'Google Sans',sans-serif" style="color: #188038; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">MessageClient</span><span face="'Google Sans',sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> </span><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">to set up the process, then</span><span face="'Google Sans',sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> </span><span face="'Google Sans',sans-serif" style="color: #188038; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">ChannelClient</span><span face="'Google Sans',sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> </span><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">to stream the APK.</span></p><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 16pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: #434343; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Installing the watch face on the watch</span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Once the watch face is received on the Wear OS device, the Androidify app uses the new </span><a href="https://developer.android.com/training/wearables/watch-face-push" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Watch Face Push API</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to install the watch face:<br /><br /></span></p>
<div style="background-color: whitesmoke; border-radius: 8px; padding: 16px;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">val</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">wfpManager</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">=</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> WatchFacePushManagerFactory.createWatchFacePushManager(context)</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">val</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">response</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">=</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">wfpManager.listWatchFaces()</span></p><p><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">try</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">if</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(response.remainingSlotCount</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">></span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #c5221f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">0</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">)</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">wfpManager.addWatchFace(apkFd,</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">token)</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">else</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">val</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">slotId</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">=</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">response.installedWatchFaceDetails.first().slotId</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">wfpManager.updateWatchFace(slotId,</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">apkFd,</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">token)</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">catch</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(a:</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">WatchFacePushManager.AddWatchFaceException)</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">return</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">WatchFaceInstallError.WATCH_FACE_INSTALL_ERROR</span></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">catch</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(u:</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">WatchFacePushManager.UpdateWatchFaceException)</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">return</span><span style="background-color: transparent; color: black; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">WatchFaceInstallError.WATCH_FACE_INSTALL_ERROR</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></p></div>
<p><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Androidify uses either the </span><span face="'Google Sans',sans-serif" style="color: #188038; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">addWatchFace</span><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> or </span><span face="'Google Sans',sans-serif" style="color: #188038; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">updateWatchFace</span><span face="'Google Sans',sans-serif" style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> method, depending on the scenario: Watch Face Push defines a concept of “slots” - how many watch faces a given app can have installed at any time. For Wear OS 6, this value is in fact 1.</span></p><p><span style="color: #666666;">Androidify’s approach is to install the watch face if there is a free slot, and if not, any existing watch face is swapped out for the new one.</span></p><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 16pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #434343; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Setting the active watch face</span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Installing the watch face programmatically is a great step, but Androidify seeks to ensure the watch face is also the active watch face. </span></p><p><span style="color: #666666;">Watch Face Push introduces a new runtime permission which must be granted in order for apps to be able to achieve this:</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="background-color: transparent; color: #188038; font-family: 'Roboto Mono',monospace; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">com.google.wear.permission.SET_PUSHED_WATCH_FACE_AS_ACTIVE<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Once this permission has been acquired, the </span><span style="background-color: transparent; color: #188038; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">wfpManager.setWatchFaceAsActive()</span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> method can be called, to set an installed watch face to being the active watch face.</span></p><p><span style="color: #666666;">However, there are a number of considerations that Androidify has to navigate:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: #666666; font-family: "Google Sans", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #188038; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">setWatchFaceAsActive</span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> can only be used once.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #666666; font-family: "Google Sans", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #188038; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">SET_PUSHED_WATCH_FACE_AS_ACTIVE</span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> cannot be re-requested after being denied by the user.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #666666; font-family: "Google Sans", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Androidify might already be in control of the active watch face.<br /><br /></span></p></li></ul><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">For more details see how Androidify </span><a href="https://github.com/android/androidify/blob/main/wear/src/main/java/com/android/developers/androidify/watchfacepush/WatchFaceOnboardingRepository.kt#L58" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">implements the set active logic</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.</span></p><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 16pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #434343; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Get started with Watch Face Push for Wear OS</span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Watch Face Push is a versatile API, equally suited to enhancing Androidify as it is to building fully-featured watch face marketplaces.<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Perhaps you have an existing phone app and are looking for opportunities to further engage and delight your users?</span></p><p><span style="color: #666666;">Or perhaps you’re an existing watch face developer looking to create your own community and gallery through releasing a marketplace app?</span></p><p><span style="color: #666666;">Take a look at these resources:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: #666666; font-family: "Google Sans", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/training/wearables/watch-face-push" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Watch Face Push</span></a></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #666666; font-family: "Google Sans", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;">
<p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/training/wearables/wff" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Watch Face Format</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> - Note also the </span><a href="https://android-developers.googleblog.com/2025/06/upcoming-changes-to-wear-os-watch-faces.html" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">upcoming policy changes relating to watch face publishing</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #666666; font-family: "Google Sans", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://android-developers.googleblog.com/2025/08/introducing-watch-face-designer.html" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Watch Face Designer</span></a></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #666666; font-family: "Google Sans", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://github.com/android/androidify" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Androidify GitHub repository</span></a></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #666666; font-family: "Google Sans", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://play.google.com/store/apps/details?id=com.android.developers.androidify" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Androidify Play Store listing</span></a><br /><br /></p></li></ul><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-b3b3ac9d-7fff-d14e-8f46-b978556ef7c7"><span style="font-family: inherit;"><span style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">And also check out the </span><a href="https://www.youtube.com/watch?v=JgsPXZIKInw&feature=youtu.be" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">accompanying video</span></a><span style="color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for a greater-depth look at how we brought Androidify to Wear OS!</span></span></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">We’re looking forward to what you’ll create with Watch Face Push!</span></p><p></p>Birnahttp://www.blogger.com/profile/04044883525253664551[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-8902856503102116852025-12-17T09:00:00.000-08:002025-12-17T09:00:00.121-08:00Brighten Your Real-Time Camera Feeds with Low Light Boost<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAbBg8AgZ1u4-UhY1YXzaou5PDAv6JVfg-kT-x-N8e441oG33DXsPAZkSuQJKfWzzIlg5SbXwwrUl0TnvgOWY25G-gDsBJpuxuGC61yFwS7OciC_smnfCxMecg3wP9JO1LLRZfBRgdYHSuTLLjA98hVQHXFmg4EW7pcdx8AS_O5dVWY5xFyy7ajlPCR1s/s1600/INSTA_heroscreen001.jpg" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAbBg8AgZ1u4-UhY1YXzaou5PDAv6JVfg-kT-x-N8e441oG33DXsPAZkSuQJKfWzzIlg5SbXwwrUl0TnvgOWY25G-gDsBJpuxuGC61yFwS7OciC_smnfCxMecg3wP9JO1LLRZfBRgdYHSuTLLjA98hVQHXFmg4EW7pcdx8AS_O5dVWY5xFyy7ajlPCR1s/s1600/INSTA_heroscreen001.jpg" style="display: none;" />
<name content="IMG" twitter:image=""><span style="font-family: inherit;"><i>Posted by Donovan McMurray, Developer Relations Engineer</i></span></name><div><name content="IMG" twitter:image=""><span style="font-family: inherit;"><p></p></span></name><div><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit;"></span></p><div class="separator" style="clear: both; text-align: center;"><span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZORKbmXhndVB6WPsCnULRvt9Y_vRJnjYL__KJftM8VPw4Y7bXA5iraMXpIKvYKOcNe4JQSC-JR8gPs1feEtJnxE7rqN5JiASwtu42zk0su2RPZnO1ijpN-hL3pnJQgxQOgoid_EmPPQyVuMeZAxfn22PgPQDa9PIIeEZKyKX3ZBiftcxq2RCO_BnUrsc/s640/INSTA_heroscreen001_edit.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="360" data-original-width="640" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZORKbmXhndVB6WPsCnULRvt9Y_vRJnjYL__KJftM8VPw4Y7bXA5iraMXpIKvYKOcNe4JQSC-JR8gPs1feEtJnxE7rqN5JiASwtu42zk0su2RPZnO1ijpN-hL3pnJQgxQOgoid_EmPPQyVuMeZAxfn22PgPQDa9PIIeEZKyKX3ZBiftcxq2RCO_BnUrsc/w755-h424/INSTA_heroscreen001_edit.gif" width="755" /></a></span></div>We rec<span style="font-family: inherit;"><span face=""Google Sans", sans-serif"><span style="font-family: inherit;"><span style="white-space-collapse: preserve;">ently shared</span></span></span><a href="https://android-developers.googleblog.com/2024/12/instagram-on-android-low-light-photos.html" style="font-family: inherit; text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">how Instagram enabled users to take stunning low light photos</span></a><span face=""Google Sans", sans-serif" style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> using Night Mode. That feature is perfect for still images, where there’s time to combine multiple exposures to create a high-quality static shot. But what about the moments that happen </span><span face=""Google Sans", sans-serif" style="font-family: inherit; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">between</span><span face=""Google Sans", sans-serif" style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> the photos? Users need to interact with the camera more than just the moment the shutter button is pressed. They also use the preview to compose their scene or scan QR codes.</span></span><p></p><span id="docs-internal-guid-df9acb7e-7fff-8262-43c0-f4e43b824aea" style="font-family: inherit;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Today, we’re diving into </span><a href="https://developer.android.com/media/camera/lowlight" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Low Light Boost (LLB)</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, a powerful feature designed to brighten real-time camera streams. Unlike Night Mode, which requires a hold-still capture duration, Low Light Boost works instantaneously on your live preview and video recordings. LLB automatically adjusts how much brightening is needed based on available light, so it’s optimized for every environment.</span></p></span><span style="font-family: inherit;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">With a recent update, LLB allows Instagram users to line up the perfect shot, and then their existing Night Mode implementation results in the same high quality low-light photos their users have been enjoying for over a year.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 18pt;"><span face=""Google Sans", sans-serif" style="font-size: 17pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Why Real-time Brightness Matters</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">While Night Mode aims to improve final image quality, Low Light Boost is intended for usability and interactivity in dark environments. Another important factor to consider is that – even though they work together very well – you can use LLB and Night Mode independently, and you’ll see with some of these use cases, LLB has value on its own when Night Mode photos aren’t needed. Here is how LLB improves the user experience:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Better Framing & Capture:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> In dimly lit scenes, a standard camera preview can be pitch black. LLB brightens the viewfinder, allowing users to actually see what they are framing before they hit the shutter button. For this experience, you can use Night Mode for the best quality low-light photo result, or you can let LLB give the user a “what you see is what you get” photo result.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Reliable Scanning:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> QR codes are ubiquitous, but scanning them in a dark restaurant or parking garage is often frustrating. With a significantly brighter camera feed, scanning algorithms can reliably detect and decode QR codes even in very dim environments.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Enhanced Interactions:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> For apps involving live video interactions (like AI assistants or video calls) LLB increases the amount of perceivable information, ensuring the computer vision models have enough data to work with</span></p></li></ul><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 18pt;"><span face=""Google Sans", sans-serif" style="font-size: 17pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The Difference in Instagram</span></h2><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><div><span style="font-family: inherit;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3ddp3U6c4jytxJDX8W47ba1xAFk_ntUUywuebitEwzYSZGkNMenkvIyBwR20gWnvKGJ-Q2ZG5ne98yU6L6D3B2t003C7xFj4U935Qnr3cgwtD9_kskx1s6qhfVReBklbJTZYY94srOjwLOtcbt9ThdbAGLnmGU5k3wlRy6ufvAgiM5lmsfZmmdky3KdU/s1347/LLB_IG_demo_white_background.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1347" data-original-width="641" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3ddp3U6c4jytxJDX8W47ba1xAFk_ntUUywuebitEwzYSZGkNMenkvIyBwR20gWnvKGJ-Q2ZG5ne98yU6L6D3B2t003C7xFj4U935Qnr3cgwtD9_kskx1s6qhfVReBklbJTZYY94srOjwLOtcbt9ThdbAGLnmGU5k3wlRy6ufvAgiM5lmsfZmmdky3KdU/w190-h400/LLB_IG_demo_white_background.gif" width="190" /></a></div></span></div><div><span style="font-family: inherit;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></span></div>The engineering team behind the Android Instagram app is always hard at work to provide a state-of-the-art camera experience for their users. You can see in the above example just what a difference LLB makes on a Pixel 10 Pro. </span><p></p><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQw81gj59jUUh0t2Z6mi_NgwIic4OX-18Xc5f5UyK9Wic6jl5ufOrh3v2OKHKstvSxheCJ3STpcATAsHKf5HrKQ2RWefYHWl0FJxhH733AWPdMbo0mH_BnPJ8O1uzHNahBW7P5a7nM2Plea8pN2kN1oDywf0DOwN_BuvMM4JevFjSXntpUl5-Kv1F9p8Y/s1280/INSTA_casestudy03%20(1).png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQw81gj59jUUh0t2Z6mi_NgwIic4OX-18Xc5f5UyK9Wic6jl5ufOrh3v2OKHKstvSxheCJ3STpcATAsHKf5HrKQ2RWefYHWl0FJxhH733AWPdMbo0mH_BnPJ8O1uzHNahBW7P5a7nM2Plea8pN2kN1oDywf0DOwN_BuvMM4JevFjSXntpUl5-Kv1F9p8Y/s16000/INSTA_casestudy03%20(1).png" /></a></div><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">It’s easy to imagine the difference this makes in the user experience. If users aren’t able to see what they’re capturing, then there’s a higher chance they’ll abandon the capture. </span></p><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC1bRfeBIN_Tc-HQNBqQuTQI4voRfl-tQx-wUzE_KP2iNtUX_hCeWQey069g6ZYM2GrmTbhbmpdcBWCIT3ZZST_XKgVfGw45ZHUlwRE0dCqYgsCiH6iHg7x57OEdTmSGvGOWA21Jny-Sxp49E4bUDaR27SjhCEmQA4uqu6gqeUJSHj0mLmxIYjPxkVzY8/s1280/INSTA_casestudy04.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC1bRfeBIN_Tc-HQNBqQuTQI4voRfl-tQx-wUzE_KP2iNtUX_hCeWQey069g6ZYM2GrmTbhbmpdcBWCIT3ZZST_XKgVfGw45ZHUlwRE0dCqYgsCiH6iHg7x57OEdTmSGvGOWA21Jny-Sxp49E4bUDaR27SjhCEmQA4uqu6gqeUJSHj0mLmxIYjPxkVzY8/s16000/INSTA_casestudy04.png" /></a></div><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><br /><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 18pt;"><span face=""Google Sans", sans-serif" style="font-size: 17pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Choosing Your Implementation</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">There are two ways to implement Low Light Boost to provide the best experience across the widest range of devices:</span></p><ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Low Light Boost AE Mode:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> This is a hardware-layer auto-exposure mode. It offers the highest quality and performance because it fine-tunes the Image Signal Processor (ISP) pipeline directly. </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Always check for this first.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Google Low Light Boost:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> If the device doesn't support the AE mode, you can fall back to this software-based solution provided by Google Play services. It applies post-processing to the camera stream to brighten it. As an all-software solution, it is available on more devices, so this implementation helps you reach more devices with LLB.</span></p></li></ol><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="color: #434343; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Low Light Boost AE Mode (Hardware)</span></h3><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Mechanism:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This mode is supported on devices running Android 15 and newer and requires the OEM to have implemented the support in HAL (currently available on Pixel 10 devices). It integrates directly with the camera's Image Signal Processor (ISP). If you set </span><a href="https://developer.android.com/reference/android/hardware/camera2/CaptureRequest#CONTROL_AE_MODE" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">CaptureRequest.CONTROL_AE_MODE</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to </span><a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata#CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, the camera system takes control.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Behavior:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The HAL/ISP analyzes the scene and adjusts sensor and processing parameters, often including increasing exposure time, to brighten the image. </span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This can yield frames with a significantly improved signal-to-noise ratio (SNR) because the extended exposure time, rather than an increase in digital sensor gain (ISO), allows the sensor to capture more light information.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Advantage:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Potentially better image quality and power efficiency as it leverages dedicated hardware pathways.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Trade off:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">May result in a lower frame rate in very dark conditions as the sensor needs more time to capture light. The frame rate can drop to as low as 10 FPS in very low light conditions.</span></p><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Arial, sans-serif" style="color: #434343; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Google Low Light Boost (Software via Google Play Services)</span></h3><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Mechanism:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This solution, distributed as an </span><a href="https://developers.google.com/android/reference/com/google/android/gms/cameralowlight/package-summary" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">optional module via Google Play services</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, applies post-processing to the camera stream. It uses a sophisticated realtime image enhancement technology called HDRNet.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Google HDRNet:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This deep learning model analyzes the image at a lower resolution to predict a compact set of parameters (a bilateral grid). This grid then guides the efficient, spatially-varying enhancement of the full-resolution image on the GPU. The model is trained to brighten and improve image quality in low-light conditions, with a focus on face visibility.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Process Orchestration:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The HDRNet model and its accompanying logic are orchestrated by the Low Light Boost processor. This includes:</span></p><ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Scene Analysis:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"><br /></span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">A custom calculator that estimates the true scene brightness using camera metadata (sensor sensitivity, exposure time, etc.) and image content. This analysis determines the boost level.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">HDRNet Processing:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"><br /></span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Applies the HDRNet model to brighten the frame. The model used is tuned for low light scenes and optimized for realtime performance.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Blending:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"><br /></span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">The original and HDRNet processed frames are blended. The amount of blending applied is dynamically controlled by the scene brightness calculator, ensuring a smooth transition between boosted and unboosted states.</span></p></li></ol><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSmXesOzDn3OO1qKbgX9wD43qsefK5spwgRvT3P8dJk18DCcwEEYn2YBCuUtSw1065dnKxBhg0fbHJ2H3WQ3PbQP0xCkccX7C8V_v-VccbmCTI-aMNFB6xxv8IieU-nZxFRXTIpID_pHQKn84ovSxXwXbL9hBmQagecLRkvYtkyXlMZEBFy6f-XeyhBq0/s5552/low-light-boost-processor-diagram.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2513" data-original-width="5552" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSmXesOzDn3OO1qKbgX9wD43qsefK5spwgRvT3P8dJk18DCcwEEYn2YBCuUtSw1065dnKxBhg0fbHJ2H3WQ3PbQP0xCkccX7C8V_v-VccbmCTI-aMNFB6xxv8IieU-nZxFRXTIpID_pHQKn84ovSxXwXbL9hBmQagecLRkvYtkyXlMZEBFy6f-XeyhBq0/s16000/low-light-boost-processor-diagram.png" /></a></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Advantage:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Works on a broader range of devices (currently supports Samsung S22 Ultra, S23 Ultra, S24 Ultra, S25 Ultra, and Pixel 6 through Pixel 9) without requiring specific HAL support. Maintains the camera's frame rate as it's a post-processing effect.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Trade-off:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">As a post-processing method, the quality is limited by the information present in the frames delivered by the sensor. It cannot recover details lost due to extreme darkness at the sensor level.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">By offering both hardware and software pathways, Low Light Boost provides a scalable solution to enhance low-light camera performance across the Android ecosystem. Developers should prioritize the AE mode where available and use the Google Low Light Boost as a robust fallback.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 18pt;"><span face=""Google Sans", sans-serif" style="font-size: 17pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Implementing Low Light Boost in Your App</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Now let’s look at how to implement both LLB offerings. You can implement the following whether you use CameraX or Camera2 in your app. For the best results, we recommend implementing both Step 1 and Step 2.</span></p><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 16pt;"><span face="Arial, sans-serif" style="color: #434343; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Step 1: Low Light Boost AE Mode</span></h3><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Available on select devices running Android 15 and higher, LLB AE Mode functions as a specific Auto-Exposure (AE) mode.</span></p><h4 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt;"><span face="Arial, sans-serif" style="color: #666666; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">1. Check for Availability</span></h4><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">First, check if the camera device supports LLB AE Mode.</span></p><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: blue;">val</span> cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
<span style="color: blue;">val</span> isLlbSupported = cameraInfo.isLowLightBoostSupported</pre><br /><h4 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt;"><span face="Arial, sans-serif" style="color: #666666; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">2. Enable the Mode</span></h4><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If supported, you can enable LLB AE Mode using CameraX’s CameraControl object.</span></p><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: green;">// After setting up your camera, use the CameraInfo object to enable LLB AE Mode.</span>
camera = cameraProvider.bindToLifecycle(...)
<span style="color: blue;">if</span> (isLlbSupported) {
<span style="color: blue;">try</span> {
<span style="color: green;">// The .await() extension suspends the coroutine until the</span>
<span style="color: green;">// ListenableFuture completes. If the operation fails, it throws</span>
<span style="color: green;">// an exception which we catch below.</span>
camera?.cameraControl.enableLowLightBoostAsync(<span style="color: blue;">true</span>).await()
} <span style="color: blue;">catch</span> (e: IllegalStateException) {
Log.e(TAG, <span style="color: #a31515;">"Failed to enable low light boost: not available on this device or with the current camera configuration"</span>, e)
} <span style="color: blue;">catch</span> (e: CameraControl.OperationCanceledException) {
Log.e(TAG, <span style="color: #a31515;">"Failed to enable low light boost: camera is closed or value has changed"</span>, e)
}
}</pre><h4 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt;"><span face="Arial, sans-serif" style="color: #666666; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">3. Monitor the State</span></h4><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Just because you requested the mode doesn't mean it's currently "boosting." The system only activates the boost when the scene is actually dark. You can set up an </span><a href="https://developer.android.com/reference/androidx/lifecycle/Observer" style="text-decoration-line: none;"><span face="Roboto, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Observer</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to update your UI (like showing a moon icon) or convert to a Flow using the extension function asFlow().</span></p><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: blue;">if</span> (isLlbSupported) {
camera?.cameraInfo.lowLightBoostState.asFlow().collectLatest { state ->
<span style="color: green;">// Update UI accordingly</span>
updateMoonIcon(state == LowLightBoostState.ACTIVE)
}
}</pre><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">You can read the full guide on</span><a href="https://developer.android.com/media/camera/lowlight/low-light-boost-ae" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Low Light Boost AE Mode here</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 16pt;"><span face="Arial, sans-serif" style="color: #434343; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Step 2: Google Low Light Boost</span></h3><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For devices that don't support the hardware AE mode, Google Low Light Boost acts as a powerful fallback. It uses a </span><span style="color: #188038; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">LowLightBoostSession</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to intercept and brighten the stream.</span></p><h4 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt;"><span face="Arial, sans-serif" style="color: #666666; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">1. Add Dependencies</span></h4><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This feature is delivered via Google Play services.</span></p><pre style="color: #333333; line-height: 16.25px; margin: 0px;">implementation(<span style="color: #a31515;">"com.google.android.gms:play-services-camera-low-light-boost:16.0.1-beta06"</span>)
<span style="color: green;">// Add coroutines-play-services to simplify Task APIs</span>
implementation(<span style="color: #a31515;">"org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2"</span>)</pre><h4 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt;"><span face="Arial, sans-serif" style="color: #666666; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">2. Initialize the Client</span></h4><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Before starting your camera, use the </span><span style="color: #188038; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">LowLightBoostClient</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to ensure the module is installed and the device is supported.</span></p><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: blue;">val</span> llbClient = LowLightBoost.getClient(context)
<span style="color: green;">// Check support and install if necessary</span>
<span style="color: blue;">val</span> isSupported = llbClient.isCameraSupported(cameraId).await()
<span style="color: blue;">val</span> isInstalled = llbClient.isModuleInstalled().await()
<span style="color: blue;">if</span> (isSupported && !isInstalled) {
<span style="color: green;">// Trigger installation</span>
llbClient.installModule(installCallback).await()
}</pre><h4 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt;"><span face="Arial, sans-serif" style="color: #666666; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">3. Create a LLB Session</span></h4><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Google LLB processes each frame, so you must give your display Surface to the </span><span style="color: #188038; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">LowLightBoostSession</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and it gives you back a Surface that has the brightening applied. For Camera2 apps, you can add the resulting Surface with </span><a href="https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.Builder#addTarget(android.view.Surface)" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">CaptureRequest.Builder.addTarget()</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. For CameraX, this processing pipeline aligns best with the </span><a href="https://developer.android.com/reference/androidx/camera/core/CameraEffect#CameraEffect(int,java.util.concurrent.Executor,androidx.camera.core.SurfaceProcessor,androidx.core.util.Consumer%3Cjava.lang.Throwable%3E)" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">CameraEffect</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> class, where you can apply the effect with a </span><a href="https://developer.android.com/reference/androidx/camera/core/SurfaceProcessor" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">SurfaceProcessor</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and provide it back to your Preview with a </span><a href="https://developer.android.com/reference/androidx/camera/core/Preview.SurfaceProvider" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">SurfaceProvider</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, as seen in this code.</span></p><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: green;">// With a SurfaceOutput from SurfaceProcessor.onSurfaceOutput() and a</span>
<span style="color: green;">// SurfaceRequest from Preview.SurfaceProvider.onSurfaceRequested(),</span>
<span style="color: green;">// create a LLB Session.</span>
<span style="color: blue;">suspend</span> <span style="color: blue;">fun</span> createLlbSession(surfaceRequest: SurfaceRequest, outputSurfaceForLlb: Surface) {
<span style="color: green;">// 1. Create the LLB Session configuration</span>
<span style="color: blue;">val</span> options = LowLightBoostOptions(
outputSurfaceForLlb,
cameraId,
surfaceRequest.resolution.width,
surfaceRequest.resolution.height,
<span style="color: blue;">true</span> <span style="color: green;">// Start enabled</span>
)
<span style="color: green;">// 2. Create the session.</span>
<span style="color: blue;">val</span> llbSession = llbClient.createSession(options, callback).await()
<span style="color: green;">// 3. Get the surface to use.</span>
<span style="color: blue;">val</span> llbInputSurface = llbSession.getCameraSurface()
<span style="color: green;">// 4. Provide the surface to the CameraX Preview UseCase.</span>
surfaceRequest.provideSurface(llbInputSurface, executor, resultListener)
<span style="color: green;">// 5. Set the scene detector callback to monitor how much boost is being applied.</span>
<span style="color: blue;">val</span> onSceneBrightnessChanged = <span style="color: blue;">object</span> : <span style="color: #2b91af;">SceneDetectorCallback</span> {
<span style="color: blue;">override</span> <span style="color: blue;">fun</span> onSceneBrightnessChanged(
session: LowLightBoostSession,
boostStrength: <span style="color: #2b91af;">Float</span>
) {
<span style="color: green;">// Monitor the boostStrength from 0 (no boosting) to 1 (maximum boosting)</span>
}
}
llbSession.setSceneDetectorCallback(onSceneBrightnessChanged, <span style="color: blue;">null</span>)
}</pre><h4 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 14pt;"><span face="Arial, sans-serif" style="color: #666666; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">4. Pass in the Metadata</span></h4><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For the algorithm to work, it needs to analyze the camera's auto-exposure state. You must pass capture results back to the LLB session. In CameraX, this can be done by extending your Preview.Builder with </span><a href="https://developer.android.com/reference/androidx/camera/camera2/interop/Camera2Interop.Extender#setSessionCaptureCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback)" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Camera2Interop.Extender.setSessionCaptureCallback()</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><pre style="color: #333333; line-height: 16.25px; margin: 0px;">Camera2Interop.Extender(previewBuilder).setSessionCaptureCallback(
<span style="color: blue;">object</span> : <span style="color: #2b91af;">CameraCaptureSession</span>.CaptureCallback() {
<span style="color: blue;">override</span> <span style="color: blue;">fun</span> onCaptureCompleted(
session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult
) {
<span style="color: blue;">super</span>.onCaptureCompleted(session, request, result)
llbSession?.processCaptureResult(result)
}
}
)</pre><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Detailed implementation steps for the client and session can be found in the</span><a href="https://developer.android.com/media/camera/lowlight/low-light-boost-gp" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Google Low Light Boost guide</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 4pt; margin-top: 18pt;"><span face=""Google Sans", sans-serif" style="font-size: 17pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Next Steps</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">By implementing these two options, you ensure that your users can see clearly, scan reliably, and interact effectively, regardless of the lighting conditions.</span></p><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To see these features in action within a complete, production-ready codebase, check out the</span><a href="https://github.com/google/jetpack-camera-app" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Jetpack Camera App</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> on GitHub. It implements both </span><a href="https://github.com/google/jetpack-camera-app/blob/86f89d814ae5076b33a594e9b8f453020da0ed8a/core/camera/src/main/java/com/google/jetpackcamera/core/camera/CameraSession.kt#L460" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">LLB AE Mode</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and </span><a href="https://github.com/google/jetpack-camera-app/blob/86f89d814ae5076b33a594e9b8f453020da0ed8a/core/camera/src/main/java/com/google/jetpackcamera/core/camera/CameraSession.kt#L184" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Google LLB</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, giving you a reference for your own integration. </span></span><br /></div></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-83958228929508959872025-12-17T08:13:00.000-08:002025-12-17T08:13:57.214-08:00Build smarter apps with Gemini 3 Flash<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifgw519Ei-lkJ0Jtu7uGhEmVb916T4upwlxn-4y6VaxCU-VSaa6Y8rBg5yTpNojuYa3SE6PNkrWFQAFHGPJH8muLRPguQEmUbidkEVz-Mktkx2o68rGAD78wwgNpJsmgFqLZUTXQfcbY3VTFYVykA1JJETlkBZCPd-C0vOtPNt45zrXkpXzETYkyGNHv0/s1600/Gemini%203%20flash%20meta%20%281%29.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifgw519Ei-lkJ0Jtu7uGhEmVb916T4upwlxn-4y6VaxCU-VSaa6Y8rBg5yTpNojuYa3SE6PNkrWFQAFHGPJH8muLRPguQEmUbidkEVz-Mktkx2o68rGAD78wwgNpJsmgFqLZUTXQfcbY3VTFYVykA1JJETlkBZCPd-C0vOtPNt45zrXkpXzETYkyGNHv0/s1600/Gemini%203%20flash%20meta%20%281%29.png" style="display: none;" />
<i> Posted by Thomas Ezan, Senior Developer Relations Engineer</i><div><i><br /></i></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKIZwYOZT8RUx3xDA-KuWD25Omlr7a1UIMgJr5Hi6gz5utjjWHao36IqvC-3zkGZu5cR7VTUJo1VeRK0h5nWTJJ7PlCMFBHqWFFZHshdZO-T0YgUkk1OS_OA4xXGCZ5QluqDOzXFJHAVNym7LHbVA9rvbfkhyphenhyphenh2eNaCp4UQzpeKvADmncykgfQvT7HdNM/s8418/Gemini%203%20Flash%20-%20Android%20(1).png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="2506" data-original-width="8418" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKIZwYOZT8RUx3xDA-KuWD25Omlr7a1UIMgJr5Hi6gz5utjjWHao36IqvC-3zkGZu5cR7VTUJo1VeRK0h5nWTJJ7PlCMFBHqWFFZHshdZO-T0YgUkk1OS_OA4xXGCZ5QluqDOzXFJHAVNym7LHbVA9rvbfkhyphenhyphenh2eNaCp4UQzpeKvADmncykgfQvT7HdNM/s16000/Gemini%203%20Flash%20-%20Android%20(1).png" /></a></div><br /><i><br /></i></div><div><span id="docs-internal-guid-64b9d689-7fff-9d86-1319-b6f16cd688f9"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Today, we're expanding the Gemini 3 model family with the </span><a href="https://blog.google/products/gemini/gemini-3-flash" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">release of Gemini 3 Flash</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, frontier intelligence built for speed at a fraction of the cost. </span><span style="background-color: white; color: #303030; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">You can start building with it immediately, as we’re officially launching </span><span style="background-color: white; color: #303030; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Gemini 3 Flash</span><span style="background-color: white; color: #303030; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> on </span><a href="https://firebase.google.com/docs/ai-logic/get-started?platform=android&api=dev" style="text-decoration-line: none;"><span style="background-color: white; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Firebase AI Logic</span></a><span style="background-color: white; color: #303030; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Available globally, you </span><a href="https://blog.google/technology/developers/build-with-gemini-3-flash/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">can securely access the Gemini 3 Flash preview model </span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">directly from your app via the Gemini Developer API or the Vertex AI Gemini API using Firebase AI Logic client SDKs. Gemini 3 Flash’s strong performance in reasoning, tool use, and multimodal capabilities is ideal for developers looking to do more complex video analysis, data extraction and visual Q&A.</span></span></span><br /><h3 style="text-align: left;">Gemini 3 optimized for low-latency</h3></div>Gemini 3 is our most intelligent model family to date. With the launch of Gemini 3 Flash, we are making that intelligence more accessible for low-latency and cost-effective use cases. While Gemini 3 Pro is designed for complex reasoning, Gemini 3 Flash is engineered to be significantly faster and more cost-effective for your production apps.<div><h3 style="text-align: left;">Seamless integration with Firebase AI Logic</h3>Just like the Pro model, Gemini 3 Flash is available in preview directly through the <a href="https://firebase.google.com/docs/ai-logic/get-started?platform=android&api=dev">Firebase AI Logic SDK</a>. This means you can integrate it into your Android app without needing to do any complex server side setup.<br /><br />Here is how to add it to your Kotlin code:<span><div><span><br /></span></div><pre style="color: #333333; line-height: 16.25px; margin: 0px;">val model = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativeModel(
modelName = <span style="color: #a31515;">"gemini-3-flash-preview"</span>)</pre></span><h3 style="text-align: left;">Scale with Confidence</h3>In addition, Firebase enables you to keep your growth secure and manageable with:<br /><h3 style="text-align: left;">AI Monitoring</h3>The <a href="https://firebase.google.com/docs/ai-logic/monitoring#ai-monitoring-in-console">Firebase AI monitoring</a> dashboard gives you visibility into latency, success rates, and costs, allowing you to slice data by model name to see exactly how the model performs.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB_0mQDSBAvVY6NKp5oK7CP-g53XF7q6WlkAZIVwoXQbsi7M9XRT469UJjwxwjPZpnuXwtpu-Yi_uY7BHQ7x3qALCYVftQBLYgVSWHOjzwixmyyCEyZe5GjkhrDfczdxcuLEDJmkHwV23Vl0VBObc8wq-TpgXN-l7hig77J1ZLIy24eUPgQUUIn15bSvc/s1919/ailogic-monitoring-demo.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1919" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB_0mQDSBAvVY6NKp5oK7CP-g53XF7q6WlkAZIVwoXQbsi7M9XRT469UJjwxwjPZpnuXwtpu-Yi_uY7BHQ7x3qALCYVftQBLYgVSWHOjzwixmyyCEyZe5GjkhrDfczdxcuLEDJmkHwV23Vl0VBObc8wq-TpgXN-l7hig77J1ZLIy24eUPgQUUIn15bSvc/s16000/ailogic-monitoring-demo.gif" /></a></div><br /><div><br /></div><div><h3 style="text-align: left;">Server Prompt Templates</h3>You can use <a href="https://firebase.blog/posts/2025/12/server-prompt-templates-ai-logic">server prompt templates</a> to store your prompt and schema securely on Firebase servers instead of hardcoding them in your app binary. This capability ensures your sensitive prompts remain secure, prevents unauthorized prompt extraction, and allows for faster iteration without requiring app updates.<pre style="line-height: 16.25px; margin: 0px;"><span><span style="color: #38761d;">---
model: 'gemini-3-flash-preview'
input:
schema:
topic:
type: 'string'
minLength: 2
maxLength: 40
length:
type: 'number'
minimum: 1
maximum: 200
language:
type: 'string'
</span></span><span><span style="color: #38761d;">---
{{role "system"}}
You'</span></span><span><span style="color: #38761d;">re a storyteller that tells nice and joyful stories with happy endings.
{{role "user"}}
Create a story about {{topic}} with the length of {{length}} words in the {{language}} language.</span></span></pre><span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Prompt template defined on the Firebase Console </span></p><br /><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: blue;">val</span> generativeModel = Firebase.ai.templateGenerativeModel()
<span style="color: blue;">val</span> response = generativeModel.generateContent(<span style="color: #a31515;">"storyteller-v10"</span>,
mapOf(
<span style="color: #a31515;">"topic"</span> to topic,
<span style="color: #a31515;">"length"</span> to length,
<span style="color: #a31515;">"language"</span> to language
)
)
_output.value = response.text</pre><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Code snippet to access to the prompt template</span></p></span><h3 style="text-align: left;">Gemini 3 Flash for AI development assistance in Android Studio</h3>Gemini 3 Flash is also available for <a href="http://d.android.com/gemini-in-android">AI assistance in Android Studio</a>. While <a href="https://android-developers.googleblog.com/2025/11/gemini-3-is-now-available-for-ai.html">Gemini 3 Pro Preview is our best model for coding and agentic experiences</a>, Gemini 3 Flash is engineered for speed, and great for common development tasks and questions.</div><div> <br />The new model is rolling out to developers using Gemini in Android Studio at no-cost (default model) starting today. For higher usage rate limits and longer sessions with Agent Mode, you can <a href="https://developer.android.com/studio/gemini/add-api-key">use an AI Studio API key</a> to leverage the full capabilities of either Gemini 3 Flash or Gemini 3 Pro. We’re also rolling out Gemini 3 model family access with higher usage rate limits to developers who have Gemini Code Assist Standard or Enterprise licenses. Your<a href="https://developers.google.com/gemini-code-assist/docs/configure-release-channels"> IT administrator will need to enable access</a> to preview models through the Google Cloud console.<h3 style="text-align: left;">Get Started Today</h3>You can start experimenting with Gemini 3 Flash via Firebase AI Logic today. Learn more about it in the <a href="https://d.android.com/ai/gemini">Android</a> and <a href="https://firebase.google.com/docs/ai-logic/get-started?api=dev">Firebase documentation</a>. Try out any of the new Gemini 3 models in Android Studio for development assistance, and let us know what you think! As always you can follow us across <a href="https://www.linkedin.com/showcase/androiddev/posts/?feedView=all">LinkedIn</a>, <a href="https://android-developers.googleblog.com/">Blog</a>, <a href="https://www.youtube.com/user/androiddevelopers"> YouTube</a>, and<a href="https://x.com/AndroidDev"> X</a>. </div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-14442982217366101722025-12-15T09:00:00.001-08:002025-12-15T10:25:46.968-08:00Notes from Google Play: A look back at the tools that powered your growth in 2025<span style="font-family: inherit;"><i>Posted by Sam Bright – VP & GM, Google Play + Developer Ecosystem</i><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS5IZXD8D2tKQrSFw4WxZm6q2Z5MDp4Gf5YD61nnGdt-7RMlXLIDsb03pypZjxs31d0iirhGi2dpV2ccVKhOfJj06CGhQssVkaBjr_jP7sx5RgqUcDPpwirB-Kc2jnqxflJik1UyR8YzoP79ULZfj1-qqDmIdKhtfUlPxfPEdx_6py4tdUKW5TeuRekuQ/s1600/Notes%20Google%20Play%20banners_2_Metacard-1234x802px.jpg" style="display: none;" /></span><div><i><span style="font-family: inherit;"><br /></span></i></div><div><span id="docs-internal-guid-320a391a-7fff-09f3-b161-87b15ef1c9c6" style="font-family: inherit;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p></span><span style="font-family: inherit;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguXnrY0KEG_iy58BSO1AfF5m9OZcPB-04Y9Llj3De3NSmqfPAjPqa5D-jngUo7z3og2wjmKKsimUxT2sbC-zqLjd8_Yn1JEv7aSR_JbFgal8tPO9diAbxGDgw06L7PKgePd9_PxS6n6MdHxDnjKcEiQc8GPNo6_Sy7m1j8lLC4-55jpRqw7mI4NylxGOA/s8769/Notes%20Google%20Play%20banners_2_Banner-4209x1253px.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="2610" data-original-width="8769" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguXnrY0KEG_iy58BSO1AfF5m9OZcPB-04Y9Llj3De3NSmqfPAjPqa5D-jngUo7z3og2wjmKKsimUxT2sbC-zqLjd8_Yn1JEv7aSR_JbFgal8tPO9diAbxGDgw06L7PKgePd9_PxS6n6MdHxDnjKcEiQc8GPNo6_Sy7m1j8lLC4-55jpRqw7mI4NylxGOA/s16000/Notes%20Google%20Play%20banners_2_Banner-4209x1253px.jpg" /></a></div><br /><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Hi everyone,</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Thank you for making 2025 another amazing year for Google Play.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Together, we’ve built Play into something much more than a store—it’s a dynamic ecosystem powered by your creativity. This year, our focus was ensuring Play continues to be the best destination for people to </span><a href="https://android-developers.googleblog.com/2025/05/io-2025-whats-new-in-google-play.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">discover incredible content</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and </span><a href="https://blog.google/products/google-play/curation-update-september-2025/" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">enjoy rewarding gaming experiences</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We're incredibly proud of the progress we've made alongside you, and we’re excited to celebrate those who pushed the boundaries of what’s possible—like the </span><a href="https://blog.google/products/google-play/best-apps-games-2025/" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">winners of our Best of 2025 awards</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Watch our recap video to see how we’ve made Play even more rewarding for your business, or read on for a more in-depth look back on the year.</span></p><br /><div class="separator" style="clear: both; max-width: 100%; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="295" src="https://www.youtube.com/embed/zr5dVXL4dlg" style="max-width: 100%;" width="482" youtube-src-id="zr5dVXL4dlg"></iframe></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><br /><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Evolving Play to be more than a store</span></h3><div><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This year, we focused on evolving Play into a true destination for discovery where billions of people around the world can find and enjoy experiences that make life more productive and delightful.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Making Play the best destination for your games business</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Just a few months ago, we shared our vision for a more </span><a href="https://blog.google/products/google-play/curation-update-september-2025/" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">unified experience that brings more fun to gaming</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Today, players often jump between different platforms to discover, play, and get rewarded. Our goal is to connect these journeys to create the best experience for players and, consequently, grow your business. Our first steps include these key updates:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">A new Gamer Profile</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> that tracks cross-game stats, streaks, and achievements, customizable with a Gen AI Avatar.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-c3d36d10-7fff-9dae-789e-dc10dd19e9bf"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Integrated Rewards</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> across mobile and PC that give players access to VIP experiences like our </span><a href="https://blog.google/products/google-play/comic-con-2025/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Four Days of Fantastic Rewards at San Diego Comic-Con</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">,</span><a href="https://blog.google/products/google-play/comic-con-2025/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;"> </span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> </span><a href="https://blog.google/products/google-play/roblox-diamond-district/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Diamond District experience on Roblox</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">,</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> and </span><a href="https://blog.google/feed/diamond-valley-mini-game/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Play’s own treasure-hunt mini-game Diamond Valley</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> alongside new Play Games Leagues where players can compete in their favorite games, climb leaderboards, and win Play Points rewards.</span></span></span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">The</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">new Play Games Sidekick</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">, a helpful in-game overlay that curates and organizes relevant gaming info, and provides direct access to Gemini Live for real-time AI-powered guidance in the game. We recently rolled out the </span><a href="https://developer.android.com/games/pgs/play-games-sidekick?utm_source=email&utm_medium=newsletter&utm_campaign=Games-december25" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">open beta</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> to developers, and we encourage you to start testing the sidekick in your games and share your feedback.</span></p></li></ul><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Integrated gameplay across devices </span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">is now fully realized as Google Play Games on PC has graduated from beta to general availability, solidifying our commitment to cross-platform play and making our catalog of over 200,000 titles available across mobile and PC.</span></p></li></ul><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiilL3qEOSPxpTt665sGAHDXazEPdqtsKTVIDDs9CdmGIrE727BzZTR0d7irsuIG85ZntxYuIwASJUn9LU829zHwhINqSNGz1IBf_S9GjKDgoWs7MCJQMGiK0MIoLAg6VzxuN_OwJ_Pd_SC4LbZ4h0Ctg523lnEaDjQW6BOFvKFXVq0yqe4i-vpzhE_B_w/s1280/GP_Sidekick_C33_.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiilL3qEOSPxpTt665sGAHDXazEPdqtsKTVIDDs9CdmGIrE727BzZTR0d7irsuIG85ZntxYuIwASJUn9LU829zHwhINqSNGz1IBf_S9GjKDgoWs7MCJQMGiK0MIoLAg6VzxuN_OwJ_Pd_SC4LbZ4h0Ctg523lnEaDjQW6BOFvKFXVq0yqe4i-vpzhE_B_w/s16000/GP_Sidekick_C33_.gif" /></a></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt; text-align: center;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Play Games Sidekick is a new in-game overlay that gives players </span><span style="font-family: inherit; font-style: italic; white-space-collapse: preserve;">instant access to their rewards, offers, and achievements, driving higher engagement for your game.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To help you get the most out of this unified gaming experience, we introduced the </span><a href="https://android-developers.googleblog.com/2025/09/introducing-google-play-games-level-up.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Google Play Games Level Up</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> program, a new way to unlock greater success for your business. For titles that meet core user experience guidelines, you can unlock a powerful suite of benefits including the ability to:</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /><br /></span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Re-engage players on the new You tab, </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">a new personalized destination on the Play Store that is designed to help you re-engage and retain players by showcasing content and rewards from recently played games in one dedicated space. You can utilize engagement tools in Play Console to feature your latest events, offers, and updates.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Maximize your game’s reach</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> with prominent boosts across the store, including featuring opportunities, Play Points boosters and quests, and enhanced visibility on editorial surfaces like the Games Home and Play Points Home.</span></p></li></ul><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL2Z_nMQlj_xFlp1jQVL_5IEgr0qjdd2e3uK1D53yic1pZKys3Q8L98VjxVKy543NcaQFKy5DpKaCQkVN5hRQ9fyO2ikoTBKWNjU3QAnQejmWIipoN8qhnDJKonOsNEF4gd6mlb2RxCLRKIBFqgFYYEtr6E4QIA5MFLFrgpzBF9CIj7sfcSL2TiVXDDtI/s1920/251212_Phone%20gif%2001_v02.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL2Z_nMQlj_xFlp1jQVL_5IEgr0qjdd2e3uK1D53yic1pZKys3Q8L98VjxVKy543NcaQFKy5DpKaCQkVN5hRQ9fyO2ikoTBKWNjU3QAnQejmWIipoN8qhnDJKonOsNEF4gd6mlb2RxCLRKIBFqgFYYEtr6E4QIA5MFLFrgpzBF9CIj7sfcSL2TiVXDDtI/s16000/251212_Phone%20gif%2001_v02.gif" /></a></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">You tab is a personalized destination designed to help you re-engage and </span><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">retain players by showcasing your latest events, offers, and updates.</span><br /></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><span style="display: inline-block; position: relative; width: 100px;"></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Unlocking more discovery and engagement for your apps and its content</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Last year, we shared our vision for a content-rich Google Play that has already delivered strong results. Year-over-year, Apps Home has seen over an 18% increase in average monthly visitors with apps seeing a 9% growth in acquisitions and double-digit growth*</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> in app spend for those monetizing on Google Play. We introduced even more updates to elevate discovery and engagement on and off the store.</span></p><br /><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Curated spaces</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">, launched last year, have been a success, fostering routine engagement by delivering daily, locally relevant content (such as football highlights in Brazil, cricket in India, and comics in Japan) directly to the Apps Home. Building on this, we expanded to new categories and locations, including a </span><a href="https://blog.google/products/google-play/curation-update-september-2025/#:~:text=In%20Korea%2C%20we%E2%80%99re%20launching%20a%20new%20entertainment%2Ddedicated%20space%20in%20the%20Apps%20tab.%20This%20new%20space%20brings%20together%20movies%2C%20TV%20shows%20and%20short%2Dform%20dramas%20optimized%20to%20enjoy%20on%20mobile.%20And%20in%20the%20United%20States%2C%20users%20can%20now%20sample%20short%2Dform%20dramas%2C%20webcomics%20and%20trending%20TV%20and%20movies%20from%20the%20Apps%20tab." style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">new entertainment-focused space in Korea</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">. </span></p></li></ul><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMhN2ypqX5pD5qepIlp23dSEzbkdbzCK11MkzHCP5zPhhQrhKE4YeXAqr1maMCPpatJAcBAQOBgeJGYIFLcPSD7R1maWfVO-oruSCCmDg1ghkwV4R1nL42OvxXomOHb8tzAKLCl17HzYeXiI7qieGoTjr_JvWRCm7NseLPCQpJ3BlxqOheMsWRqhc0TdE/s1920/251209_Three%20phone%20asset_v01.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMhN2ypqX5pD5qepIlp23dSEzbkdbzCK11MkzHCP5zPhhQrhKE4YeXAqr1maMCPpatJAcBAQOBgeJGYIFLcPSD7R1maWfVO-oruSCCmDg1ghkwV4R1nL42OvxXomOHb8tzAKLCl17HzYeXiI7qieGoTjr_JvWRCm7NseLPCQpJ3BlxqOheMsWRqhc0TdE/s16000/251209_Three%20phone%20asset_v01.gif" /></a></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Curated spaces make it easier to find and engage with local interests.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">We significantly increased timely, relevant content on Google Play through </span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Spotlight</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> and </span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">new topic browse pages</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">. Spotlight, located at the top of Apps Home, offers seasonal content feeds—like Taylor Swift’s recent album launch or holiday movie guides—in a new, immersive way to connect users with current cultural moments. Concurrently, new topic browse pages were integrated across the store in the U.S., Japan, and South Korea, allowing content deep dives into over 100,000 shows and movies.</span></p></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6VHIqHmF_akEdtbSUR3MGEzQdgdWbb78O-4sJgUP-CRI3XXUrJjM-c3ibr_d91-r8p9-tcGrKabtxox9ZkNWerzw0aCeM62NN4G1xGE0J6Gtc8l2Zu_Mc3hPacTBU0508gn6ydMGXl-kn1r8MAApgPhDtRmwyeq-DSIu0HcD86LuaFGj2j73Yp_GuWYY/s2561/TaylorSwiftNotesFromGooglePlay.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1282" data-original-width="2561" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6VHIqHmF_akEdtbSUR3MGEzQdgdWbb78O-4sJgUP-CRI3XXUrJjM-c3ibr_d91-r8p9-tcGrKabtxox9ZkNWerzw0aCeM62NN4G1xGE0J6Gtc8l2Zu_Mc3hPacTBU0508gn6ydMGXl-kn1r8MAApgPhDtRmwyeq-DSIu0HcD86LuaFGj2j73Yp_GuWYY/s16000/TaylorSwiftNotesFromGooglePlay.png" /></a></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Spotlight offers an immersive experience connecting users</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">with relevant apps during current cultural moments.</span><br /></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Last year, we introduced </span><a href="https://play.google.com/console/about/programs/EngageSDK/" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Engage SDK</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to help you deliver personalized content to users across surfaces and seamlessly guide them into the relevant in-app experiences. Integrating it unlocks surfaces like </span><a href="https://play.google.com/console/about/programs/EngageSDK/#spotlight-on-collections" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Collections</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, our immersive full-screen experience bringing content directly to the user's home screen. This year, we rolled out updates to expand your content’s reach even further:</span></p><br /><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Engage SDK content expanded to the Play Store</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> this summer, enabling seamless re-engagement across Apps Home and the new You tab.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Rolled out to more markets, </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">including Brazil, Germany, India, Japan, and Korea</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">. </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"><br /><br /></span></p></li></ul><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Supporting you throughout your app lifecycle</span></h3><div><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In addition to evolving the store, we’ve continued to build on our powerful toolset to support you at every stage, from testing and release to growth and monetization.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Helping you deliver high-quality, trusted user experiences</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We launched key updates in Android Studio and Play Console to help you build more stable and compliant apps.</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/studio/publish/insights" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Policy insights in Android Studio</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> help you catch potential violations early by showing in-context guidance, such as policy summaries and best practices, whenever code related to a Google Play policy is detected. </span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">You can now </span><a href="https://support.google.com/googleplay/android-developer/answer/16285429?hl=en" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">halt fully rolled-out releases</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> to stop the distribution of problematic app versions through Play Console and the Publishing API.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">We also added </span><a href="https://android-developers.googleblog.com/2025/04/play-console-insights.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">new Android vitals performance metrics</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">, including low memory kill metrics which provides device-specific insights to resolve stability problems and </span><a href="https://android-developers.googleblog.com/2025/11/raising-bar-on-battery-performance.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">excessive partial wake lock metrics</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> to help you address battery drain.</span></p></li></ul><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhmITn2eEUwv9n39zDIuhMhotwMRT30RVBkieDcU7nFsbOO8VLfXThP5H8GuRTxzmWU_kT0brcLVzMdTUa2OYPstkNls4lmzREZLso_e0vI32BNCqdOLNHcEAC7OfZ7BHrQ7YQPxwWsij1YXEFb9u1d72_9YsMjGASzE8-PN_WBEEnFhZz_7eAY_MVe2g/s3136/Rectangle-Androidvitals.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2014" data-original-width="3136" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhmITn2eEUwv9n39zDIuhMhotwMRT30RVBkieDcU7nFsbOO8VLfXThP5H8GuRTxzmWU_kT0brcLVzMdTUa2OYPstkNls4lmzREZLso_e0vI32BNCqdOLNHcEAC7OfZ7BHrQ7YQPxwWsij1YXEFb9u1d72_9YsMjGASzE8-PN_WBEEnFhZz_7eAY_MVe2g/s16000/Rectangle-Androidvitals.png" /></a></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt; text-align: center;"><br /></p></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">New</span></span><i> Android vitals metrics h</i><span style="font-family: inherit;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">elp you resolve stability problems and address battery drain. </span></span></p><span style="font-family: inherit;"><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Boosting your productivity and workflow</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We refined the Play Console experience to make managing your app and your marketing content more efficient.</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">We put your most essential insights front and center with a </span><a href="https://android-developers.googleblog.com/2025/04/play-console-insights.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">redesigned app dashboard and overview pages</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">To repurpose creative content across Play Console more easily, we launched an </span><a href="https://support.google.com/googleplay/android-developer/answer/16386748?hl=en" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">asset library</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> that lets you upload from Google Drive, organize with tags, and crop existing visuals.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">You can now automatically</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;"> </span><a href="https://support.google.com/googleplay/android-developer/answer/9844778?hl=en" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">translate app strings with Gemini</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> at no cost. This feature eliminates manual translation work for new releases, making updates seamless. You remain in full control with the ability to preview translations using a built-in emulator, and can easily edit or disable the service.</span></p></li></ul><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWLMNjX_nRJugEjrw_ITq5bpwDV1Kf33RkGAxjRC1XhlvuXmZSToe8Lu9dt50DFxd5c8UK62o7Xcp3ucLpCnpoHopHGiObX1vqEuqbErA1_4-58FIhCDuQKw2SlH7uX3iFOeCXzP4qBU82cgXNB5Wu1wxQtjenkpCLTjXtO2j52n2D0CwQ-a2eL8iN8r0/s5760/AI%20translations-%20Updated%20for%20Blog.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="4000" data-original-width="5760" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWLMNjX_nRJugEjrw_ITq5bpwDV1Kf33RkGAxjRC1XhlvuXmZSToe8Lu9dt50DFxd5c8UK62o7Xcp3ucLpCnpoHopHGiObX1vqEuqbErA1_4-58FIhCDuQKw2SlH7uX3iFOeCXzP4qBU82cgXNB5Wu1wxQtjenkpCLTjXtO2j52n2D0CwQ-a2eL8iN8r0/s16000/AI%20translations-%20Updated%20for%20Blog.jpg" /></a></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Translate app strings automatically with Gemini, while maintaining full control for previewing and editing.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Maximizing your revenue with secure, frictionless payments</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We introduced new features focused on driving purchases and maximizing subscription revenue globally.</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">We’re improving purchase conversion globally with </span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">over 800 million users now ready to buy</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">. We launched features that encourage users to set up payment methods early, provide AI-powered payment method recommendations, and expanded our payment library to support more local payment methods globally.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">To maximize recurring revenue from over 400 million paid subscriptions, we introduced </span><a href="https://android-developers.googleblog.com/2025/05/io-2025-whats-new-in-google-play.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">multi-product checkout</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">, allowing you to sell base subscriptions and add-ons under a simple, single transaction. </span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">To combat churn, we began showcasing subscription benefits in more places and provided you with more flexible options like</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;"> extended grace periods and account holds</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> for declined payments, which has proven effective in reducing involuntary churn by an average of 10%*</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">.</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="border: none; clear: left; display: inline-block; float: left; margin-bottom: 1em; margin-right: 1em;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEgSmK3rnUCzHQdojACiOBmfd31xVx4WYGB3eF2FFStHyYRSU3KdGLiYXuNx4Ir5m1q_kWnZZ19257J1DlQISFnajjmXIq-mRTwPiGzKhM46qDkRYooQdGriPvJ9Fesbt4VHh1DvasPJcXvkrc6ciwcaRYnbxXK6FrtN-KGKqc1Sf16OomRXa5CRaeCxB4Q=s16000" style="margin-left: 0px; margin-top: 0px;" /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To help reduce voluntary churn, we’re showcasing your subscriptions benefits across Play.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Investing in our app and game community with developer programs</span></h3><div><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We’re proud to invest in programs for app and game companies around the world to help you grow and succeed on Play. </span></p><br /><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://rsvp.withgoogle.com/events/play-apps-accelerator" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Google Play Apps Accelerator</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">: We’ve opened submissions for our program that will help early-stage app companies scale their business. Selected companies from over 80 eligible countries will join a 12-week accelerator starting in March 2026, where they can learn more about creating high-quality apps, go-to-market strategies, user acquisition, and more.</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block;"><img height="227" src="https://blogger.googleusercontent.com/img/a/AVvXsEjByRugyS_wzvMQHgn4odP-C3oPLZrfwiuVo77h6CJNcCKp8rV5tmjDD7RVmkJyeD49JcU3g-HHtZcQwmM8bdyusw25vZjldqkyPod4ymMyZcrMIJxnxi4vLVpv1RG19QiJ122_M4guZ_bc_9N6nMtHPolCDJJj1y3C7G4XZEMGShcf_4aPXA1BS0qJliQ" style="margin-left: 0px; margin-top: 0px;" width="452" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Submissions are still open for our 12-week accelerator, which starts in March 2026. </span><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><a href="https://rsvp.withgoogle.com/events/play-apps-accelerator" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Apply by January 7, 2026</span></a><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for consideration.</span></p><br /><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://blog.google/products/google-play/indie-games-fund-latin-america-2025/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Indie Games Fund</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> (Latin America): Now in its fourth year, this fund provides support to 10 promising game studios in Latin America with funding and hands-on support from Google Play. In October, we announced the 2025 recipients.</span></p></li></ul><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://blog.google/intl/ko-kr/company-news/outreach-initiatives/changgoo-program-2025-kickoff-kr/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">ChangGoo Program</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> (South Korea): Now in its seventh year, this program works with over 100 Korean mobile app and game startups to foster their growth and expansion in collaboration with the Ministry of SMEs and Startups and the Korean Institute of Startup and Entrepreneurship Development (KISED).</span></p></li></ul><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://rsvp.withgoogle.com/events/googleplay-unity-id-2025" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Google Play x Unity Game Developer Training Program</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> (Indonesia): The third edition launched in April, offering a 6-month online curriculum, meetups, and mentorship for Indonesian game developers in partnership with Indonesia’s Ministry of Creative Economy and the Indonesian Gaming Association.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://rsvp.withgoogle.com/events/googleplay-unity-in-2025" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Google Play x Unity Game Developer Training Program</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> (India): The first India cohort kicked off in November with 500 aspiring and professional game developers. The 6-month journey provides online curriculum and meetups in partnership with GDAI and the govt of Tamil Nadu and Maharashtra.</span></p></li></ul><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://blog.google/intl/en-in/company-news/applications-now-open-for-google-for-startups-accelerator-apps-2025-seeking-20-ai-powered-indian-startups/" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Google for Startups Accelerator program</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> (India): We provided Seed to Series-A AI-powered app startups in India with insights on the latest AI advancements, mentorship, and expert guidance.</span></p></li></ul></span><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><br /></h3><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;">Protecting your business and our ecosystem</h3><div><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">At the heart of all the progress we’ve made this year is a foundation of trust and security. We're always innovating to make Play safer for everyone—so users can trust every app they download and so you can keep building a thriving business.<br /><span style="font-family: inherit;"><br /></span></p><span style="font-family: inherit;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To offer stronger protection for your business and users, we continued to enhance the </span><a href="https://android-developers.googleblog.com/2025/10/stronger-threat-detection-simpler.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Play Integrity API</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and our anti-fraud systems. On average, apps using Play Integrity features see 80% lower unauthorized usage, and our efforts have safeguarded top apps using Play Billing from $2.9 billion in fraud and abuse in the last year.</span></p><br /><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Automatically fix user issues: </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">New Play in-app remediation prompts in Play Integrity API automatically guide users to fix common problems like network issues, outdated Google Play Services, or device integrity flags, reducing integration complexity and getting users back to a good state faster.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Combat repeat bad actors: </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Device recall is a powerful new tool that lets you store and recall limited data associated with a device, even if the device is reset, helping protect your business model from repeat bad actors.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Strengthen revenue protection: </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">We've introduced stronger protections against abuse, including refining pricing arbitrage detection and enhancing protection against free trial and intro pricing abuse for subscriptions, helping your business models remain profitable.</span></p></li></ul><div class="separator" style="clear: both; text-align: center;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p><div class="separator" style="clear: both; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRLFwCcwIhJJgMIiH-9hkcmgk7y0TFNjj9pJg6-9zVD7Sg4EabbYWEKlJLHutblwHsa5xOt71BqnX2BfFgnJmmMKIK9IxXE7D6WEKOeoQq_9azfW04Uq8J5H8j4OBkfVaRM3XrdExg4JqIuFmcpW8DLajSU0rRj5xUPbu_mgWtuO_O_wqaEO7SwoI-u7s/s1920/InAppRemediation.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRLFwCcwIhJJgMIiH-9hkcmgk7y0TFNjj9pJg6-9zVD7Sg4EabbYWEKlJLHutblwHsa5xOt71BqnX2BfFgnJmmMKIK9IxXE7D6WEKOeoQq_9azfW04Uq8J5H8j4OBkfVaRM3XrdExg4JqIuFmcpW8DLajSU0rRj5xUPbu_mgWtuO_O_wqaEO7SwoI-u7s/s16000/InAppRemediation.gif" /></a></span></div><div class="separator" style="clear: both; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">With in-app remediation prompts, Play automatically handles </span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">a wide range of issues to guide your users back to a good state.</span></span></div><p></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For a full breakdown of new ways we’re keeping the ecosystem safe, check out our deep-dive blog post </span><a href="https://android-developers.googleblog.com/2025/12/building-safer-android-and-google-play.html" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">here</span></a><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><br /><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Thank you for your partnership</span></h3><div><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This is an incredible time for Google Play. We’ve made huge strides together – your passion, creativity, and feedback throughout 2025 has made Play that much stronger. We’re grateful to work alongside the best developer community in the world, and we look forward to unlocking even greater success together in the new year.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Happy holidays!</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Sam Bright</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">VP & GM, Google Play + Developer Ecosystem</span></p><div><span style="font-family: inherit;"><br /></span></div><div><span style="font-family: inherit;"><br /></span></div><div><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-d24f7a63-7fff-2461-f326-828a2ff5f553"><span style="color: #202124; font-size: 9pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">* Source: Internal Google data</span></span></span></p></span><br /></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-60231644619952797882025-12-15T09:00:00.000-08:002025-12-16T10:38:48.263-08:0018% Faster Compiles, 0% Compromises<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzjsrpmtTUmOdET7E4fE3xblg0NdvaX7cjRk-SgkjsInn_NvO2czYzbzW7d1x_RWAH_eVis5uTf4Scv-zCPu2BdhuTnwm-iWOj4Zj3i_Ie-1rxC7aKiMPgJibGjlXG9kjOUkUleXtPGGost6oBx3KfM-dtIrsqWilxula8rnp3vx7Ine0ynMiyWBsbHfA/s1600/Android%20Compile%20Speed-Meta.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzjsrpmtTUmOdET7E4fE3xblg0NdvaX7cjRk-SgkjsInn_NvO2czYzbzW7d1x_RWAH_eVis5uTf4Scv-zCPu2BdhuTnwm-iWOj4Zj3i_Ie-1rxC7aKiMPgJibGjlXG9kjOUkUleXtPGGost6oBx3KfM-dtIrsqWilxula8rnp3vx7Ine0ynMiyWBsbHfA/s1600/Android%20Compile%20Speed-Meta.png" style="display: none;" />
<p><em>Posted by Santiago Aboy Solanes - Software Engineer, Vladimír Marko - Software Engineer</em></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaIk7Sqlvd3-nsUxZ-v1BNeMa7gL36Fo9UYpPuodl0lioinTWsoFjpss2Cv8qS2oEkIJBf9Gx1xlCLNR8QnIG4H8RzgMbAvRGhuUK7bhf1HO7LkDm7JGuy0_ICNYmpEc3xAW0XZgPtA7bU07X8R7RJEPiOZml3Q6ds2mFYnhbASlvTrQVu_Y5cke1DiR0/s4209/Android%20Compile%20Speed.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaIk7Sqlvd3-nsUxZ-v1BNeMa7gL36Fo9UYpPuodl0lioinTWsoFjpss2Cv8qS2oEkIJBf9Gx1xlCLNR8QnIG4H8RzgMbAvRGhuUK7bhf1HO7LkDm7JGuy0_ICNYmpEc3xAW0XZgPtA7bU07X8R7RJEPiOZml3Q6ds2mFYnhbASlvTrQVu_Y5cke1DiR0/s16000/Android%20Compile%20Speed.png" /></a></div><br /><p><br /></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The </span><a href="https://source.android.com/docs/core/runtime" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Android Runtime (ART)</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> team has reduced compile time by 18%</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> without compromising the compiled code or any peak memory regressions. This improvement was part of our 2025 initiative to improve compile time without sacrificing memory usage or the quality of the compiled code.</span></p><p><span>Optimizing compile-time speed is crucial for ART. For example, when just-in-time (JIT) compiling it directly impacts the efficiency of applications and overall device performance. Faster compilations reduce the time before the optimizations kick in, leading to a smoother and more responsive user experience. Furthermore, for both JIT and ahead-of-time (AOT), improvements in compile-time speed translate to reduced resource consumption during the compilation process, benefiting battery life and device thermals, especially on lower-end devices.</span></p><p><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Some of these compile-time speed improvements launched in the June 2025 Android release, and the rest will be available in the end-of-year release of Android. Furthermore, all Android users on versions 12 and above are eligible to receive these improvements through </span><a href="https://source.android.com/docs/core/ota/modular-system" style="text-decoration-line: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">mainline updates</span></a><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">.</span></p><h1 dir="ltr" style="margin-bottom: 6pt; margin-top: 20pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Optimizing the optimizing compiler</span></h1><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Optimizing a compiler is always a game of trade-offs. You can't just get speed for free; you have to give something up. We set a very clear and challenging goal for ourselves: make the compiler faster, but do it without introducing memory regressions and, crucially, without degrading the quality of the code it produces. If the compiler is faster but the apps run slower, we've failed.</span></p><p><span>The one resource we were willing to spend was our own development time to dig deep, investigate, and find clever solutions that met these strict criteria. Let’s take a closer look at how we work to find areas to improve, as well as finding the right solutions to the various problems.</span></p><p><span style="font-size: 16pt;"><br />Finding worthwhile possible optimizations</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Before you can begin to optimize a metric, you have to be able to measure it. Otherwise, you can’t ever be sure if you improved it or not. Luckily for us, compile time speed is fairly consistent as long as you take some precautions like using the same device you use for measuring before and after a change, and making sure you don’t thermal throttle your device. On top of that, we also have deterministic measurements like compiler statistics that help us understand what’s going on under the hood.</span></p><p><span>Since the resource we were sacrificing for these improvements was our development time, we wanted to be able to iterate as fast as we could. This meant that we grabbed a handful of representative apps (a mix of first-party apps, third-party apps, and the Android operating system itself) to prototype solutions. Later, we verified that the final implementation was worth it with both manual and automated testing in a widespread manner.</span></p>
<p><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">With that set of hand-picked apks we would trigger a manual compile locally, get a profile of the compilation, and use </span><a href="https://github.com/google/pprof" style="text-decoration-line: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">pprof</span></a><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> to visualize where we are spending our time.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 100%; margin: auto; max-width: 624px; overflow: hidden;"><img height="236" src="https://blogger.googleusercontent.com/img/a/AVvXsEgCD2TbQUl41-iQYz5A1yoJQDAqG0JYxsdElyz_LsIjMe8ge6t7CW6oTPn5wRWg96d56HvSca5MqoF33tnlGVzGDbp20C6RkZrTN9881BOV2fCsCH0sHbDRrSyJco0xQqQ4bNTWMAFjl2PYlrVW3OXu3vYFgsGfXP-wrnClD9Z7X0PrWE9Mk4w4BSBlnfc" style="margin-left: 0px; margin-top: 0px;" width="624" /></span></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Example of a profile’s flame graph in pprof</span></p><p><span>The pprof tool is very powerful and allows us to slice, filter, and sort the data to see, for example, which compiler phases or methods are taking most of the time. We will not go into detail about pprof itself; just know that if the bar is bigger then it means it took more time of the compilation.</span></p><p><span>One of these views is the “bottom up” one where you can see which methods are taking most of the time. In the image below we can see a method called Kill, accounting for over a 1% of the compile time. Some of the other top methods will also be discussed later in the blog post.</span></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyc7Mj8lghXxlYQUTVBRB5lwxidnUSUHoGABYfbiCEaOxWReA0ENsoLKpDcuyFpmbwzNe69XIvkDoNip-QL5d_yjOz2KmJAgrfzEPurcSKk9AU4dGK2KOHTccpjWUvXGQLeKHFR7pNcRj4WKDJFTo434Zwggngdkiyui0dOxUfrjFrLGBvyafFYWbvyVc/s912/1.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="280" data-original-width="912" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyc7Mj8lghXxlYQUTVBRB5lwxidnUSUHoGABYfbiCEaOxWReA0ENsoLKpDcuyFpmbwzNe69XIvkDoNip-QL5d_yjOz2KmJAgrfzEPurcSKk9AU4dGK2KOHTccpjWUvXGQLeKHFR7pNcRj4WKDJFTo434Zwggngdkiyui0dOxUfrjFrLGBvyafFYWbvyVc/s16000/1.png" /></a></div><p></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Bottom up view of a profile</span></p>
<p><span id="docs-internal-guid-78129603-7fff-d133-f133-b6b3fa33c969"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In our optimizing compiler, there’s a phase called Global Value Numbering (GVN). You don’t have to worry about what it does as a whole, but the relevant part is to know that it has a method called `Kill` that it will delete some nodes according to a filter. This is time consuming as it has to iterate through all the nodes and check one by one. We noticed that there are some cases in which we know in advance that the check will be false, no matter the nodes we have alive at that point. In these cases, we can </span><a href="http://r.android.com/3469228" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">skip iterating altogether</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, bringing it from 1.023% down to ~0.3% and improving GVN’s runtime by ~15%.</span></span></span></p><h2 dir="ltr" style="margin-bottom: 6pt; margin-top: 18pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Implementing worthwhile optimizations</span></h2><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">We covered how to measure and how to detect where the time is being spent, but this is only the beginning. The next step is how to optimize the time being spent compiling.</span></p><p><span>Usually, in a case like the `Kill` one above we would take a look at how we iterate through the nodes and do it faster by, for example, doing things in parallel or improving the algorithm itself. In fact, that’s what we tried at first and only when we couldn’t find anything to do we had a “Wait a minute…” moment and saw that the solution was to (in some cases) not iterate at all! When doing these kinds of optimizations, it is easy to miss the forest for the trees.</span></p><p><span>In other cases, we used a handful of different techniques including:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">using heuristics to decide whether an optimization will fail to produce worthwhile results and therefore can be skipped</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;">
<p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">using extra data structures to cache computed data</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">changing the current data structures to get a speed boost</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">lazily computing results to avoid cycles in some cases</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">use the right abstraction - unnecessary features can slow down the code</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">avoid chasing a frequently used pointer through many loads</span></p></li></ul><h2 dir="ltr" style="margin-bottom: 6pt; margin-top: 18pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">How do we know if the optimizations are worth pursuing?</span></h2><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">That’s the neat part, you don’t. After detecting that an area is consuming a lot of compile time and after devoting development time to try to improve it, sometimes you can’t just find a solution. Maybe there’s nothing to do, it will take too long to implement, it will regress another metric significantly, increase code base complexity, etc. For every successful optimization that you can see in this blog post, know that there are countless others that just didn’t come to fruition.</span></p><p><span>If you are in a similar situation, try to estimate how much you are going to improve the metric by doing as little work as you can. This means, in order:</span></p><ol style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Estimating with a metrics you have already collected, or just a gut feeling</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Estimating with a quick and dirty prototype</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Implement a solution.</span></p></li></ol><p><span>Don’t forget to consider estimating the drawbacks of your solution. For example, if you are going to rely on extra data structures, how much memory are you willing to use?</span></p><h1 dir="ltr" style="margin-bottom: 6pt; margin-top: 20pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Diving deeper</span></h1>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Without further ado, let’s look at some of the changes we implemented.</span></p><p><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">We implemented a </span><a href="http://r.android.com/3473498" style="text-decoration-line: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">change to optimize</span></a><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> a method called FindReferenceInfoOf. This method was doing a linear search of a vector to find an entry. We updated that data structure to be indexed by the instruction’s id so that FindReferenceInfoOf would be O(1) instead of O(n). Also, we pre-allocated the vector to avoid resizing. We slightly increased memory as we had to add an extra field which counted how many entries we inserted in the vector, but it was a small sacrifice to make as the peak memory didn’t increase. This sped up our LoadStoreAnalysis phase by 34-66% which in turns gives ~0.5-1.8% compile time improvement.</span></p><p><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">We have a custom implementation of HashSet that we use in several places. Creating this data structure was taking a considerable amount of time and we found out why. Many years ago, this data structure was used in only a few places that were using very big HashSets and it was tweaked to be optimized for that. However, nowadays it was used in the opposite direction with only a few entries and with a short lifespan. This meant that we were wasting cycles by creating this huge HashSet but we only used it for a few entries before discarding it.<span style="font-family: inherit;"> </span></span><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span id="docs-internal-guid-7cb8b299-7fff-85f5-282c-74eb96f2d9dd"><span style="font-family: inherit;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">With </span><a href="http://r.android.com/3480514" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">this change</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, we improved ~1.3-2% of compile time.</span></span></span> As an added bonus, memory usage decreased by ~0.5-1% since we weren’t using as big data structures as before.</span></p><p><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">We improved ~0.5-1% of compile time by </span><a href="https://android.googlesource.com/platform/art/+/43f2b628ffc82f91af20d44bd3d50c79a00b2189%5E%21/#F0" style="text-decoration-line: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">passing data structures by reference</span></a><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> to the lambda to avoid copying them around. This was something that was missed in the original review and sat in our codebase for years. It was thanks to taking a look at the profiles in pprof that we noticed that these methods were creating and destroying a lot of data structures, which led us to investigate and optimize them.</span></p><p><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">We sped up the phase that writes the compiled output by </span><a href="https://android.googlesource.com/platform/art/+/42086fbafefaf8305fff3f7e40c6c68539e8505c%5E%21/#F0" style="text-decoration-line: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">caching computed values</span></a><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, which translated to ~1.3-2.8% of total compile time improvement. Sadly, the extra bookkeeping was too much and our automated testing alerted us of the memory regression. Later, we took a second look at the same code and implemented a </span><a href="https://android.googlesource.com/platform/art/+/9c6e669bc718429e15632c7ecf08d19a43248e33%5E%21/#F0" style="text-decoration-line: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">new version</span></a><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> which not only took care of the memory regression but also improved the compile time a further ~0.5-1.8%! In this second change we had to refactor and reimagine how this phase should work, in order to get rid of one of the two data structures.</span></p><p><span>We have a phase in our optimizing compiler which inlines function calls in order to get better performance. To choose which methods to inline we use both heuristics before we do any computation, and final checks after doing work but right before we finalize the inlining. If any of those detect that the inlining is not worth it (for example, too many new instructions would be added), then we don’t inline the method call.</span></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">We moved two checks from the “final checks” category to the “heuristic” category to estimate whether an inlining will succeed or not before we do any time-expensive computation. Since this is an estimate it is not perfect, but we verified that our new heuristics cover 99.9% of what was inlined before without affecting performance. One of these new heuristics was about the </span><a href="http://r.android.com/3513632" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">needed DEX registers</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> (~0.2-1.3% improvement), and the other one about </span><a href="https://android.googlesource.com/platform/art/+/b77c09612f67ee057eab8b9fa1fc461751d38e8d%5E%21/#F0" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">number of instructions</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> (~2% improvement).</span></p><p><span>We have a custom implementation of a BitVector that we use in several places. We replaced the resizable BitVector class with a simpler BitVectorView for certain fixed-size bit vectors. This eliminates some indirections and run-time range checks and speeds up the construction of the bit vector objects.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Furthermore, the BitVectorView class was templatized on the underlying storage type (instead of always using uint32_t as the old BitVector). This allows some operations, for example Union(), to process twice as many bits together on 64-bit platforms. The samples of the affected functions were reduced by more than 1% in total when compiling the Android OS. This was done across several changes [</span><a href="https://r.android.com/3500455" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">1</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, </span><a href="https://r.android.com/3500395" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">2</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, </span><a href="https://r.android.com/3501792" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">3</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, </span><a href="https://r.android.com/3501794" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">4</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, </span><a href="https://r.android.com/3505691" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">5</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, </span><a href="https://r.android.com/3506110" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">6</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">]</span></p><p><span>If we talked in detail about all the optimizations we would be here all day! If you are interested in some more optimizations, take a look at some other changes we implemented:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="http://r.android.com/3469440" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Add bookkeeping</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to improve compilation times by ~0.6-1.6%.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;">
<p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="http://r.android.com/3492151" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Lazily compute data</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to avoid cycles, if possible.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://android.googlesource.com/platform/art/+/bd15b243cda3f9c5038b76099e703e050890f280%5E%21/#F0" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Refactor our code</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to skip precomputing work when it will not be used.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="http://r.android.com/3497214" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Avoid some dependent load chains</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> when the allocator can be readily obtained from other places.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Another case of </span><a href="http://r.android.com/3553643" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">adding a check to avoid unnecessary work</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://android.googlesource.com/platform/art/+/bf625ebd279484bc5b0214e1659797dac2f27c8d%5E%21/#F0" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Avoid frequent branching</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> on register type (core/FP) in register allocator.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="http://r.android.com/3802063" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Make sure some arrays are initialized</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> at compile time. Don’t rely on clang to do it.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://android.googlesource.com/platform/art/+/77a5d1e6464a03460fad1daa6f357f3a9e5d8f19%5E%21/#F0" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Clean up some loops</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. Use range loops that clang can optimize better because it does not need to reload the internal pointers of the container due to loop side effects. Avoid calling the virtual function `HInstruction::GetInputRecords()` in the loop via the inlined `InputAt(.)` for each input.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://android.googlesource.com/platform/art/+/85f6b01b978b0543e964fa65d9d66adfedfd90cb%5E%21/#F0" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Avoid Accept() functions</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> for the visitor pattern by exploiting a compiler optimization.</span></p></li></ul>
<h1 dir="ltr" style="margin-bottom: 6pt; margin-top: 20pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Conclusion</span></h1><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Our dedication to improving ART’s compile-time speed has yielded significant improvements, making Android more fluid and efficient while also contributing to better battery life and device thermals. By diligently identifying and implementing optimizations, we've demonstrated that substantial compile-time gains are possible without compromising memory usage or code quality.</span></p><p><span>Our journey involved profiling with tools like pprof, a willingness to iterate, and sometimes even abandon less fruitful avenues. The collective efforts of the ART team have not only reduced compile time by a noteworthy percentage, but have also laid the groundwork for future advancements.</span></p><p><span>All of these improvements are available in the 2025 end-of-year Android update, and for Android 12 and above through mainline updates. We hope this deep dive into our optimization process provides valuable insights into the complexities and rewards of compiler engineering!</span></p><p></p>Birnahttp://www.blogger.com/profile/04044883525253664551[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-17026636776989337112025-12-11T14:26:00.000-08:002025-12-11T14:26:31.148-08:00Building a safer Android and Google Play, together<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvnCW9HupJacbXD-3udJlbrmS5y8rR32ISMHa46sFm_ik2yD4_3INwSGSIRoN02_MBMmCAwB5q_gMudpDnWCU_49tIVV7-lvONw-WNiedEwAk2GwSOAjWZrcBpGMYv6Bc7MohawsaVNISUgUHe1WtglzxP6CrY9lBSa3DyPxf5eL5oXxe3ys-xQsEuakE/s1600/251210_Metadata%20card_v01.png" name="twitter:image" />
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvnCW9HupJacbXD-3udJlbrmS5y8rR32ISMHa46sFm_ik2yD4_3INwSGSIRoN02_MBMmCAwB5q_gMudpDnWCU_49tIVV7-lvONw-WNiedEwAk2GwSOAjWZrcBpGMYv6Bc7MohawsaVNISUgUHe1WtglzxP6CrY9lBSa3DyPxf5eL5oXxe3ys-xQsEuakE/s1600/251210_Metadata%20card_v01.png" style="display: none;" />
<i><span style="font-family: inherit;">Posted by Matthew Forsythe , Director, Product Management, App & Ecosystem Trust and Ron Aquino Sr. Director, Trust and Safety, Chrome, Android and Play</span></i><div><i><br /></i></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmwvcU-Vd_e47LxvqLzPmGWKYmoiMwbRZAaJ4RxOcB8K6sPgAozOEIxrnMzPUt_EagplYJ5R-amDXS7IwyIlFQx41zkOYe_4zUEKQIkwxROX5pFdKbaR9xtIE1gT0SutnlXTcLQpmiiQaVk77ZULioufpHkDvTPZnOUSbIWWqFvTo6jdp-roQy32q-BmE/s4209/251210_Header_v01.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmwvcU-Vd_e47LxvqLzPmGWKYmoiMwbRZAaJ4RxOcB8K6sPgAozOEIxrnMzPUt_EagplYJ5R-amDXS7IwyIlFQx41zkOYe_4zUEKQIkwxROX5pFdKbaR9xtIE1gT0SutnlXTcLQpmiiQaVk77ZULioufpHkDvTPZnOUSbIWWqFvTo6jdp-roQy32q-BmE/s16000/251210_Header_v01.png" /></a></div><br /><i><br /></i><div><i><span style="font-family: inherit;"><br /></span></i></div><div><span id="docs-internal-guid-f1c6bd21-7fff-4eee-1246-cee8ccdbde48"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Earlier this year, we reiterated our commitment to </span><a href="https://android-developers.googleblog.com/2025/03/keeping-google-play-safe.html" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">keeping Android and Google Play safe</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> for everyone and maintaining a thriving environment where users can trust the apps they download and your business can flourish. We’ve heard your feedback clearly, from excited conversations at Play events around the world to the honest concerns on social media. You want simpler ways to make sure your apps are compliant and pass review, and need strong protections for your business so you can focus on growth and innovation. We are proud of the steps we’ve taken together this year, but know this is ongoing work in a complex, ever-changing market. </span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">Here are key actions we’ve taken this year to simplify your development journey and strengthen protection.</span></span></p></span><h3 style="text-align: left;"><span>Simpler ways to build safer apps from the start</span></h3><span>This year, we focused on making improvements to the app publishing experience by reducing friction points, from the moment you write code to submitting your app for review.<ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Policy guidance right where you code</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">: We rolled out </span><a href="https://developer.android.com/studio/publish/insights" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Play Policy Insights</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> to all developers using Android Studio. This feature provides real-time, in-context guidance and policy warnings as you code, helping you proactively identify and resolve potential issues before you even submit your app for review.</span></span></p></li><li aria-level="1" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">Pre-review checks to help prevent app review surprises</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">: Last year, we launched pre-review checks in Play Console so you can identify issues early, like incomplete policy declarations or crashes, and avoid rejections. This year, we expanded these checks for privacy policy links, login credential requirements, data deletion request links, inaccuracies in your Data safety form, and more.</span></span></p></li></ul></span><h3 style="text-align: left;"><span>Stronger protection for your business and users</span></h3><span>We are committed to providing you with powerful ways to protect your apps and users from abuse. Beyond existing <a href="https://support.google.com/googleplay/android-developer/answer/9867159#zippy=%2Cages-and-over">tools</a>, <a href="https://play.google.com/console/about/programs/teacherapproved/">programs</a>, and the performance and security enhancement that comes with every Android <a href="https://android-developers.googleblog.com/2025/06/android-16-is-here.html">release</a>, we’ve also launched: <ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Advanced abuse and fraud protection</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">: We made the Play Integrity API </span><a href="https://android-developers.googleblog.com/2024/12/making-play-integrity-api-faster-resilient-private.html" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">faster and more resilient</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">, and introduced new features like </span><a href="https://android-developers.googleblog.com/2025/10/stronger-threat-detection-simpler.html" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Play remediation prompts</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> and </span><a href="https://developer.android.com/google/play/integrity/device-recall" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">device recall</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> in beta. Device recall is a powerful new tool that lets you store and recall limited data associated with a device, even if the device is reset, helping protect your business model from repeat bad actors.</span></span></p></li><li aria-level="1" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Tools to keep kids safe</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">: </span></span></p></li><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="2" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">We continued to </span><a href="https://blog.google/technology/safety-security/age-assurance-measures-safer-online-kids-teens-us/" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">invest</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> in protecting children across Google products, including Google Play. New Play </span><a href="https://support.google.com/googleplay/android-developer/answer/16302250?sjid=17958105945234987629-NC" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">policy</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> helps keep our youngest users safe globally by requiring apps with dating and gambling features to use Play Console tools to prevent minors from accessing them. Our enhanced Restrict Minor Access feature now blocks the users who we determine to be minors from searching for, downloading, or making purchases in apps that they shouldn’t have access to. </span></span></p></li><li aria-level="2" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">We’ve also been </span><a href="https://support.google.com/googleplay/android-developer/answer/16569691?hl=en" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">providing tools</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> to developers to help meet significant new age verification regulatory requirements in applicable US states.</span></span></p></li></ul><li aria-level="1" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">More ways to stop malware from snooping on your app</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">: Android 16 provides a </span><a href="https://android-developers.googleblog.com/2025/12/enhancing-android-security-stop-malware.html" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">new, powerful defense</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> in a single line of code:</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> </span><span style="background-color: #e9eef6; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;">accessibilityDataSensitive.</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> This flag lets you explicitly mark views in your app as containing sensitive data and block malicious apps from seeing or performing interactions on it. If you already use </span><a href="https://developer.android.com/privacy-and-security/risks/tapjacking#mitigations" style="text-decoration-line: none;"><span style="background-color: #e9eef6; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">setFilterTouchesWhenObscured(true)</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; text-wrap-mode: wrap; vertical-align: baseline;"> to protect your app from tapjacking, your views are automatically treated as sensitive data for accessibility for an instant additional layer of defense with no extra work. </span></span></p></li></ul></span><h3 style="text-align: left;"><span>Smoother policy compliance experience</span></h3><span>We’re listening to your concerns and proactively working to make the experience of Play policy compliance and Android security requirements more transparent, predictable, and accessible for all developers. You asked for clarity, fairness, and speed, and here is what we launched:<ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 12pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">More support when you need it</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">: Beyond the </span><a href="https://developersonair.withgoogle.com/google-play-policy-webinars?sjid=2798052899965005772-NA" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">webinars</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> and </span><a href="https://support.google.com/googleplay/android-developer/answer/16373081?hl=en&ref_topic=9877065&sjid=2798052899965005772-NA" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">resources</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> that we share, you told us you needed more direct policy help to understand requirements and get answers. Next week, we’ll add a direct way for you to reach our team about policy questions in your Play Console. You’ll be able to find this new, integrated support experience directly within your Play Console via the </span><a href="https://play.google.com/console/u/0/developers/help-and-support" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">“Help” section</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">. We also expanded the </span><a href="https://support.google.com/googleplay/android-developer/community" style="text-decoration-line: none;"><span style="background-color: white; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">Google Play Developer Help Community</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> to more languages, like Indonesian, Japanese, Korean, and Portuguese. </span></span></p></li><li aria-level="1" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Clearer documentation:</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> You asked for policy that’s easier to understand. To help you quickly grasp essential requirements, we've introduced a new Key Considerations section across several policies (like Permissions and Target API Level) and included concise "Do's & Don'ts" and easier-to-read summaries.</span></span></p></li><li aria-level="1" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">More transparent appeals process:</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> We introduced a </span><a href="https://support.google.com/googleplay/android-developer/answer/16659089?hl=en" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">180-day appeal window</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> for account terminations. This allows us to prioritize and make decisions faster for developers who file appeals.</span></span></p></li><li aria-level="1" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Android developer verification design changes</span><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;">: To support a diverse range of users and developers, we’re </span><a href="https://android-developers.googleblog.com/2025/11/android-developer-verification-early.html" style="text-decoration-line: none;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap-mode: wrap; vertical-align: baseline;">taking action</span></a><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> on your feedback. </span></span></p></li><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="2" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"><span style="font-family: inherit;">First, we’re creating a dedicated free account type to support students and hobbyists who want to build apps just for a small group, like family and friends. This means that you can share your creations to a limited number of devices without needing to go through the full developer verification process. </span></span></p></li><li aria-level="2" dir="ltr" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: circle; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"><span style="font-family: inherit;">We’re also building a flow for experienced users to be able to install unverified apps. This is being carefully designed to balance providing choice with prioritizing security, including clear warnings so users fully understand the risks before choosing to bypass standard safety checks. </span></span></p></li></ul></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">The improvements we made this year are only the beginning. Your feedback helps drive our roadmap, and it will continue to inform future refinements to our policies, tools, experiences, and ensuring Android and Google Play remain the safest and most trusted place for you to innovate and grow your business. </span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="font-family: inherit;">Thank you for being our partner in building the future of Android.</span></span></p><div><span face=""Google Sans", sans-serif" style="color: #666666; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div></span></div></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-64993802915572713422025-12-11T09:00:00.001-08:002025-12-11T09:00:00.115-08:00Enhancing Android security: Stop malware from snooping on your app data<i>Posted by Bennet Manuel, Product Management, Android App Safety and Rob Clifford, Developer Relations</i><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv3zTmlOPFxvN1DWGjv-7rE4gDEHarhDGlhiB8BmmKbIMmOUP9A9AXpJTwSlF2PGNakohzWSS24PPFQSxpiBSeFaHkOhYYK91DfaGthG3lbilMywJk4T_geuXZE5siCHuyYSEnoH4JHODWaTWaOAUVSzizwFrvyVMIKqjAaeWuKDUohzAVGFiHuq5QtOg/s1600/Meta-a11y.png" style="display: none;" /><div><i><br /></i></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTHRiqwngcD3ekgnL7Mn3tgloWJ_gALlGGliyg4_0ZNP_h5MhHEjnToIG6TcGHEFB_FoS2m3ARinhnj2txReOodBX61OAaIjTRw7oRVOHpj6hYfF2k06R8Mtew5WFPLlE8xvilzUPF1plEYBWApeUuLUlMU_9orCFJBdLcm1pc8e8G6SjY4BH0G5ugJg0/s4210/a11y-rev.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1254" data-original-width="4210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTHRiqwngcD3ekgnL7Mn3tgloWJ_gALlGGliyg4_0ZNP_h5MhHEjnToIG6TcGHEFB_FoS2m3ARinhnj2txReOodBX61OAaIjTRw7oRVOHpj6hYfF2k06R8Mtew5WFPLlE8xvilzUPF1plEYBWApeUuLUlMU_9orCFJBdLcm1pc8e8G6SjY4BH0G5ugJg0/s16000/a11y-rev.png" /></a></div><br /><i><br /></i></div><div><i><br /></i></div><div><span id="docs-internal-guid-ddda6ad9-7fff-e052-c644-d6377c91533d"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Security is foundational to Android. We partner with you to keep the platform safe and protect user data by offering powerful security tools and features, like </span><a href="https://developer.android.com/identity/sign-in/credential-manager" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Credential Manager</span></a><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and </span><a href="https://developer.android.com/security/fraud-prevention/activities" style="text-decoration-line: none;"><span style="background-color: #f8f9fa; color: #1155cc; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">FLAG_SECURE</span></a><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Every Android release brings performance and security enhancements, and with Android 16, you can take simple, significant steps to strengthen your app’s defenses. Check out our video or continue reading to learn more about our enhanced protections for accessibility APIs.</span></p></span><span><div class="separator" style="clear: both; max-width: 100%; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="291" src="https://www.youtube.com/embed/GAv5-OAjle4" style="max-width: 100%;" width="515" youtube-src-id="GAv5-OAjle4"></iframe></div><br /></span><h3 style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><br />Protect your app from snooping with a single line of code</h3><div><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d;"><span style="white-space-collapse: preserve;">We’ve seen that bad actors sometimes try to exploit accessibility API features to read sensitive information, like passwords and financial details, directly from the screen and manipulate a user's device by injecting touches. To combat this, Android 16 provides a new, powerful defense in </span></span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">a single line of code</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">: </span><span style="font-family: inherit;"><a href="https://developer.android.com/privacy-and-security/risks/tapjacking" style="text-decoration-line: none;"><span style="background-color: #e9eef6; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">accessibilityDataSensitive</span></a><span style="background-color: #e9eef6; color: #575b5f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></span></div><div><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></div><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">accessibilityDataSensitive</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> flag allows you to explicitly mark a view or composable as containing sensitive data. When you set this flag to </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">true</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> on your app, you are essentially blocking potentially malicious apps from accessing your sensitive view data or performing interactions on it. Here is how it works: any app requesting accessibility permission that hasn't explicitly declared itself as a legitimate accessibility tool (</span><a href="https://developer.android.com/reference/android/R.styleable#AccessibilityService_isAccessibilityTool" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">isAccessibilityTool=true</span></a><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">) is denied access to that view.</span></p></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">This simple but effective change helps to prevent malware from stealing information and performing unauthorized actions, all without impacting users’ experience of legitimate accessibility tools. Note: If an app is not an accessibility tool but requests accessibility permissions and sets </span></span><span style="background-color: #e9eef6; color: #666666;">isAccessibilityTool=true</span>,<span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d;"><span style="white-space-collapse: preserve;"> Play will reject it and Google Play Protect will block it on user devices. </span></span></span></p><span><h3 style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt; text-align: left;"><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></h3></span><h3 style="text-align: left;">Automatic, enhanced security for <span style="background-color: #e9eef6;">setFilterTouchesWhenObscured</span> protection</h3><span><div><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"><div style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt; text-align: left; white-space-collapse: collapse;"><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We’ve already integrated this new </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">accessibilityDataSensitive</span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">security functionality with the existing </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">setFilterTouchesWhenObscured</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> method. </span></div></span></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If you already use </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">setFilterTouchesWhenObscured(true)</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to protect your app from tapjacking, your views are </span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">automatically</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> treated as sensitive data for accessibility. By enhancing the </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">setFilterTouchesWhenObscured</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> method with </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">accessibilityDataSensitive</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> protections, we’re instantly giving everyone an additional layer of defense with no extra work.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; overflow: hidden;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEjsCzbzCvvlZFdVl7MmWgDKKMP-zcJYZBoN3Iy-VDqxuSoVES873gzuVUQQeu8Mk4_qRhfVN5aIKs1lMK-buQCRTk4RuvrlGeOvHV--WTL053FKhv6dyZaxz8hjwZCO1LTGG0knJn1czuV3gEq7V-ZedUlnfFGoYJMUXOhxwSFsUMqY0MChhPrqLFr_qk8" style="margin-left: 0px; margin-top: 0px;" /></span></span></p></span><h3 style="text-align: left;">Getting started</h3><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We recommend that you use </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">setFilterTouchesWhenObscured</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, or alternatively the </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #666666; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">accessibilityDataSensitive</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> flag, on any screen that contains sensitive information, including login pages, payment flows, and any view displaying personal or financial data.</span></p><h4 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For Jetpack Compose</span></h4><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup><col width="426"></col><col width="426"></col></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #f1f3f4; border-bottom: 1pt solid rgb(0, 0, 0); border-right: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">setFilterTouchesWhenObscured</span></p></td><td style="background-color: #f1f3f4; border-bottom: 1pt solid rgb(0, 0, 0); border-left: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">accessibilityDataSensitive</span></p></td></tr><tr style="height: 162.75pt;"><td style="border-bottom: 0.5pt solid rgb(0, 0, 0); border-right: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">val composeView = LocalView.current DisposableEffect(Unit) { composeView.filterTouchesWhenObscured = true onDispose { composeView.filterTouchesWhenObscured = false } }</span></p><br /></td><td style="border-bottom: 0.5pt solid rgb(0, 0, 0); border-left: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Use the </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">semantics</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> modifier to apply the </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">sensitiveData</span><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> property to a composable.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">BasicText { text = “Your password”,</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> modifier = Modifier.semantics {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> sensitiveData = true }}</span></p><br /><br /></td></tr></tbody></table></div><br /><h4 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">For View-based apps</span></h4><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In your XML layout, add the relevant attribute to the sensitive view.</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup><col width="422"></col><col width="422"></col></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #f1f3f4; border-bottom: 1pt solid rgb(0, 0, 0); border-right: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">setFilterTouchesWhenObscured</span></p></td><td style="background-color: #f1f3f4; border-bottom: 1pt solid rgb(0, 0, 0); border-left: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">accessibilityDataSensitive</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: 0.5pt solid rgb(0, 0, 0); border-right: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #9334e6; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><TextView android:filterTouchesWhenObscured="true" /></span></p><br /></td><td style="border-bottom: 0.5pt solid rgb(0, 0, 0); border-left: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #9334e6; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><TextView android:accessibilityDataSensitive="true" /></span></p><br /></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="color: #1b1c1d; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Alternatively, you can set the property programmatically in Java or Kotlin:</span></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup><col width="420"></col><col width="420"></col></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #f1f3f4; border-bottom: 1pt solid rgb(0, 0, 0); border-right: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">setFilterTouchesWhenObscured</span></p></td><td style="background-color: #f1f3f4; border-bottom: 1pt solid rgb(0, 0, 0); border-left: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">accessibilityDataSensitive</span></p></td></tr><tr style="height: 0pt;"><td style="border-right: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">myView.filterTouchesWhenObscured</span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">=</span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">true;</span></p><br /></td><td style="border-left: 0.5pt solid rgb(0, 0, 0); border-top: 1pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">myView.isAccessibilityDataSensitive = true;</span></p><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: 0.5pt solid rgb(0, 0, 0); border-right: 0.5pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #37474f; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">myView.setFilterTouchesWhenObscured(true)</span></p><br /></td><td style="border-bottom: 0.5pt solid rgb(0, 0, 0); border-left: 0.5pt solid rgb(0, 0, 0); overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #188038; font-family: "Roboto Mono", monospace; font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">myView.setAccessibilityDataSensitive(true);</span></p><br /></td></tr></tbody></table></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Read more about the </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">accessibilityDataSensitive</span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">and </span><span face=""Google Sans Text", sans-serif" style="background-color: #e9eef6; color: #575b5f; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">setFilterTouchesWhenObscured</span><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> flags in the </span><a href="https://developer.android.com/privacy-and-security/risks/tapjacking" style="text-decoration-line: none;"><span face="Arial, sans-serif" style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Tapjacking guide</span></a><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p></span><br /><h3><br />Partnering with developers to keep users safe</h3></div>We worked with developers early to ensure this feature meets real-world needs and integrates smoothly into your workflow.<div><span><br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="color: #1b1c1d; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;"></span></h3></span></div><blockquote style="background: white; border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><span style="border: none; clear: left; display: inline-block; float: left; height: 145px; margin-bottom: 1em; margin-right: 1em; overflow: hidden; width: 184px;"><img height="145" src="https://blogger.googleusercontent.com/img/a/AVvXsEgMqig_Pj0bqj_YXAKiCtAgT2N-16D6UVd7AFAE-yNMeRCWr9-bgUs3psW4lVyukL9x5_V2fWwi7d6Eo0SJRaQvkbnaR-NFLKb-x24dJw_8XWLuSrqufCnoqm-fqBPulTTfZMageUXO6acSkZ9niHG3nLZaIFkmlZ1tWPlYEeeBlqHfXqp_Ug5tU7Wjafs" style="margin-left: 0px; margin-top: 0px;" width="184" /></span><span style="background-color: white;"></span></div></blockquote><p> <span style="background-color: white;">"We've always prioritized protecting our customers' sensitive financial data, which required us to build our own protection layer against accessibility-based malware. Revolut strongly supports the introduction of this new, official Android API, as it allows us to gradually move away from our custom code in favor of a robust, single-line platform defense."</span></p><blockquote style="background: white; border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><span style="background-color: white;">- Vladimir Kozhevnikov, Android Engineer at Revolut</span></div></blockquote><br /><br /><div>You can play a crucial role in protecting your users from malicious accessibility-based attacks by adopting these features. We encourage all developers to integrate these features into their apps to help keep users safe.<br /><br />Together, we can build a more secure and trustworthy experience for everyone.</div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-17561536260638495322025-12-11T09:00:00.000-08:002025-12-11T09:00:00.115-08:00#WeArePlay: How Matraquina helps non-verbal kids communicate<span style="font-family: inherit;"><i>Posted by Robbie McLachlan, Developer Marketing</i><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgApvW53gvm_zs656DAtHYrq41H6l4JzSe6fx-niXQ_8jHKe5e5F5ShBO9m1ZbAONh4lQ6nL_XsL-p6DiYDQyeElUaR8ZluYzEHMGpPA55kGEl3tyTxmvf5LIEO0CjYl_Y75txJeWi8nSAXVdccLhrah1jkFhUzHXBzDxOfEGldCTHeXkddQldRjeG858E/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600%20%281%29f.jpg" style="display: none;" /></span><div><i><span style="font-family: inherit;"><br /></span></i></div><div><i><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaLuZaE8Dt6l8wDMVzDVXdA_mOnE5blABeqdN5gsoe8Thp3JoSxk4Cqj34Z1Lk_lKKdG8NMMgfI3LJxnWiP71PTOgu1OSNFYjUF236Uvg4vLdnUaGcVS_xE8HHZ-Vs2uefDiN8bNIMxHtpIV2iPlLbwHmkuUsV2vz8rrJpmvIUVrx6bde0Z_ky_wQy86M/s1200/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600%20(1)%20(1)%20(1).jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaLuZaE8Dt6l8wDMVzDVXdA_mOnE5blABeqdN5gsoe8Thp3JoSxk4Cqj34Z1Lk_lKKdG8NMMgfI3LJxnWiP71PTOgu1OSNFYjUF236Uvg4vLdnUaGcVS_xE8HHZ-Vs2uefDiN8bNIMxHtpIV2iPlLbwHmkuUsV2vz8rrJpmvIUVrx6bde0Z_ky_wQy86M/s16000/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600%20(1)%20(1)%20(1).jpg" /></a></div><br /><span style="font-family: inherit;"><br /></span></i></div><div><i><span style="font-family: inherit;"><br /></span></i></div><div><span id="docs-internal-guid-833b0286-7fff-f212-b171-298c7ef8935b"><span style="font-family: inherit;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In our latest </span><a href="https://play.google.com/console/about/weareplay/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">#WeArePlay</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> film, we meet Adriano, Wagner and Grazyelle. The trio are behind </span><a href="https://play.google.com/store/apps/details?id=com.phonegap.matraquinha&hl=pt_BR&gl=US" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Matraquinha</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, an app helping thousands of non-verbal children in more than 80 countries communicate. Discover more about their inspiring story and the impact on their own son, Gabriel.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><div class="separator" style="clear: both; text-align: center; max-width: 100%;"><iframe allowfullscreen="" style="max-width: 100%;" class="BLOG_video_class" height="292" src="https://www.youtube.com/embed/NUR5TtKo9W4" width="483" youtube-src-id="NUR5TtKo9W4"></iframe></div><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 14pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Wagner, you developed Matraquinha for a deeply personal reason: your son, Gabriel. Can you tell us what inspired you to create this app for him?</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">My wife and I adopted our son at 10 months. We later found out he couldn’t speak and received a diagnosis of Autism, so we started researching ways to communicate with him and vice versa. The idea started with drawings of objects and phrases on cards for him to point to things he wanted. We wanted to make this more digital and so, with my brother Adriano’s help, we developed the Matraquinha app. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 14pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">How does the app work?</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Wagner</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> The app has almost 250 drawings, like digital flashcards. The child points to a card and the app announces the name of the object, place or feeling. Parents then more clearly understand what their child needs. </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Grazyelle</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> As a mom, after Gabriel started using the app, he was able to communicate and that reduced his feeling of crisis a lot. Before, he would be frustrated. Now with the app, my son can tell me what he needs.</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoB7O5NeYMmKuaMBihocWGYA9sEdAHQvwWjFRhnG-YVHfm-wtPTmfqVdPlFZUnsUGQkYHEhC9zlaZDkcJWQWKs42pLL_RbZdmZdkzV5gi-2RYwO6Qh4CcZ1NT3ZNyo56clcOIGPXLGh2pG-c7DgeDGH6lW9s0kVaCrB6qXQ6xXnGKghNdq7GZRUdzdnhw/s6000/07_BRAZIL_MATRAQUINHA_FOUNDERS_WAGNER_GRAZYELLE_ADRIANOYAMUTO.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="4000" data-original-width="6000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoB7O5NeYMmKuaMBihocWGYA9sEdAHQvwWjFRhnG-YVHfm-wtPTmfqVdPlFZUnsUGQkYHEhC9zlaZDkcJWQWKs42pLL_RbZdmZdkzV5gi-2RYwO6Qh4CcZ1NT3ZNyo56clcOIGPXLGh2pG-c7DgeDGH6lW9s0kVaCrB6qXQ6xXnGKghNdq7GZRUdzdnhw/s16000/07_BRAZIL_MATRAQUINHA_FOUNDERS_WAGNER_GRAZYELLE_ADRIANOYAMUTO.jpg" /></a></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 14pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Matraquinha started as a personal app for your family, but is now helping users in over 77 countries. How did you achieve this scale? </span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Adriano: When my brother came to me with the idea, we thought it would be for our family and had no idea it would turn into a global resource for more families. In the first week, we had 1 download. By the next year, we had 100,000 downloads, all organic with no ads. It showed us how important the app was to help families communicate with their non-verbal children.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Adriano: It’s truly incredible for us to be on Google Play because, even without being senior engineers, this tool gave us an opportunity—an entry point—to bring communication to other families. We use other tools like Firebase Analytics which lets us see which cards and categories people are using the most, this helps us when developing new versions.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPGfGUHXot9MSZ8fm91JwoPHBWAbhgZBNiQZmBbnJVMRkd3kT7pbEriNYxeJNiDLEVfaN1C7CQu2m9Xmql9mq-Kd-6On2YVTg1x0iQHlN3OJX0z9NF9ZX5RoaTckgZVyajkSa9E33weW7GzwZ_ksQlkBG4lwsMlJF0_GxVACocMRfsNNjSydfP7Vv_t8c/s7680/09_BRAZIL_MATRAQUINHA_APP.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="4320" data-original-width="7680" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPGfGUHXot9MSZ8fm91JwoPHBWAbhgZBNiQZmBbnJVMRkd3kT7pbEriNYxeJNiDLEVfaN1C7CQu2m9Xmql9mq-Kd-6On2YVTg1x0iQHlN3OJX0z9NF9ZX5RoaTckgZVyajkSa9E33weW7GzwZ_ksQlkBG4lwsMlJF0_GxVACocMRfsNNjSydfP7Vv_t8c/s16000/09_BRAZIL_MATRAQUINHA_APP.png" /></a></div></span></span><p></p><span style="font-family: inherit;"><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 14pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">What is next for Matraquinha, and what features are you most excited about bringing to the community?</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We are adding an extra 500 real images to the app, because kids are growing and no longer want drawings as they become teenagers. We’re also creating a board that has pronouns, nouns, and verbs. So say, a child wants to let the parents know they like to eat hamburgers, they can tap on the different words and create a sentence. This gives them even more independence. We are also exploring ways to use AI to make the app even more personal and pursuing the same goal: ensuring every child can be heard.</span></p><span style="color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Discover other inspiring app and game founders featured in </span><a href="https://play.google.com/console/about/weareplay/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">#WeArePlay</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></span><br /><br /></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-40886008826907319902025-12-08T14:00:00.000-08:002025-12-08T14:00:00.120-08:00#WeArePlay: How Miksapix Interactive is bringing ancient Sámi Mythology to gamers worldwide<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgApvW53gvm_zs656DAtHYrq41H6l4JzSe6fx-niXQ_8jHKe5e5F5ShBO9m1ZbAONh4lQ6nL_XsL-p6DiYDQyeElUaR8ZluYzEHMGpPA55kGEl3tyTxmvf5LIEO0CjYl_Y75txJeWi8nSAXVdccLhrah1jkFhUzHXBzDxOfEGldCTHeXkddQldRjeG858E/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600%20%281%29f.jpg" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgApvW53gvm_zs656DAtHYrq41H6l4JzSe6fx-niXQ_8jHKe5e5F5ShBO9m1ZbAONh4lQ6nL_XsL-p6DiYDQyeElUaR8ZluYzEHMGpPA55kGEl3tyTxmvf5LIEO0CjYl_Y75txJeWi8nSAXVdccLhrah1jkFhUzHXBzDxOfEGldCTHeXkddQldRjeG858E/s1600/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600%20%281%29f.jpg" style="display: none;" />
<i><span style="font-family: inherit;">Posted by Robbie McLachlan, Developer Marketing</span></i><div><i><span style="font-family: inherit;"><br /></span></i></div><div><i><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9ciq9OotyrwV1q-_WzFKz7nz5HeNO2wwYeTV9euw-kM2d6MfR6XMVjOFn-GEHlA6r39fW8ZfDyNXke932ogo_TbUHfv6rZRCnqIOjVWyE9RvhUkdW0tC-tTGRBUpaWtgyp-RQkpUlXknNN9FDaagSDR6vmeIHfZtajzBdbk3ZgRjralr8g48aKt3-9z0/s1200/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9ciq9OotyrwV1q-_WzFKz7nz5HeNO2wwYeTV9euw-kM2d6MfR6XMVjOFn-GEHlA6r39fW8ZfDyNXke932ogo_TbUHfv6rZRCnqIOjVWyE9RvhUkdW0tC-tTGRBUpaWtgyp-RQkpUlXknNN9FDaagSDR6vmeIHfZtajzBdbk3ZgRjralr8g48aKt3-9z0/s16000/Android%20Devs%20_%20Google%20Devs%20-Blog_Header_1200x600.jpg" /></a></div><br /><span style="font-family: inherit;"><br /></span></i></div><div><span id="docs-internal-guid-0bcfd1e2-7fff-7c14-aa04-62a66c788809"><span style="font-family: inherit;"><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">In our latest </span><a href="https://play.google.com/console/about/weareplay/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">#WeArePlay</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> film, which celebrates the people behind apps and games on Google Play, we meet Mikkel - the founder and CEO of </span><a href="https://play.google.com/store/apps/developer?id=Miksapix+Interactive&hl=en_GB&gl=no" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Miksapix Interactive</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. Mikkel is on a mission to share the rich stories and culture of the Sámi people through gaming. Discover how he is building a powerful platform for cultural preservation using a superheroine.</span></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="413" src="https://www.youtube.com/embed/gDoPKjqHsCA" width="100%" youtube-src-id="gDoPKjqHsCA"></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div><p dir="ltr" style="margin-bottom: 0pt; margin-top: 14pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">You went from a career in broadcasting to becoming a founder in the games industry. What inspired that leap?</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">I've had an interest in games for a long time and always found the medium interesting. While I was working for a broadcast corporation in Karasjok, I was thinking, "Why aren't there any Sámi games or games with Sámi content?". Sámi culture is quite rich in lore and mythology. I wanted to bring that to a global stage. That's how Miksapix Interactive was born.</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifzo8T_i6-sGH8OF_O_hVZfWnQGvHcwUWw43F2itXVZfEjDLn4ykI8cLBABU9ysnSLITV6hqEtxkDrWsMCyOxhO68uDp6iZfNTkFW-Ua3b3yjqDGiA66BKsJfMaoTcZZRaa1ilstZUoVogITyLlqtjgmqtMtIiRLSj_4TMoDQlwqBcuaZMiKxVxZd5XPM/s7744/05_NORWAY_MIKSAPIX%20INTERACTIVE_MIKKELSARA.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="6192" data-original-width="7744" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifzo8T_i6-sGH8OF_O_hVZfWnQGvHcwUWw43F2itXVZfEjDLn4ykI8cLBABU9ysnSLITV6hqEtxkDrWsMCyOxhO68uDp6iZfNTkFW-Ua3b3yjqDGiA66BKsJfMaoTcZZRaa1ilstZUoVogITyLlqtjgmqtMtIiRLSj_4TMoDQlwqBcuaZMiKxVxZd5XPM/s16000/05_NORWAY_MIKSAPIX%20INTERACTIVE_MIKKELSARA.png" /></a></div><br /><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;"><br /></span><p></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Your game, </span><span style="font-family: inherit; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Raanaa - The Shaman Girl</span><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">, is deeply rooted in Sámi culture. What is the significance of telling these specific stories?</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Because these are </span><span style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">our</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> stories to tell! Our mission is to tell them to a global audience to create awareness about Sámi identity and culture. Most people in the world don't know about the Sámi and the Sámi cultures and lore. With our languages at risk, I hope to use storytelling as a way to inspire Sámi children to value their language, celebrate their identity, and take pride in their cultural heritage. Sámi mythology is rich with powerful matriarchs and goddesses, which inspired us to create a superheroine. Through her journey of self-discovery and empowerment, Raanaa finds her true strength — a story we hope will inspire hope and resilience in pre-teens and teens around the world. Through games like </span><a href="https://play.google.com/store/apps/details?id=com.miksapix.raanaa&hl=en_GB&gl=no" style="text-decoration-line: none;"><span style="color: #1155cc; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Raanaa - The Shaman Girl</span><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">, </span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">we get to convey our stories in new formats.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 14pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">How did growing up with rich storytelling affect your games?</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">I was raised in a reindeer herders family, which means we spent a lot of time in nature and the fields with the reindeers. Storytelling was a big part of the family. We would eat supper in the Lavvu tent sitting around a bonfire with relatives and parents telling stories. With Miksapix Interactive, I am taking my love for storytelling and bringing it to the world, using my first hand experience of the Sámi culture.</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigmA9IjgWanI07QAWv9r3gDHcdw_Nvg-RoD5IpKRjzj8DrrTfQttlO-nkvP5SCP67xhv8oRF1PAhFrNFewV1KUFv3JgWmbx4i0dfeN11GuFclqNNw-d9BaQvrXHH6lL1dRiCAOBkbH5KkkjPLgOerwsn-_S04RJSi-_HKwvlxLhvCAFDuQdH6JygDySyQ/s3840/06_NORWAY_MIKSAPIX%20INTERACTIVE_MIKKELSARA.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="2160" data-original-width="3840" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigmA9IjgWanI07QAWv9r3gDHcdw_Nvg-RoD5IpKRjzj8DrrTfQttlO-nkvP5SCP67xhv8oRF1PAhFrNFewV1KUFv3JgWmbx4i0dfeN11GuFclqNNw-d9BaQvrXHH6lL1dRiCAOBkbH5KkkjPLgOerwsn-_S04RJSi-_HKwvlxLhvCAFDuQdH6JygDySyQ/s16000/06_NORWAY_MIKSAPIX%20INTERACTIVE_MIKKELSARA.png" /></a></div><br /><p></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">How has Google Play helped you achieve global reach from your base in the Arctic?</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">For us, Google Play was a no-brainer. It was the easiest part to just release it on Google Play, no hassle. We have more downloads from Google Play than anywhere else, and it has definitely helped us getting abroad in markets like Brazil, India and the US and beyond. The positive Play Store reviews motivated and inspired us during the development of Raanaa. We use Google products like Google Sheets for collaboration when we do a localization or translation. </span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 14pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">What is next for Miksapix Interactive?</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Now, our sights are set on growth. We are very focused on the Raanaa IP. For the mobile game, we are looking into localizing it to different Sámi languages. In Norway, we have six Sámi languages, so we are now going to translate it to </span><span style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Lule Sámi</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> and S</span><span style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">outhern Sámi</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. We're planning to have these new Sámi languages available this year.</span></p><span style="color: #202124; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Discover other inspiring app and game founders featured in </span><a href="https://play.google.com/console/about/weareplay/" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">#WeArePlay</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">.</span></span></span></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-86132843570995905562025-12-08T10:00:00.001-08:002025-12-08T10:00:00.121-08:00Build for AI Glasses with the Android XR SDK Developer Preview 3 and unlock new features for immersive experiences<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFSept-RjL8jsyN7Noga30iavC1532Hdy58hXMGN8V30Togf-apI25pYImhCyCmeHoNw0ULO0WlP-AP38eWIy-gw1GL8vU4RmDUgxRGE2U4UU-eQSOLhl-_0VxL_BHzkFNgQLMaM6LXzXnSsMqX7mzNrCo9lCUtz4D90zVCBWfClzclKA0Xg3xTmU5mcU/s1600/XRRECAP_meta07.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFSept-RjL8jsyN7Noga30iavC1532Hdy58hXMGN8V30Togf-apI25pYImhCyCmeHoNw0ULO0WlP-AP38eWIy-gw1GL8vU4RmDUgxRGE2U4UU-eQSOLhl-_0VxL_BHzkFNgQLMaM6LXzXnSsMqX7mzNrCo9lCUtz4D90zVCBWfClzclKA0Xg3xTmU5mcU/s1600/XRRECAP_meta07.png" style="display: none;" />
<div class="separator" style="clear: both;"><img alt="" border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZqA9yEegNkwN1DNk5t5V4ZfNUersbje3_xly928hK3FsZQIV9Thu4UoihASw3Vq-biDu9r7HCb-IGqIwKmOmNUFYu4kIkDVAGFlc22LIXsecWngEtMLn2TYdWJLNpHxDCaYTqQ2orUQzXjrdY06IxbuG8V4HIuOHVWZYJCsWwBrMIjBrl9kg2SMLa4j4/s1600/XRANDROID_blogbanner07.png" /></div>
<p><em>Posted by Matthew McCullough – VP of Product Management, Android Developer</em></p><p>
</p><p></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">In October, Samsung launched </span><a href="https://android-developers.googleblog.com/2025/10/giving-your-apps-new-home-on-samsung.html" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Galaxy XR</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> - the first device powered by </span><a href="http://d.android.com/xr" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Android XR</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. And it’s been amazing seeing what some of you have been building! Here’s what some of our developers have been saying about their journey into Android XR.<br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"></span></p><blockquote><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Android XR gave us a whole new world to build our app within. Teams should ask themselves: What is the biggest, boldest version of your experience that you could possibly build? This is your opportunity to finally put into action what you’ve always wanted to do, because now, you have the platform that can make it real.</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: none; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt; text-align: right;"><a href="https://android-developers.googleblog.com/2025/10/how-calm-reimagined-mindfulness-for.html" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Kristen Coke, Calm, Lead Product Manager</span></a></p></li></ul></blockquote><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">You’ve also seen us share a first look at other upcoming devices that work with Android XR like Project Aura from </span><a href="http://www.xreal.com/aura" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">XREAL</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and </span><a href="https://blog.google/products/android/android-xr-gemini-glasses-headsets/" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">stylish glasses</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> from Gentle Monster and Warby Parker.<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">To support the expanding selection of XR devices, we are announcing </span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Android XR SDK Developer Preview 3!<br /><br /></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxTh3pDmqIviQqC09P6ykMbtwBELtW6jKamj2vnQKxhvsGL20OMo_QCDDbj8CwW1RnoJA8mD11Xmdx9Ep7WXio0cY4zUO2YgFRNBjdWo1T3bV4L1lr3DMgFArLBAOXXN8pFPou4VKEVViVJ2VsNlRaYA5sSmEmWDHGsu1obt0pktP3wWJh-RTYhyphenhyphenxI21c/s1914/image%20(8).png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1064" data-original-width="1914" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxTh3pDmqIviQqC09P6ykMbtwBELtW6jKamj2vnQKxhvsGL20OMo_QCDDbj8CwW1RnoJA8mD11Xmdx9Ep7WXio0cY4zUO2YgFRNBjdWo1T3bV4L1lr3DMgFArLBAOXXN8pFPou4VKEVViVJ2VsNlRaYA5sSmEmWDHGsu1obt0pktP3wWJh-RTYhyphenhyphenxI21c/s16000/image%20(8).png" /></a></div><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br />With Android XR SDK Developer Preview 3, on top of building </span><a href="https://d.android.com/develop/xr/explore/immersive" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 700; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">immersive experiences</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> for devices such as Galaxy XR, you can also now build </span><a href="https://d.android.com/develop/xr/explore/augmented" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 700; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">augmented experiences</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> for upcoming AI Glasses with Android XR. </span></p><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 16pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">New tools and libraries for augmented experiences</span></h3><span id="docs-internal-guid-0a1d69ef-7fff-2189-4cf1-2c1c35f32077" style="font-weight: normal;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-badd3785-7fff-4120-58e7-f456163b9dcd"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">With developer preview 3, we are unlocking the tools and libraries you need to build intelligent and hands-free augmented experiences for AI Glasses. AI Glasses are lightweight and portable for all day wear. You can extend your existing mobile app to take advantage of the built-in speakers, camera, and microphone to provide new, thoughtful and helpful user interactions. With the addition of a small display on display AI Glasses, you can privately present information to users. AI Glasses are perfect for experiences that can help enhance a user’s focus and presence in the real world.</span></span></p><br /></span><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 100%; max-width: 489px; overflow: hidden;"><img height="325.92041015625" src="https://blogger.googleusercontent.com/img/a/AVvXsEiCbPSdBaDtInebikXjdqP_n-dGgEvq-5HY9WYqJuN1qP4EcfBVlVqPlKcDZGr4hV8OEdrUz2FDgNCh2OriC9VvRO6_VdcZokcMhRdHFSD-qA29E0Dg-3ykow-CtyxAYzo6JLqIfeG5IA8hBWku4YPC2tKoBKZnkbIwHCv4VZ6AFZU6Tw_4oP3L-LR4Bb8" style="margin-left: 0px; margin-top: -63.9602px;" title="Betty_EVT_C17.3946.png" width="489" /></span></span></p><p><span>To power augmented experiences on AI Glasses, we are introducing two new, purpose-built libraries to the Jetpack XR SDK:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Jetpack Projected</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> - built to bridge mobile devices and AI Glasses with features that allow you to </span><a href="https://d.android.com/develop/xr/jetpack-xr-sdk/access-hardware" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">access sensors, speakers, and displays</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> on glasses</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: black; font-family: Arial, sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Jetpack Compose Glimmer</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> - new design language and </span><a href="https://d.android.com/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/whats-included#components" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">UI components</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> for crafting and styling your augmented experiences on display AI Glasses</span></p></li></ul><p><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Jetpack Compose Glimmer is a demonstration of design best practices for beautiful, optical see-through augmented experiences. With UI components optimized for the input modality and styling requirements of display AI Glasses, Jetpack Compose Glimmer is designed for clarity, legibility, and minimal distraction.<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 100%; max-width: 610px; overflow: hidden;"><img height="343" src="https://blogger.googleusercontent.com/img/a/AVvXsEim-mkK1LANoAOmgUaUXEf7FYXYHnarRV9iS3vTF3Mp-7eKsEDPd39SOR0Tcc07gvrKOQHSkpPZeJ9FJxdWoK6KkA-pdyWO3U73wkdg0ZfhhDb1STc0WdPj6psIRb9sSKEmzIzmeSjjqdVf21oFpiThNO6t4YNcTosi0A2efPmPxAhX0osJzfgTFUr-Zy0" style="margin-left: 0px; margin-top: 0px;" title="{"version8":true,"signature":"eyJraWQiOiJrdWw3SEEiLCJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjI5ODU1NjQsImZpbGVfa2V5IjoiVE44bmJFVG1oZXp5UU5FVHBMMklnaCIsIm5vZGVfaWQiOiI1MTAzOjI3MDMifQ.3n0mwlmuVTLoy3Wnphy_ulsOkWmFW1661ZKBoyyLT_GclAPTdIZvtgCOG38iKNjgZc5prPPuBtwPaSKtdnqrmg","nodeReference":{"fileKey":"TN8nbETmhezyQNETpL2Igh","nodeId":"5103:2703"},"staticImage":{"nodeHash":"v3:4647ac9e","exportScale":0.5,"exportSize":{"width":3840.0,"height":2160.0}}}" width="610" /></span></span></p><p><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">To help visualize and test your Jetpack Compose Glimmer UI we are introducing the AI Glasses emulator in </span><a href="https://developer.android.com/studio/preview" style="text-decoration-line: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Android Studio</span></a><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. The new AI Glasses emulator can simulate glasses-specific interactions such as touchpad and voice input. </span></p><div class="separator" style="clear: both; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><img border="0" data-original-height="1080" data-original-width="1080" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixZ4qT0AIxXpuUqZn7BZjR3qhnTYskCZArif2EjlKImlKIyi-M16Kydc8KKCcfCjkssHrbQMhM5KFhXJXoQJI_8BkT5mo-YA4uHnYrwum5wPfgX5Ui-_E0OkNNoZPreIkMjuXlro4FYhRuMx0JHAoZEHy-3CpTS5NvYjFULaz-JR273sXGTpbm7bMyX34/w320-h320/AI%20Glasses%20Emulator.gif" width="320" /><br /><br /></span></div><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Beyond the new Jetpack Projected and Jetpack Compose Glimmer libraries, we are also expanding </span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">ARCore for Jetpack XR</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to support AI Glasses. We are starting off with </span><a href="https://d.android.com/develop/xr/jetpack-xr-sdk/arcore/device-pose" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">motion tracking</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and </span><a href="https://d.android.com/develop/xr/jetpack-xr-sdk/arcore/geospatial" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">geospatial capabilities</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> for augmented experiences - the exact features that enable you to create helpful navigation experiences perfect for all-day-wear devices like AI Glasses.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span><br /></span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><img border="0" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Iz5j7cisV5ywyWny9vfusdASHp9jzIFAYYRW06LiTzHMlYKPWL1tFIX0XiabZmOXTg4Uw59vwqO-rn5XXSQxGc-VuTvZyZPRdGAI09FExxw6XDz_8yHvIWJ7U6Wuzq4fr1gVKM4K5zikGXMDfR92yHs-0czSatP6BGHFJ_O83JCMGFNgfuH3pwYjKNo/s16000/navigation.gif" /></span></div><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 16pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Expanding support for immersive experiences</span></h3><p><span id="docs-internal-guid-e8670ec3-7fff-dcb0-e041-c78790c54968"></span></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">We continue to invest in the libraries and tooling that power immersive experiences for </span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">XR Headsets</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> like Samsung Galaxy XR and wired </span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">XR Glasses</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> like the upcoming Project Aura from XREAL. We’ve been listening to your feedback and have added several highly-requested features to the </span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Jetpack XR SDK</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> since developer preview 2.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Jetpack SceneCore </span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">now features dynamic </span><a href="https://developer.android.com/develop/xr/tas-xr-gltf-model-materials" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">glTF model loading via URIs and improved materials</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> support for creating new PBR materials at runtime. Additionally, the </span><a href="https://developer.android.com/reference/androidx/xr/scenecore/SurfaceEntity" style="text-decoration: none;"><span face="Consolas,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">SurfaceEntity</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> component has been </span><a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/add-spatial-video#play-drm" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">enhanced with full Widevine Digital Rights Management</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> (DRM) support and new shapes, allowing it to </span><a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/add-spatial-video#play-180" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">render 360-degree and 180-degree videos</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> in spheres and hemispheres.<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">In </span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Jetpack Compose for XR</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, you'll find new features like the </span><a href="https://developer.android.com/develop/xr/tas-xr-user-subspace" style="text-decoration: none;"><span face="Consolas,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">UserSubspace</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> component for follow behavior, ensuring content remains in the user's view regardless of where they look. Additionally, you can now use </span><a href="https://developer.android.com/reference/kotlin/androidx/xr/compose/subspace/animation/SpatialTransitions" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">spatial animations</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> for smooth transitions like sliding or fading. And to support an expanding ecosystem of immersive devices with diverse display capabilities, you can now specify </span><a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/subspacemodifiers" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">layout sizes</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> as fractions of the user’s comfortable field of view.<br /><br /></span></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">In </span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Material Design for XR</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, new components automatically adapt spatially via </span><a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/material-design#use-enablexrcomponentoverrides" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">overrides</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. These include </span><a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/material-design#dialogs" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">dialogs</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> that elevate spatially, and </span><a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/material-design#navigation-bar" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">navigation bars</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, which pop out into an Orbiter. Additionally, there is a new </span><a href="https://developer.android.com/reference/kotlin/androidx/xr/compose/material3/package-summary?hl=en#SpaceToggleButton(androidx.compose.ui.Modifier,androidx.compose.material3.IconToggleButtonColors,kotlin.Function1)" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">SpaceToggleButton</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> component for easily transitioning to and from full space.<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">And in </span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">ARCore for Jetpack XR</span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, new perception capabilities have been added, including </span><a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/arcore/face" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">face tracking</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> with 68 blendshape values unlocking a world of facial gestures. You can also use </span><a href="https://developer.android.com/reference/kotlin/androidx/xr/arcore/Eye" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">eye tracking</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to power virtual avatars, and </span>
<a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/arcore/depth" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">depth maps</span></a>
<span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to enable more-realistic interactions with a user’s environment.<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">For devices like Project Aura from XREAL, we are introducing <span id="docs-internal-guid-79f0f1d5-7fff-a832-e90f-0d22b31889d8"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">the </span>
<a href="https://developer.android.com/studio/releases/emulator" style="text-decoration-line: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">XR Glasses emulator</span></a>
</span> in Android Studio. This essential tool is designed to give you accurate content visualization, while matching real device specifications for Field of View (FoV), Resolution, and DPI to accelerate your development. </span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span><br /></span><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><img border="0" data-original-height="1452" data-original-width="1954" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYN2K6DURKx0MbhKCTfnRMsMaoaYEubQjVZhS9R0pvM9nf5U1_tHfpzEGtOn8TkLdgo3yNKOb-SRTPoalnOF9wCjxwGm5gJYjTuG6bdsh8RaG1BCPv2bgj6n31ux0GL0VPcy9sSaMO070b5xI8oDuEu1wmCJ76HLYdC4udl6B6ish6qzHKZCRALxgBL-c/s16000/xrglasses-emulator-haxr-cropped(1).gif" /></span></div><p></p><p><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">If you build immersive experiences with </span><a href="https://unity.com/" style="text-decoration-line: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Unity</span></a><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, we’re also expanding your perception capabilities in the </span><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Android XR SDK for Unity</span><span face="Arial,sans-serif" style="color: black; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. In addition to lots of bug fixes and other improvements, we are expanding tracking capabilities to include: QR and ArUco codes, planar images, and body tracking (experimental). We are also introducing a much-requested feature: scene meshing. It enables you to have much deeper interactions with your user’s environment - your digital content can now bounce off of walls and climb up couches!</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">And that’s just the tip of the iceberg! Be sure to check out our </span><a href="https://developer.android.com/develop/xr/explore/immersive" style="text-decoration: none;"><span face="Arial,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">immersive experiences</span></a><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> page for more information.</span></p><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 16pt;"><span face="Arial,sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Get Started Today!</span></h3><span id="docs-internal-guid-36debaf7-7fff-687b-b08b-79330479efa3" style="font-weight: normal;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-fae66276-7fff-88ed-e7a3-0710347e5a5b"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The </span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Android XR SDK Developer Preview 3 is available today</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">! Download the latest </span><a href="https://developer.android.com/studio/preview" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Android Studio Canary</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (Otter 3, Canary 4 or later) and upgrade to the latest emulator version (36.4.3 Canary or later) and then visit </span><a href="http://developer.android.com/xr" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">developer.android.com/xr</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to get started with the latest libraries and </span><a href="https://developer.android.com/develop/xr/samples" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">samples</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> you need to build for the growing selection of Android XR devices. We’re building Android XR together with you! Don’t forget to share your </span><a href="https://d.android.com/develop/xr/support" style="text-decoration-line: none;"><span style="color: #1155cc; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">feedback, suggestions, and ideas</span></a><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> with our team as you progress on your journey in Android XR.</span></span></p><div><span face="Arial, sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></div></span><p></p>Birnahttp://www.blogger.com/profile/04044883525253664551[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-80021021800662376622025-12-08T10:00:00.000-08:002025-12-08T10:00:00.121-08:00Start building for glasses, new devices for Android XR and more in The Android Show | XR Edition<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_uj8mo8UEoRYNea9BVIFfqIICNMhxlYRwN-gcXlG81TIW2ldBKSdaSyFyOSyQGG3YloWJ1DFsnbDGBXuXPH8L2_z854jBLVFDPuSk68-8LlSUwVqOQhcMD0fHN-OT5Kzt0XpeWeEG77bFG4l2Q-bVz959ppTOC4a9Xu4tzH9ZXeANLtvvSueevnYphIo/s1600/XRRECAP_meta05.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_uj8mo8UEoRYNea9BVIFfqIICNMhxlYRwN-gcXlG81TIW2ldBKSdaSyFyOSyQGG3YloWJ1DFsnbDGBXuXPH8L2_z854jBLVFDPuSk68-8LlSUwVqOQhcMD0fHN-OT5Kzt0XpeWeEG77bFG4l2Q-bVz959ppTOC4a9Xu4tzH9ZXeANLtvvSueevnYphIo/s1600/XRRECAP_meta05.png" style="display: none;" />
<div class="separator" style="clear: both;"><img alt="" border="0" data-original-height="1253" data-original-width="4209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd6e4MFj1VRVlOR0VF3cAmg9hj72sRhXbO1Y2aYeNdUNGM1LZeriuzDgw9fFpOAmNz0ptiSJoON1qU4ge3tU4UnK9r-grVBo1CShTdR21KEiKeLZlXAvmwW_Vcrlh_w5SXfc_Og7fIA-Ue2rZgfe2Kh5Cc-v1VeMqIHyYkyOdvWGyB_acJP8qMrqmobNs/s1600/XRRECAP_blogbanner05.png" /></div>
<p><em>Posted by Matthew McCullough - VP of Product Management, Android Developer</em></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span></p><div class="separator" style="clear: both; text-align: center;"><span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><iframe allowfullscreen="" class="BLOG_video_class" height="413" src="https://www.youtube.com/embed/a3-OJxxW810" width="100%" youtube-src-id="a3-OJxxW810"></iframe></span></div><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br />Today, during </span><a href="https://blog.google/products/android/android-show-xr-edition-updates" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">The Android Show | XR Edition</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, we shared a look at the expanding </span><a href="http://d.android.com/xr" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Android XR platform</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, which is fundamentally evolving to bring a unified developer experience to the entire XR ecosystem. The latest announcements, from </span><a href="https://android-developers.googleblog.com/2025/12/build-for-ai-glasses-with-android-xr.html" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Developer Preview 3</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to exciting new form factors, are designed to give you the tools and platform you need to create the next generation of XR experiences. Let's dive into the details!</span><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 14pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">A spectrum of new devices ready for your apps</span></h3><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The Android XR platform is quickly expanding, providing more users and more opportunities for your apps. This growth is anchored by several new form factors that expand the possibilities for XR experiences.</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><img border="0" data-original-height="5464" data-original-width="7899" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilNqQy4i-LriFX9v07jF_YxGYSzZE8atlSH5PBMFOXYxscCgSqoRZSx7fu-JSQWDCWuK8Q7ewv8PYsanNB6rVO_ndA4yGRFTtYEAKEjYXQKrGDgu_9wBjdJBiHH5NCw6vW5r1KvNeB4_XWu91jKMH5wi1W3v50XLmkXWy2J3y_c4WwpPBEFaQGhlHLEi4/s16000/image_Lens_2024Q4_24H171x001_07_XR_Glasses_Talent_T_R01_QC.tif" style="max-width: 600px;" /></span></div><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span><p></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">A major focus is on lightweight, all-day wearables. At I/O, we announced we are working with Samsung and our partners Gentle Monster and Warby Parker to design stylish, lightweight AI glasses and Display AI glasses that you can wear comfortably all day. The integration of Gemini on glasses is set to unlock helpful, intelligent experiences like live translation and searching what you see.</span></p><div class="separator" style="clear: both; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><img border="0" data-original-height="360" data-original-width="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwjx8LdQJEcNqFsDYu5DAwm31L0zQeM5FXaynS1E1zUSXwvI4GQRIfmT_LL9gm1ZsBfQxiVQwYPk-_bBhoYdiD5-nllJQc-KbpaDyNFdAMT3TgkEIlW_edyDCRdgYE8S6RGHM1M4MGAAu6bTofcu6P0vI9rKj7xav5bqz309mhrxC0HuM-p6iAwbDLp20/s16000/Glasses%20-%20Universal%20Translator%20GIF.gif" /></span></div><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">And, partners like Uber are already exploring how AI Glasses can streamline the rider experience by providing simple, contextual directions and trip status right in the user’s view</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><img border="0" data-original-height="4500" data-original-width="6000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0WIGsJQomKsxL83jccIct-lkWVYPKQAj-TuFgahkglD2JhlTcVUoPJSCuEnBcJN723X7Cn7GidiPJu7qRydTCstLueCQbJp53w1u63QFigFRi6fUKDYZphNxlSN-TBXoXsU4asHi_IgY0SoOO6d83uQsyoG4AaYjgSXY0nFmhFfINCIZNLJQuuYneg8Y/s16000/Aura%20XREAL%20Glasses%20-%20Black%20Background.jpg" style="max-width: 600px;" /></span></div><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span><p></p><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The ecosystem is simultaneously broadening its scope to include wired XR glasses, exemplified by Project Aura from XREAL. This device blends the immersive experiences typically found in headsets with portability and real-world presence. Project Aura is scheduled for launch next year.</span><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 14pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">New tools unlock development for all form factors</span></h3><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">If you are developing for Android, you are already developing for Android XR. The release of Android XR SDK Developer Preview 3 brings increased stability for headset APIs and, most significantly, opens up development for AI Glasses. </span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"><img border="0" data-original-height="2160" data-original-width="3840" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioOWytZ5GDGdeuFkGVRwERBmYbLrzyblkTQ7b1mDUX3vrgS_nnyfbPD8Hy6b6ZrxqoFwnv31MTgd5dtdOtwS3TXAB7FEUMC1Fahy-nwk8wQxus9hh_TlmwQsmqjhDoQmL5phOecnxOqlQD-hA_nTtYQrUCDMjROC6opKRfhf_SaJLA0ktnceSK69DjQLA/s16000/glimmer-poster.png" style="max-width: 600px;" /></span></div><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"><br /></span><p></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">You can now build augmented experiences for AI glasses using new libraries like </span><a href="https://developer.android.com/develop/xr/jetpack-xr-sdk#jetpack-compose-glimmer" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Jetpack Compose Glimmer</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, a UI toolkit for transparent displays , and </span><a href="https://developer.android.com/develop/xr/jetpack-xr-sdk#jetpack-projected" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Jetpack Projected</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, which lets you extend your Android mobile app directly to glasses. Furthermore, the SDK now includes powerful </span><a href="https://developer.android.com/develop/xr/jetpack-xr-sdk/arcore" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">ARCore for Jetpack XR</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> updates, such as Geospatial capabilities for wayfinding.</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><br /><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><img border="0" data-original-height="900" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhucdz3WESm2xaYOxx_0veXDgkdr5oxclh294fS3OADqUsrGyG5_-TMZ3SSvdF3aCUOWIokEC55oUowE48TUZLFdDokGBFxnKKejdU265bfafLE3ceG00XLVg6vosowlEIl74EA8Or3Pi3Lzf79EYwvGnSKYcImQ-Xk5UdmAQdnmXoHMdeSxTCkJSe69Jg/s16000/image1.gif" style="max-width: 600px;" /></span></div><p></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><br /></p>
<p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">For immersive experiences on headsets and wired XR glasses like Project Aura from XREAL, this release also provides new APIs for detecting a device's field-of-view, helping your adaptive apps adjust their UI.</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Check out our post on the </span><a href="https://android-developers.googleblog.com/2025/12/build-for-ai-glasses-with-android-xr.html" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Android XR Developer Preview 3</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to learn more about all the latest updates. </span></p><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 14pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Expanding your reach with new engine ecosystems</span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The Android XR platform is built on the OpenXR standard, enabling integration with the tools you already use so you can build with your preferred engine.<br /><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Developers can utilize Unreal Engine's native Android and OpenXR capabilities, today, to build for Android XR leveraging the existing </span><a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/vr-template-in-unreal-engine" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">VR Template</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> for immersive experiences. To provide additional, optimized extensions for the Android XR platform, a Google vendor plug, including support for hand tracking, hand mesh, and more, will be released early next year.<br /><br /></span></p>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Godot now includes Android XR support, leveraging its focus on OpenXR to enable development for devices like Samsung Galaxy XR. The new </span><a href="https://store-beta.godotengine.org/asset/godot-xr/godot-openxr-vendors-plugin/" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Godot OpenXR vendor plugin v4.2.2</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> stable allows developers to port their existing projects to the platform. </span></p><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><img style="max-width: 600px;" border="0" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq3ce4gnjZtdPThhVCLndBdfXQ1wPF3fGzmocGJ4YRE4oAWlAD8Ln99KOsnDe2wvkM0b1xYFnQ5ksfh0hP9FiMMH3xikOSzKrhDnyjUsjIGKD3qUFvBxGkwnqX_WvQqKRFYM_Dle0hlQKygaSiAlaLIYGOYiOwP_vb64FFFgLK2dd1Gp_3jYFkeU4FFJ0/s16000/16_9_Launch%20Thumb%20-%20Glasses.png" /></div><br /></span><h3 dir="ltr" style="margin-bottom: 4pt; margin-top: 14pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Watch The Android Show | XR Edition</span></h3><p></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Thank you for tuning into the </span><a href="http://d.android.com/events/show" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">The Android Show | XR Edition</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. Start building differentiated experiences today using the </span><a href="https://android-developers.googleblog.com/2025/12/build-for-ai-glasses-with-android-xr.html" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Developer Preview 3 SDK</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and test your apps with the XR Emulator in Android Studio. Your feedback is crucial as we continue to build this platform together. Head over to </span><a href="http://developer.android.com/xr" style="text-decoration: none;"><span face="'Google Sans',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">developer.android.com/xr</span></a><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to learn more and share your feedback.</span></p><div><span face="'Google Sans',sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span></div><p></p>Birnahttp://www.blogger.com/profile/04044883525253664551[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-83163154043050958432025-12-04T10:37:00.000-08:002025-12-04T10:37:18.929-08:00Android Studio Otter 2 Feature Drop is stable!<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5lKYrnAXMqPfQH_kfCRWRp5iCWkTkzPkNM2n4QXw5D4nQfGDHc9NsEG4txBKEMQKhpwJiuQpN6E5rQ3sDOY9QXR_ckW15sQHRzJfPmaq1RctpRV9T5GoNS1iGSp94DeWlLQqqqehPOCJoZh8nQx_g31ynmJl8MtAW2Z_Fms1yxQPBmSRAQVDxsu1hEiw/s1600/Otter%20Meta-100.jpg" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5lKYrnAXMqPfQH_kfCRWRp5iCWkTkzPkNM2n4QXw5D4nQfGDHc9NsEG4txBKEMQKhpwJiuQpN6E5rQ3sDOY9QXR_ckW15sQHRzJfPmaq1RctpRV9T5GoNS1iGSp94DeWlLQqqqehPOCJoZh8nQx_g31ynmJl8MtAW2Z_Fms1yxQPBmSRAQVDxsu1hEiw/s1600/Otter%20Meta-100.jpg" style="display: none;" />
<i>Posted by Sandhya Mohan - Product Manager, Trevor Johns - Developer Relations Engineer</i><div><br /></div>
<div class="separator" style="clear: both;"><img alt="" border="0" data-original-height="1254" data-original-width="4210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxDTzramMrD0hL7eq0VoedShw7ViasoNILEXqpto1cgsJAnsgphb9CfhhlHHsKTk8GYIUtDc_wshDJBfq4MsxSDHLtGWNVKgoTEt2T3EwkVwlwJoJYVVjKPhMPFIEp_MkHpI4I4XIN_a8pPLhnqzf47F55Gk346HTNAOQL-zml7aJFSvsO0LKKB2WSlCg/s1600/Otter-100.jpg"/></div><div><br /></div>
<div><span id="docs-internal-guid-a57bb042-7fff-450d-e6f7-3c9bf33352da" style="font-family: inherit;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">The </span><span id="docs-internal-guid-0cc47311-7fff-bc36-bf1c-8c6daad22c3a"><a href="http://d.android.com/studio" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: "Google Sans Text", sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Android Studio Otter 2 Feature Drop</span></a></span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> is here to supercharge your productivity.</span></p></span><span style="font-family: inherit;"><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">This final stable release for ‘25 powers up Agent Mode, equipping it with the new Android Knowledge Base for improved accuracy, and giving you the option to try out the new Gemini 3 model. You’ll also be able to take advantage of new settings such as the ability to keep your personalized IDE environment consistent across all of your machines. We've also incorporated all of the latest stability and performance improvements from the IntelliJ IDEA 2025.2 platform, including Kotlin compiler and terminal improvements, making this a significant enhancement for your development workflow.</span></p><br /><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-285db7bb-7fff-2a95-2656-88826fecac09"><span style="color: blue; font-family: "Google Sans Text", sans-serif; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Updates to Agent Mode</span></span></p></span><div><br /></div><b><span>Access to Gemini 3</span></b></div><div><b><br /></b><span style="font-family: inherit;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">We recently introduced the ability to use our latest model, Gemini 3 Pro Preview, within Android Studio. This is our best model for coding and agentic capabilities. It’ll give you superior performance in Agent Mode and advanced problem-solving capabilities so you can focus on what you do best: creating high quality apps for your users.</span></p><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">We are beginning to roll out limited Gemini 3 access (with a 1 million token size window) to developers who are using the no-cost default model. For higher usage rate limits and longer sessions with Agent Mode, you can add a paid Gemini API Key or use a Gemini Code Assist Enterprise plan. Learn more about how to </span><a href="https://android-developers.googleblog.com/2025/11/gemini-3-is-now-available-for-ai.html" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">get started with Gemini 3</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><br /></span></p></span><b><span style="font-size: medium;">Enhance Agent Mode with Android knowledge</span></b></div><div><span style="font-family: inherit;"><span style="font-size: medium;"><b><br /></b></span><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">While the training of large language models provides deep knowledge that is excellent for common tasks—like creating Compose UIs—training concludes on a fixed date, resulting in gaps for new libraries and updated best practices. They are also less effective with niche APIs because the necessary training data is scarce. To fix this, Android Studio’s Agent Mode is now equipped with the </span><a href="https://developer.android.com/r/studio-ui/gemini/android-knowledge-base" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Android Knowledge Base</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, a new feature designed to significantly improve accuracy and reduce hallucinations by grounding responses with authoritative documentation. This means that instead of just relying on its training data, the agent can actively consult fresh documentation from official sources like the Android developer docs, Firebase, Google Developers, and Kotlin docs before it answers you.</span></p><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">The information in the Android Knowledge Base is stored in Android Studio and its content is automatically updated in the background on a periodic basis, so this feature is available regardless of which LLM you’re using for AI assistance.</span></p><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="border: none; display: inline-block; overflow: hidden;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEgRKLR3Jrnps6lcFs7anhtVfM0Q0CnvvJARUYl8PT6jPhmLt-Kwr04caHuUSMkZ0ib0SICm6V2fH9eVFvQaeZZQGioBzyiTdNeFNW2zrrhPI6WAZmTh09_JrZvFc2cQZGS-VsYYyA6vKXhV69IwsnzZnkOXO9sTtRdVXHFPujV6Icge1lLLKFNKPVjqST4" style="margin-left: 0px; margin-top: 0px;" /></span></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans Text", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Gemini searching documentation before it answers you</span></p><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">This feature will be invoked automatically when Agent Mode detects a need for additional context, and you’ll see additional explanatory text. However, if you'd like Agent Mode to reference documentation more frequently, you can include a line such as "Refer to Android documentation for guidance" in your </span><a href="https://developer.android.com/studio/gemini/rules" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Rules configuration</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">.</span></p><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Requested settings updates</span></p><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans Text", sans-serif" style="font-size: medium; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Backup and Sync</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><a href="https://developer.android.com/studio/intro/studio-config#ExportImportSettings" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Backup and Sync</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> is a new way to keep your personalized Android Studio environment consistent across all your installations. You can now back up your settings—including your preferred keymaps, Code Editor settings, system settings, and more—to cloud storage using your Google Account, giving you a seamless experience wherever you code. We also support Backup and Sync using JetBrains accounts for developers using both IntelliJ and Android Studio installs simultaneously.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 15pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="border: none; display: inline-block; overflow: hidden;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEg6eK6sPCMldtQONMqZnuzjMe_o2BgK2OisYXlzB75v5sQsyl86eO72p1-IeOOPLoBOQzbL9j1sbe5h2QT0QugbHFwEV363CX1XrxqT0jewegrvaIi5IzVUrD7ri3q9O3AEKj1YogwX419WkPHcHHQ74mWqI5rdmege5psPDvqcXoM4MZ14gw5wG_lvcPY" style="margin-left: 0px; margin-top: 0px;" /></span></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Backup and Sync</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Getting started is simple. Just sign into your Google Account by clicking the avatar in the top-right corner of the IDE, or navigate to </span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Settings > Backup and Sync</span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. Once you authorize Android Studio to access your account's storage, you have full control over which categories of app data you want to sync. If you're syncing for the first time on a new machine, Android Studio will give you the option to either download your existing remote settings or upload your current local settings to the cloud. Of course, if you change your mind, you can easily disable Backup and Sync at any time from the settings menu. This feature has been available since the first Android Studio Otter release.</span></p></span><span style="font-size: medium;"><b><div><span style="font-size: medium;"><b><br /></b></span></div>Communications from Android Studio</b></span><span style="font-family: inherit;"><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">You can now opt in to receive communications directly from the Android Studio team. This enables you to get emails and notifications about important product updates, new features, and new libraries as soon as they're available.</span></p><p dir="ltr" style="margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">You'll see this option when you sign in, and you can change your preference at any time by going to </span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline;">Settings > Tools > Google Accounts > Communications</span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"><span style="border: none; display: inline-block; overflow: hidden;"><img src="https://blogger.googleusercontent.com/img/a/AVvXsEiKIE-LWPqwq3lnagzQ6xoKEIlSlFFr_ugBPHi_v0xPvIEGt5duykwcRHJPpj2SebR3YOZk0m8SvW4xdrIXbaOBYi0CWlVhE-7VqBEN7HI9eHD3pOEdEQhKHtNcxQHPjowbsPUzL4o01UL10PGG6wxWwq83Y6RQOKoWx4gMwawHVktn70bzlch4tIDWcP8" style="margin-left: 0px; margin-top: 0px;" /></span></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans Text", sans-serif" style="font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Your option to receive emails and notifications</span></p></span><span style="font-size: medium;"><b><div><span style="font-size: medium;"><b><br /></b></span></div>IntelliJ Merge Updates</b></span></div><div><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">This release incorporates all stability and quality improvements from the </span><a href="https://www.jetbrains.com/idea/whatsnew/2025-2/" style="font-family: inherit; text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">IntelliJ IDEA 2025.2 platform</span></a><span style="font-family: inherit; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. Notable highlights include:</span></div><div><span style="font-family: inherit;"><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 12pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Kotlin K2 Mode:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> Following its rapid adoption after being enabled by default, the K2 Kotlin mode is now more stable and performant. This version improves Kotlin code analysis stability, adds new inspections, and enhances the reliability of Kotlin script execution.</span></p></li><li aria-level="1" dir="ltr" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 12pt; margin-top: 0pt;"><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-wrap-mode: wrap; vertical-align: baseline;">Terminal Performance:</span><span style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap-mode: wrap; vertical-align: baseline;"> The integrated terminal is significantly faster, with major improvements in rendering. For Bash and Zsh, this update also introduces minor visual refinements without compromising or altering core shell behavior.</span></p></li></ul></span><span style="font-size: medium;"><b>Get started</b></span></div><div><span style="font-family: inherit;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">Ready to dive in and accelerate your development? </span><a href="https://developer.android.com/studio" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Download</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> Android Studio Otter 2 Feature Drop and start exploring these powerful new features today! As always, your feedback is crucial to us. </span><a href="https://developer.android.com/studio/known-issues" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Check known issues</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, </span><a href="https://developer.android.com/studio/report-bugs" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">report bugs</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, </span><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">and be part of our vibrant community on </span><a href="https://www.linkedin.com/showcase/androiddev/posts/?feedView=all" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">LinkedIn</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;"> </span><a href="https://medium.com/androiddevelopers" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">Medium</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, </span><a href="https://www.youtube.com/c/AndroidDevelopers/videos" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">YouTube</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">, or </span><a href="https://twitter.com/androidstudio" style="text-decoration-line: none;"><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline;">X</span></a><span face=""Google Sans Text", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline;">. Let's build the future of Android apps together!</span></span></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-52043131425773796322025-12-03T12:34:00.000-08:002025-12-03T16:15:40.447-08:00What's new in the Jetpack Compose December '25 release<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWJo8Rk7xQa38__wsx8UhStK6U4hs6o5bPhU2znx3sxDVfm535_JEMfsZpeT9KrV0LJiSJfmqAX9ozEyfNqttUBDWOr-Vg2bZAcoxSG2J9CYoEvBXKy-iC_MM3lOMdUPdJqy9RtDebSlZDePcfdU-kYRJ7Ews4IA_irDN5rHhfs-CNyCc9g_0fQq9Yyhs/s1600/Social%20-%20Android%20-%20Jetpack%20Compose%20January%20%E2%80%9924.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWJo8Rk7xQa38__wsx8UhStK6U4hs6o5bPhU2znx3sxDVfm535_JEMfsZpeT9KrV0LJiSJfmqAX9ozEyfNqttUBDWOr-Vg2bZAcoxSG2J9CYoEvBXKy-iC_MM3lOMdUPdJqy9RtDebSlZDePcfdU-kYRJ7Ews4IA_irDN5rHhfs-CNyCc9g_0fQq9Yyhs/s1600/Social%20-%20Android%20-%20Jetpack%20Compose%20January%20%E2%80%9924.png" style="display: none;" />
<i>Posted by Nick Butcher, Jetpack Compose Product Manager</i><div><i><br /></i></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaOFQLkqCBaw0FA8C7XCI7gKe-Z79r2dYH9QUOnWyZq_Qevh-EoHqRs6zTENmzLjHwKk_ECQlN_2EePI8-JyjCVH3PL2rOsbRdfKNZ6TGuDJhTUzrQBofdpb7zNdIqwVM-UmoURg2vD8cxJ_ER9T3qukCndgqZKaZZXFFV-T5pbUPsRMgsebGvB4-_BQo/s1600/Header%20-%20Android%20-%20Jetpack%20Compose%20January%20%E2%80%9924.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="476" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaOFQLkqCBaw0FA8C7XCI7gKe-Z79r2dYH9QUOnWyZq_Qevh-EoHqRs6zTENmzLjHwKk_ECQlN_2EePI8-JyjCVH3PL2rOsbRdfKNZ6TGuDJhTUzrQBofdpb7zNdIqwVM-UmoURg2vD8cxJ_ER9T3qukCndgqZKaZZXFFV-T5pbUPsRMgsebGvB4-_BQo/s16000/Header%20-%20Android%20-%20Jetpack%20Compose%20January%20%E2%80%9924.png" /></a></div><br /><i><br /></i></div><div><i><br /></i></div><div><span id="docs-internal-guid-9454a1cf-7fff-47e9-ab5a-a0fa354c8bd5"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Today, the </span><a href="https://developer.android.com/jetpack/androidx/releases/compose" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Jetpack Compose December ‘25 release</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> is stable. This contains version 1.10 of the core Compose modules and version 1.4 of Material 3 (see the full </span><a href="https://developer.android.com/develop/ui/compose/bom/bom-mapping" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">BOM mapping</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">), adding new features and major performance improvements.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b id="docs-internal-guid-d06eb790-7fff-6e1f-de84-2aa08cbd9699" style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">To use today’s release, upgrade your Compose BOM version to </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">2025.12.00</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">:</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none;"><colgroup></colgroup><tbody><tr style="height: 0pt;"><td style="background-color: #fafafa; border-bottom: solid #e0e0e0 1pt; border-color: rgb(224, 224, 224); border-left: solid #e0e0e0 1pt; border-right: solid #e0e0e0 1pt; border-style: solid; border-top: solid #e0e0e0 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="Consolas,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">implementation</span><span face="Consolas,sans-serif" style="background-color: transparent; color: #616161; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(</span><span face="Consolas,sans-serif" style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">platform</span><span face="Consolas,sans-serif" style="background-color: transparent; color: #616161; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(</span><span face="Consolas,sans-serif" style="background-color: transparent; color: #0f9d58; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">"androidx.compose:compose-bom:2025.12.00"</span><span face="Consolas,sans-serif" style="background-color: transparent; color: #616161; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">))</span></p></td></tr></tbody></table></div><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /><br /></b></p><h2 dir="ltr" style="margin-bottom: 0pt; margin-top: 4pt;"><span id="docs-internal-guid-941a542e-7fff-6251-03d1-3163db964ca9" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Performance improvements</span></span></h2><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">We know that the runtime performance of your app is hugely important to you and your users, so performance has been a major priority for the Compose team. This release brings a number of improvements—and you get them all by just upgrading to the latest version. Our internal scroll benchmarks show that Compose now matches the performance you would see if using Views:</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><span style="border: none; display: inline-block; height: 100%; max-width: 610px; overflow: hidden;"><img height="343" src="https://blogger.googleusercontent.com/img/a/AVvXsEhmNWZbGEVpwg-kdd6kw9Ay8TyOjGS226GxU1oNQQCI0IBJ1aj_Pze-SQ0z9LGywbdbzIROkIv6hxKKMIXJ0sBs-q5U_cv-yslsXFRzdRihM0MxWI3q2j-LURfcILGe7i9KodgjuGgUkAoeeZspHUa11iDkAiJTs295rxSDtgSWK0VSEofLt2MWburL7II" style="margin-left: 0px; margin-top: 0px;" width="610" /></span></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Scroll performance benchmark comparing Views and Jetpack Compose across different versions of Compose</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><h3 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-3ad88413-7fff-89d4-dcc7-838e13ee5c3d" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Pausable composition in lazy prefetch</span></span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Pausable composition in lazy prefetch is now enabled by default. This is a fundamental change to how the Compose runtime schedules work, designed to significantly reduce jank during heavy UI workloads.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Previously, once a composition started, it had to run to completion. If a composition was complex, this could block the main thread for longer than a single frame, causing the UI to freeze. With pausable composition, the runtime can now "pause" its work if it's running out of time and resume the work in the next frame. This is particularly effective when used with lazy layout prefetch to prepare frames ahead of time. The Lazy layout </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/foundation/lazy/package-summary#rememberLazyListState(androidx.compose.foundation.lazy.layout.LazyLayoutCacheWindow,kotlin.Int,kotlin.Int)" style="text-decoration: none;"><span face="Consolas,sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">CacheWindow</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> APIs introduced in Compose 1.9 are a great way to prefetch more content and benefit from pausable composition to produce much smoother UI performance.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaE5BKUo2mBxNKAmgD8nnrrbooEAbjCSxsGJbJx6DgTmMPx8BmTWsOg2I2_FXcOODSG8OAX31ueJfgipH2zdF1Y3v6CcIXGW3mWiWcHbemqnmVO-IYWKVJ-V6CiD9LDo_35nqyWrDgK3Y_HOdUDfL8StGnfgg34Ia6wda1bXoDT3xhMQb8w2hn_d2gLhQ/s1080/pausable.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="608" data-original-width="1080" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaE5BKUo2mBxNKAmgD8nnrrbooEAbjCSxsGJbJx6DgTmMPx8BmTWsOg2I2_FXcOODSG8OAX31ueJfgipH2zdF1Y3v6CcIXGW3mWiWcHbemqnmVO-IYWKVJ-V6CiD9LDo_35nqyWrDgK3Y_HOdUDfL8StGnfgg34Ia6wda1bXoDT3xhMQb8w2hn_d2gLhQ/s16000/pausable.gif" /></a></div><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Pausable composition combined with Lazy prefetch help reduce jank</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">We’ve also optimized performance elsewhere, with improvements to </span><span style="background-color: transparent; color: #188038; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Modifier.onPlaced</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, </span><span style="background-color: transparent; color: #188038; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Modifier.onVisibilityChanged</span><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #188038; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">,</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and other modifier implementations. We’ll continue to invest in improving the performance of Compose.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><h2 dir="ltr" style="margin-bottom: 0pt; margin-top: 4pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #434343; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">New features</span></h2><h2 dir="ltr" style="margin-bottom: 0pt; margin-top: 4pt;"><span id="docs-internal-guid-fb59cdd3-7fff-b261-7a9d-8bc61412606c" style="font-weight: normal;"></span></h2><h3 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #434343; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">Retain</span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Compose offers a number of APIs to hold and manage state across different lifecycles; for example, </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">remember</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> persists state across compositions, and </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">rememberSavable</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">/</span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">rememberSerializable</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to persist across activity or process recreation. </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/runtime/retain/package-summary#retain(kotlin.Function0)" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">retain</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> is a new API that sits between these APIs, enabling you to persist values across configuration changes without being serialized, but not across process death. As </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">retain</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> does not serialize your state, you can persist objects like lambda expressions, flows, and large objects like bitmaps, which cannot be easily serialized. For example, you may use </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">retain</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to manage a media player (such as ExoPlayer) to ensure that media playback doesn’t get interrupted by a configuration change.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p>
<div style="background-color: whitesmoke; border-radius: 8px; padding: 16px;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">@Composable</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">fun </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">MediaPlayer() {</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">val </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">applicationContext = LocalContext.current.applicationContext</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">val </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">exoPlayer = </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">retain</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> { ExoPlayer.Builder(applicationContext).apply { ... }.build() }</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> ...</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></p></div>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">We want to extend our thanks to the AndroidDev community (especially the </span><a href="https://slackhq.github.io/circuit" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Circuit</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> team), who have influenced and contributed to the design of this feature.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><h3 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-bfdcbd78-7fff-d2a5-94fb-fdc28c74aba6" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Material 1.4</span></span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Version 1.4.0 of the </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">material3</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> library adds a number of new components and enhancements:</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: #434343; font-family: "Google Sans Text", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">TextField</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> now offers an experimental </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">TextFieldState</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> based version, which provides a </span><a href="https://developer.android.com/develop/ui/compose/text/user-input" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">more robust</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> method for managing text's state. In addition, new </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary#OutlinedSecureTextField(androidx.compose.foundation.text.input.TextFieldState,androidx.compose.ui.Modifier,kotlin.Boolean,androidx.compose.ui.text.TextStyle,androidx.compose.material3.TextFieldLabelPosition,kotlin.Function1,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Boolean,androidx.compose.foundation.text.input.InputTransformation,androidx.compose.foundation.text.input.TextObfuscationMode,kotlin.Char,androidx.compose.foundation.text.KeyboardOptions,androidx.compose.foundation.text.input.KeyboardActionHandler,kotlin.Function2,androidx.compose.ui.graphics.Shape,androidx.compose.material3.TextFieldColors,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.interaction.MutableInteractionSource)" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">SecureTextField</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary#OutlinedSecureTextField(androidx.compose.foundation.text.input.TextFieldState,androidx.compose.ui.Modifier,kotlin.Boolean,androidx.compose.ui.text.TextStyle,androidx.compose.material3.TextFieldLabelPosition,kotlin.Function1,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Function0,kotlin.Boolean,androidx.compose.foundation.text.input.InputTransformation,androidx.compose.foundation.text.input.TextObfuscationMode,kotlin.Char,androidx.compose.foundation.text.KeyboardOptions,androidx.compose.foundation.text.input.KeyboardActionHandler,kotlin.Function2,androidx.compose.ui.graphics.Shape,androidx.compose.material3.TextFieldColors,androidx.compose.foundation.layout.PaddingValues,androidx.compose.foundation.interaction.MutableInteractionSource)" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">OutlinedSecureTextField</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> variants are now offered. The material </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Text</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> composable now supports </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">autoSize</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> behaviour.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #434343; font-family: "Google Sans Text", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The carousel component now offers a new </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/material3/carousel/package-summary#HorizontalCenteredHeroCarousel(androidx.compose.material3.carousel.CarouselState,androidx.compose.ui.Modifier,androidx.compose.ui.unit.Dp,androidx.compose.ui.unit.Dp,androidx.compose.foundation.gestures.TargetedFlingBehavior,kotlin.Boolean,androidx.compose.ui.unit.Dp,androidx.compose.ui.unit.Dp,androidx.compose.foundation.layout.PaddingValues,kotlin.Function2)" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">HorizontalCenteredHeroCarousel</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><a href="https://m3.material.io/components/carousel/specs" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">variant</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #434343; font-family: "Google Sans Text", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary?_gl=1*1h4dj5y*_up*MQ..*_ga*NDE1MzI0NzAwLjE3NjQ2MTM1MzU.*_ga_6HH9YJMN9M*czE3NjQ2MTM1MzQkbzEkZzAkdDE3NjQ2MTM1MzQkajYwJGwwJGgxODIyOTM4OTMy#TimePicker(androidx.compose.material3.TimePickerState,androidx.compose.ui.Modifier,androidx.compose.material3.TimePickerColors,androidx.compose.material3.TimePickerLayoutType)" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">TimePicker</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> now supports switching between the picker and input modes.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #434343; font-family: "Google Sans Text", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">A </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary#VerticalDragHandle(androidx.compose.ui.Modifier,androidx.compose.material3.DragHandleSizes,androidx.compose.material3.DragHandleColors,androidx.compose.material3.DragHandleShapes,androidx.compose.foundation.interaction.MutableInteractionSource)" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">vertical drag handle</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> helps users to change an adaptive pane’s size and/or position.</span></p></li></ul><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /><br /></b></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTrvNyW_IJgSIqBWYlzweN3mkoZ_Uc3IMNj2Pu0cC1VdVqnja4nHA6kSCO2nk44MBi2diWEPu_oe0ozm2Jxh5jjXyJ7uqHdrdkyTrDaCgIifMpHLK9q3stUhD79QuLc7q_V4EisrNR7t4I3SMAxSq57EVzk8PGqiouXPRc-wI9Pu03vbuDU3_rnrA4THc/s856/centered-hero-carousel.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="539" data-original-width="856" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTrvNyW_IJgSIqBWYlzweN3mkoZ_Uc3IMNj2Pu0cC1VdVqnja4nHA6kSCO2nk44MBi2diWEPu_oe0ozm2Jxh5jjXyJ7uqHdrdkyTrDaCgIifMpHLK9q3stUhD79QuLc7q_V4EisrNR7t4I3SMAxSq57EVzk8PGqiouXPRc-wI9Pu03vbuDU3_rnrA4THc/s16000/centered-hero-carousel.gif" /></a></div><br /><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Horizontal centered hero carousel</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Note that </span><a href="https://m3.material.io/blog/building-with-m3-expressive" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Material 3 Expressive</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> APIs continue to be developed in the alpha releases of the </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">material3</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> library. To learn more, see this recent talk:</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"> </p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="413" src="https://www.youtube.com/embed/t9rrsqfB2tM" width="100%" youtube-src-id="t9rrsqfB2tM"></iframe></div><br /><p></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><h2 dir="ltr" style="margin-bottom: 0pt; margin-top: 4pt;"><span id="docs-internal-guid-af66d5d1-7fff-f896-0b73-dd8d41e4481c" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">New animation features</span></span></h2><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">We continue to expand on our animation APIs, including updates for customizing shared element animations.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><h3 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-fd3b1475-7fff-2406-680c-6eade430f928" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Dynamic shared elements</span></span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">By default, </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">sharedElement()</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">sharedBounds()</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> animations attempt to animate</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">layout changes whenever a matching key is found in the target state. However, you may want to disable this animation dynamically based on certain conditions, such as the direction of navigation or the current UI state.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">To control whether the shared element transition occurs, you can now customize the</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">SharedContentConfig</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> passed to </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">rememberSharedContentState()</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. The </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">isEnabled</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">property determines if the shared element is active.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p>
<div style="background-color: whitesmoke; border-radius: 8px; padding: 16px;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">SharedTransitionLayout {</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">val</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> transition = updateTransition(currentState)</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> transition.AnimatedContent { targetState -></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #b80672; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// Create the configuration that depends on state changing.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">fun</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> animationConfig() : SharedTransitionScope.SharedContentConfig {</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">return</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">object</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> : SharedTransitionScope.SharedContentConfig {</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">override</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">val</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> SharedTransitionScope.SharedContentState.</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">isEnabled</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">: </span><span style="background-color: transparent; color: #9334e6; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Boolean</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">get</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">() =</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #b80672; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// determine whether to perform a shared element transition</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> }</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> }</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></p></div>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">See the </span><a href="https://developer.android.com/develop/ui/compose/animation/shared-elements/customize#dynamic-enable-disable" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">documentation</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> for more.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><h3 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-8d6a58b5-7fff-4625-8851-63026f715639" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Modifier.skipToLookaheadPosition()</span></span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">A new modifier, </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/animation/SharedTransitionScope?hl=en#(androidx.compose.ui.Modifier).skipToLookaheadPosition(kotlin.Function0)" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Modifier.skipToLookaheadPosition()</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, has been added in this release, which keeps the final position of a composable when performing shared element animations. This allows for performing transitions like “reveal” type animation, as can be seen in the Androidify sample with the progressive reveal of the camera. See the video tip here for more information: </span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><iframe allowfullscreen="" class="BLOG_video_class" height="413" src="https://www.youtube.com/embed/0moEXBqNDZI" width="100%" youtube-src-id="0moEXBqNDZI"></iframe></span></div><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span><p></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><h3 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-86a57c8b-7fff-66fc-7238-cbda30084e61" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Initial velocity in shared element transitions</span></span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This release adds a new shared element transition API, </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">prepareTransitionWithInitialVelocity</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, which lets you pass an initial velocity (e.g. from a gesture) to a shared element transition:</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p>
<div style="background-color: whitesmoke; border-radius: 8px; padding: 16px;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Modifier.fillMaxSize()</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.draggable2D(</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">rememberDraggable2DState</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">offset</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">+=</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">it</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">},</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">onDragStopped</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">=</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">velocity</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">-></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #b80672; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// Set up the initial velocity for the upcoming shared element</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #b80672; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// transition.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">sharedContentStateForDraggableCat</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">?.</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">prepareTransitionWithInitialVelocity</span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">(velocity)</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">showDetails</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">=</span><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">false</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">},</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Google Sans Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">)</span></p></div>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /><br /><br /></b></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-XdYTEA7H5BokZRoo_npAvjuSLPP3cXifTSHtonoHiuQVtav1w9ZKhIqlxQJKeX9AxyQnR0HjSe3t1Sy02jdMYiWI_mg1VoJST55CAKgBtkvHpgRatXJobhPVoimLQCJ-F6dfLRDt75vJANi46D4MhobglqRG7rSFb3VqglLcE6rNLx3c02Vzqiqr6IY/s1200/fling-shared.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="540" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-XdYTEA7H5BokZRoo_npAvjuSLPP3cXifTSHtonoHiuQVtav1w9ZKhIqlxQJKeX9AxyQnR0HjSe3t1Sy02jdMYiWI_mg1VoJST55CAKgBtkvHpgRatXJobhPVoimLQCJ-F6dfLRDt75vJANi46D4MhobglqRG7rSFb3VqglLcE6rNLx3c02Vzqiqr6IY/w288-h640/fling-shared.gif" width="288" /></a></div><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">A shared element transition that starts with an initial velocity from a gesture</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /><br /></b></p><h3 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-4ed3ac80-7fff-9884-a33d-6bbcd5ac8b5b" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Veiled transitions</span></span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/reference/kotlin/androidx/compose/animation/EnterTransition" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">EnterTransition</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/animation/ExitTransition?_gl=1*1m00og2*_up*MQ..*_ga*MjU3NDMyNzc5LjE3NjQ2MTE4NjM.*_ga_6HH9YJMN9M*czE3NjQ2MTE4NjMkbzEkZzAkdDE3NjQ2MTE4NjMkajYwJGwwJGgxMTk2NzM1MDk0" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">ExitTransition</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> define how an </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/animation/package-summary#AnimatedVisibility(kotlin.Boolean,androidx.compose.ui.Modifier,androidx.compose.animation.EnterTransition,androidx.compose.animation.ExitTransition,kotlin.String,kotlin.Function1)" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">AnimatedVisibility</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">/</span><a href="https://developer.android.com/reference/kotlin/androidx/compose/animation/package-summary?_gl=1*18ofha4*_up*MQ..*_ga*MjU3NDMyNzc5LjE3NjQ2MTE4NjM.*_ga_6HH9YJMN9M*czE3NjQ2MTE4NjMkbzEkZzAkdDE3NjQ2MTIyMjEkajYwJGwwJGgxMTk2NzM1MDk0#AnimatedContent(kotlin.Any,androidx.compose.ui.Modifier,kotlin.Function1,androidx.compose.ui.Alignment,kotlin.String,kotlin.Function1,kotlin.Function2)" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">AnimatedContent</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> composable appears or disappears. A new experimental </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">veil</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> option allows you to specify a color to veil or scrim content; e.g., fading in/out a semi-opaque black layer over content:</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhemyKNMNnK50HVISQJlCz4fXPkkckq-ZdOgB3f8dolMzDe6UgCGq3_nVQhdfNb8au6cL00LHR0EJIQqxOQnnCXNSs8284eIMGroEp1V_F48JHkIk_kzPiYAov-nI3LAIG0_XXNjVQUIXwDvgH_rdMgF9wn_u605WU8oOD-uW-MSVKUHzyekqYsnFrEqms/s760/veil_2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="760" data-original-width="360" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhemyKNMNnK50HVISQJlCz4fXPkkckq-ZdOgB3f8dolMzDe6UgCGq3_nVQhdfNb8au6cL00LHR0EJIQqxOQnnCXNSs8284eIMGroEp1V_F48JHkIk_kzPiYAov-nI3LAIG0_XXNjVQUIXwDvgH_rdMgF9wn_u605WU8oOD-uW-MSVKUHzyekqYsnFrEqms/w304-h640/veil_2.gif" width="304" /></a></div><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><br /></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #666666; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Veiled animated content – note the semi-opaque veil (or scrim) over the grid content during the animation</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p>
<div style="background-color: whitesmoke; border-radius: 8px; padding: 16px;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">AnimatedContent(</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> targetState = page,</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> modifier = Modifier.fillMaxSize().weight(</span><span style="background-color: transparent; color: #c5221f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">1f</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">),</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> transitionSpec = {</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">if</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> (targetState > initialState) {</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> (slideInHorizontally { </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">it</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> } togetherWith</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> slideOutHorizontally { -it / </span><span style="background-color: transparent; color: #c5221f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">2</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> } + </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">veilOut(targetColor = veilColor)</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">)</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> } </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">else</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> {</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> slideInHorizontally { -it / </span><span style="background-color: transparent; color: #c5221f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">2</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> } +</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">unveilIn(initialColor = veilColor)</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> togetherWith slideOutHorizontally { </span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">it</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> }</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> }</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> },</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">) { targetPage -></span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> ...</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></p></div>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /><br /></b></p><h2 dir="ltr" style="margin-bottom: 0pt; margin-top: 4pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #434343; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">Upcoming changes</span></h2><h2 dir="ltr" style="margin-bottom: 0pt; margin-top: 4pt;"><span id="docs-internal-guid-3ccc5193-7fff-c451-bbeb-0cb591d55def" style="font-weight: normal;"><br /></span></h2><h3 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans',sans-serif" style="background-color: transparent; color: #434343; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline; white-space: pre;">Deprecation of Modifier.onFirstVisible</span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Compose 1.9 introduced </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier#%28androidx.compose.ui.Modifier%29.onVisibilityChanged%28kotlin.Long,kotlin.Float,androidx.compose.ui.layout.LayoutBoundsHolder,kotlin.Function1%29" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Modifier.onVisibilityChanged</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and </span><a href="https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier#%28androidx.compose.ui.Modifier%29.onFirstVisible%28kotlin.Long,kotlin.Float,androidx.compose.ui.layout.LayoutBoundsHolder,kotlin.Function0%29" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Modifier.onFirstVisible</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. After reviewing your feedback, it became apparent that the contract of </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Modifier.onFirstVisible</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> was not possible to honor deterministically; specifically, when an item </span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">first</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> becomes visible. For example, a Lazy layout may dispose of items that scroll out of the viewport, and then compose them again if they scroll back into view. In this circumstance, the </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">onFirstVisible</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> callback would fire again, as it is a newly composed item. Similar behavior would also occur when navigating back to a previously visited screen containing </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">onFirstVisible</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. As such, we have decided to deprecate this modifier in the </span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">next</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> Compose release (1.11) and recommend migrating to </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">onVisibilityChanged</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. See the </span><a href="https://developer.android.com/develop/ui/compose/layouts/visibility-modifiers" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">documentation</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> for more information.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><h3 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span id="docs-internal-guid-0e044739-7fff-e522-1390-ae49fd8cb432" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Coroutine dispatch in tests</span></span></h3><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">We plan to change coroutine dispatch in tests to improve test flakiness and catch more issues. Currently, tests use the </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">UnconfinedTestDispatcher</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, which differs from production behavior; e.g., </span><a href="https://developer.android.com/develop/ui/compose/side-effects" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">effects</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> may run immediately rather than being enqueued. In a future release, we plan to introduce a new API that uses </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">StandardTestDispatcher</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> by default to match production behaviours. You can try the new behavior </span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">now</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> in 1.10:</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p>
<div style="background-color: whitesmoke; border-radius: 8px; padding: 16px;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">@</span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">get</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">:Rule </span><span style="background-color: transparent; color: #b80672; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// also createAndroidComposeRule, createEmptyComposeRule</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">val</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> rule = createComposeRule(</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">effectContext = StandardTestDispatcher()</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">)</span></p></div>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Using the </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">StandardTestDispatcher</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> will queue tasks, so you must use synchronization mechanisms like </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">composeTestRule.waitForIdle()</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> or </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">composeTestRule.runOnIdle()</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. If your test uses </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">runTest</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, you must ensure that </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">runTest</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and your Compose rule share the same </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">StandardTestDispatcher</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> instance for synchronization.</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p>
<div style="background-color: whitesmoke; border-radius: 8px; padding: 16px;"><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #b80672; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// 1. Create a SINGLE dispatcher instance</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">val</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">testDispatcher</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">=</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">StandardTestDispatcher()</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #b80672; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// 2. Pass it to your Compose rule</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">@</span><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">get</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">:Rule</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">val</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">composeRule</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">=</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">createComposeRule(effectContext</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">=</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">testDispatcher</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">)</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">@Test</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #b80672; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">// 3. Pass the *SAME INSTANCE* to runTest</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #1967d2; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">fun</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">myTest()</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">=</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">runTest(</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">testDispatcher</span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">)</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">composeRule.setContent</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">{</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #b80672; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">/* ... */</span><span style="background-color: transparent; color: #434343; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: #37474f; font-family: 'Roboto Mono',monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">}</span></p></div>
<p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><h2 dir="ltr" style="margin-bottom: 0pt; margin-top: 4pt;"><span id="docs-internal-guid-e3cfe84a-7fff-1893-6de7-0a900daff7c4" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Tools</span></span></h2><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Great APIs deserve great tools, and </span><a href="http://d.android.com/studio" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Android Studio</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> has a number of recent additions for Compose developers:</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: #434343; font-family: "Google Sans Text", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/studio/preview/features#iterate-ui-agent" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 700; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Transform UI</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">: Iterate on your designs by right clicking on the </span><span style="background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">@Preview</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, selecting Transform UI, and then describing the change in natural language.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #434343; font-family: "Google Sans Text", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/studio/preview/features#ui-tools-setup" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 700; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Generate </span><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #0d904f; font-family: monospace; font-style: normal; font-variant: normal; font-weight: 700; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">@Preview</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">: Right-click on a composable and select </span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Gemini > Generate [Composable name] Preview</span><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.</span></p></li></ul>
<ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="background-color: transparent; color: #434343; font-family: "Google Sans Text", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/studio/preview/features#material-symbols-support" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 700; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Customize Material Symbols</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> with new support for icon variations in the Vector Asset wizard. </span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #434343; font-family: "Google Sans Text", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/studio/preview/features#screen-to-code-agent" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 700; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Generate code from a screenshot</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> or ask Gemini to </span><a href="https://developer.android.com/studio/preview/features#match-ui-agent" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">match your existing UI to a target image</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. This can be combined with remote </span><a href="https://developer.android.com/studio/preview/features#remote-mcp" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">MCP support</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> e.g. to connect to a Figma file and generate Compose UI from designs.</span></p></li><li aria-level="1" dir="ltr" style="background-color: transparent; color: #434343; font-family: "Google Sans Text", sans-serif; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><p dir="ltr" role="presentation" style="margin-bottom: 0pt; margin-top: 0pt;"><a href="https://developer.android.com/studio/preview/features#find-and-fix-ui-quality-issues" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 700; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">Fix UI quality issues</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> audits your UI for common problems, such as accessibility issues, and then proposes fixes.</span></p></li></ul><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"></span></p><div class="separator" style="clear: both; text-align: center;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='100' height='405' src='https://www.blogger.com/video.g?token=AD6v5dxq-uUQJWdORNt-qkFsZ5j1eU0368Fr9a6IM4aXLMteDiUTCa4KYFFceUx7S4BBKhR81M7T4a-HA28Z3FqHkg' class='b-hbp-video b-uploaded' frameborder='0'></iframe></span></div><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span><p></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">To see these tools in action, watch this recent demonstration:</span></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="413" src="https://www.youtube.com/embed/jTlW8JeCClA" width="100%" youtube-src-id="jTlW8JeCClA"></iframe></div><br /><p></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><b style="font-weight: normal;"><br /></b></p><h2 dir="ltr" style="margin-bottom: 0pt; margin-top: 4pt;"><span id="docs-internal-guid-091a34fe-7fff-36ec-f112-553b834fd8d0" style="font-weight: normal;"><span face=""Google Sans", sans-serif" style="color: #434343; font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Happy Composing</span></span></h2><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"></p><p dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">We continue to invest in Jetpack Compose to provide you with the APIs and tools you need to create beautiful, rich UIs. We value your input, so please share your feedback on these changes or what you'd like to see next in our </span><a href="https://issuetracker.google.com/issues/new?component=612128" style="text-decoration: none;"><span face="'Google Sans Text',sans-serif" style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline;">issue tracker</span></a><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.</span></p><div><span face="'Google Sans Text',sans-serif" style="background-color: transparent; color: #434343; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><br /></span></div></span></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-23046519597208198222025-12-02T11:00:00.000-08:002025-12-02T11:00:13.355-08:00Android 16 QPR2 is Released<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-2nNtxRx2JuVntzIUbTx0xgglR3cr7KcdjFKIHTQjvxeOvjh2MjHbyfctcC27-8giTL0fbXynXkhU0t-1sUSImU3uYdwPZavekjqcNPIuz-mRO-9Mhu5z67_W20PYrXyZU7XShkNC4agQB0qhLxsmi9E-_Lds7qXR0DpKUO7bHVKQK3tVbTWgRQAQIws/s1600/Banner%20632x408-2.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-2nNtxRx2JuVntzIUbTx0xgglR3cr7KcdjFKIHTQjvxeOvjh2MjHbyfctcC27-8giTL0fbXynXkhU0t-1sUSImU3uYdwPZavekjqcNPIuz-mRO-9Mhu5z67_W20PYrXyZU7XShkNC4agQB0qhLxsmi9E-_Lds7qXR0DpKUO7bHVKQK3tVbTWgRQAQIws/s1600/Banner%20632x408-2.png" style="display: none;" />
<i>Posted by Matthew McCullough, VP of Product Management, Android Developer</i><div><i><br /></i></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii6kE89MWPTDLLFQJ8x4RsdFAxjP4hQHPOb_octGs-qOAWRizzZWAGOQVUoq_yhgbMIVeLNfHb1WL2gOnldRtki02Gg3ntrNlzU4kureeNHHYkomb6yqingsTgoAmmYcPefUdqgC8uD1JP4QIZMvNMsAuiQEH0IjItvME4PrkTgorL35XnmNiwSABGGik/s1600/Banner%201600x476-2.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="476" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii6kE89MWPTDLLFQJ8x4RsdFAxjP4hQHPOb_octGs-qOAWRizzZWAGOQVUoq_yhgbMIVeLNfHb1WL2gOnldRtki02Gg3ntrNlzU4kureeNHHYkomb6yqingsTgoAmmYcPefUdqgC8uD1JP4QIZMvNMsAuiQEH0IjItvME4PrkTgorL35XnmNiwSABGGik/s16000/Banner%201600x476-2.png" /></a></div><br /><i><br /></i></div><div><i><br /></i></div><div><p style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"></p><h3><span style="font-family: inherit;"><br /><br /></span></h3><h2 style="text-align: left;"><span style="font-family: inherit;">Faster Innovation with Android's first Minor SDK Release</span></h2>Today we're releasing Android 16 QPR2, bringing a host of enhancements to user experience, developer productivity, and media capabilities. It marks a significant milestone in the evolution of the Android platform as the <a href="https://android-developers.googleblog.com/2024/10/android-sdk-release-update.html">first release to utilize a minor SDK version</a>.<p></p><p style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><h3 style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: left;">A Milestone for Platform Evolution: The Minor SDK Release</h3><div><br /></div>Minor SDK releases allow us to deliver APIs and features more rapidly outside of the major yearly platform release cadence, ensuring that the platform and your apps can innovate faster with new functionality. Unlike major releases that may include behavior changes impacting app compatibility, the changes in QPR2 are largely additive, minimizing the need for regression testing. Behavior changes in QPR2 are largely focused on security or accessibility, such as SMS OTP protection, or the support for the expanded dark theme.<span><p dir="ltr" style="line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To support this, we have introduced new fields to the </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Build</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> class as of Android 16, allowing your app to check for these new APIs using </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">SDK_INT_FULL</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> and </span><span style="color: #188038; font-family: "Roboto Mono", monospace; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">VERSION_CODES_FULL</span><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span></p><pre style="color: #333333; line-height: 16.25px; margin: 0px;"><span style="color: blue;">if</span> ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) && (Build.VERSION.SDK_INT_FULL >= Build.VERSION_CODES_FULL.BAKLAVA_1)) {
<span style="color: green;">// Call new APIs from the Android 16 QPR2 release</span>
}</pre></span><h3 style="text-align: left;">Enhanced User Experience and Customization</h3>QPR2 improves Android's personalization and accessibility, giving users more control over how their devices look and feel.</div><h2 style="text-align: left;">Expanded Dark Theme</h2><div>To create a more consistent user experience for users who have low vision, photosensitivity, or simply those who prefer a dark system-wide appearance, QPR2 introduced an expanded option under dark theme.<div><br /><span><div class="separator" style="clear: both; text-align: center;"><span style="border: none; display: inline-block; height: 343px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 609px;"><img height="343" src="https://blogger.googleusercontent.com/img/a/AVvXsEhgm6uGt47KhJeS7mP5zQGFvoRstsDq9n0OhBSlHp1KDMDsAzDFlPcBuZd_DYy1qwaPawaC3JdGhBRRxC7-3wQgxvcafbHyxwxr2t0CpwBftjg4nSkGFbV9Y3dvR2rT8569P5Yq0zDpQnq8oBIQLS2C5ip6FBKDn8mbbhkaRI9ZtHkX7CuqLWAgXz286s8" style="margin-left: 0px; margin-top: 0px;" width="609" /></span></div><p dir="ltr" style="line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt;"></p><div style="text-align: center;"><i>The old Fitbit app showing the impact of expanded dark theme; the new Fitbit app directly supports a dark theme</i></div><br />When the expanded dark theme setting is enabled by a user, the system uses your app's isLightTheme theme attribute to determine whether to apply inversion. If your app <a href="https://developer.android.com/develop/ui/views/theming/darktheme#support-dark-theme">inherits from one of the standard DayNight themes</a>, this is done automatically for you. If it does not, make sure to declare isLightTheme="false" in your dark theme to ensure your app is not inadvertently inverted. Standard Android Views, Composables, and WebViews will be inverted, while custom rendering engines like Flutter will not.<br /><br />This is largely intended as an accessibility feature. We strongly recommend implementing a native dark theme, which gives you full control over your app's appearance; you can protect your brand's identity, ensure text is readable, and prevent visual glitches from happening when your UI is automatically inverted, guaranteeing a polished, reliable experience for your users.<p></p><h2 style="text-align: left;">Custom Icon Shapes & Auto-Theming</h2>In QPR2, users can select specific shapes for their app icons, which apply to all icons and folder previews. Additionally, if your app does not provide a dedicated themed icon, the system can now automatically generate one by applying a color filtering algorithm to your existing launcher icon.</div><div><span><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none; table-layout: fixed; width: 468pt;"><colgroup><col></col><col></col></colgroup><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 148px; overflow: hidden; width: 120px;"><img height="262.6343825665854" src="https://blogger.googleusercontent.com/img/a/AVvXsEgTcF4imsmYlGewKcvwgXrGRR8CpQhi3keCIGheAfuFHQ_gRzlU8CZ8UOP6vUG8wUtPWdKTFH0EYlJxxVZq7ouQXnzX7z6MziehZ3qoZAQL8R6XeHWTPR6Haak7VUALP0PmTaYjwzyTkKIT0NnSXVzRgcktIa6yfoGP_R2zuWr69_5NI9kPZz1uLJS9zD8" style="margin-left: 0px; margin-top: -114.634px;" title="Screenshot_20250909-173910.png" width="120" /></span></span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 148px; overflow: hidden; width: 121px;"><img height="262.6390243902433" src="https://blogger.googleusercontent.com/img/a/AVvXsEgmfEdGK3J58qEmeTWiqoSuA6DfKpcRfU10UMVmEijxHKjnPDcDQftPrB8P22vYkoOWYBqdrIlb5iDUJFxkFl3sHdk9aEXAejofanTqWTUZ2LYHjkOEwakX8tY_0ufu3kyCdJ5HyfCVzYmH9NTSkmQRpYDit8eF6r6uolTKNrGaq19vpIYWRIJTk9PbyKQ" style="margin-left: 0px; margin-top: -114.639px;" title="Screenshot_20250909-173857.png" width="121" /></span></span></p></td></tr><tr style="height: 20pt;"><td colspan="2" style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Custom Icon Shapes</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 148px; overflow: hidden; width: 108px;"><img height="181" src="https://blogger.googleusercontent.com/img/a/AVvXsEigLJlC93eUk6kldYy3VQOeYBolp9iXFTw7Z0g-rwvJJ8yiXYDoTbWmHlEygpJa7pOL2Oy54cc1kN4T-pu1YEAgdK6pdSusKY6kIjjKRFvrrMH99LOsqCgF5aLPsiaGTJHyB29m31dLWcXTwYrqKMDcE4j41vD7g10mWOFl4oAV3po6Mc5MbbaLukD9Vk8" style="margin-left: 0px; margin-top: 0px;" width="108" /></span></span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 148px; overflow: hidden; width: 162px;"><img height="161.45454545454544" src="https://blogger.googleusercontent.com/img/a/AVvXsEgpiDhEm-6m7_5wSpAX3vXXNZKteHaR7C4Mr96QQdE_GHl1nFhHnWGuQzG69rcbPMY2OUAdbzMY38C1wcg3nqT3PbCwR6oTAqyfpRcOohedW1XpC1Fv_RUc7Rgurok76VMqHklVVBdMFNBplyLk5yLwaRduAF69BORS3eGZfKiV5cDR9ZO-F0vB4RRouEM" style="margin-left: -184.696px; margin-top: 0px;" title="Screenshot 2025-09-02 at 4.00.48 PM.png" width="362.84759999999994" /></span></span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Test Icon Shape & Color in Android Studio</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Automatic system icon color filtering</span></p></td></tr></tbody></table></div></span></div><div><h2 style="text-align: left;">Interactive Chooser Sessions</h2>The sharing experience is now more dynamic. Apps can keep the UI interactive even when the system sharesheet is open, allowing for real-time content updates within the Chooser.<br /></div><div><h3 style="text-align: left;">Boosting Your Productivity and App Performance</h3>We are introducing tools and updates designed to streamline your workflow and improve app performance.</div><h2 style="text-align: left;">Linux Development Environment with GUI Applications</h2>The Linux development environment feature has been expanded to support running Linux GUI applications directly within the terminal environment.<div><br /><span><div class="separator" style="clear: both; text-align: center;"><span style="border: none; display: inline-block; height: 560px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 251px;"><img height="560" src="https://blogger.googleusercontent.com/img/a/AVvXsEjqL1MUB8rBqduGI6YvFDlX9QK3UTn_xAsRR2yeH6YA6_V64f5JxIZsZMZKuvIqJf4PX9VynTcTvIpuRDaXiJCM8qjC99ARAIJoDSYASVAukfIKFspaC5VoAe_7fMQEbQDsVh3_H8VMPds-MkkjaT6rUcmU6vHr3NMSRlUqzAHo-BZhwlyJ2mKOngod9pc" style="margin-left: 0px; margin-top: 0px;" width="251" /></span></div><p dir="ltr" style="line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p></span><i><div style="text-align: center;"><i>Wilber, the GIMP mascot, designed by Aryeom Han, is licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a>. The screenshot of the GIMP interface is used with courtesy.</i></div></i><h2 style="text-align: left;">Generational Garbage Collection</h2>The Android Runtime (ART) now includes a Generational Concurrent Mark-Compact (CMC) Garbage Collector. This focuses collection on newly allocated objects, resulting in reduced CPU usage and improved battery efficiency.</div><div><h2 style="text-align: left;">Widget Engagement Metrics</h2>You can now <a href="https://developer.android.com/develop/ui/compose/glance/metrics">query user interaction events</a>—such as clicks, scrolls, and impressions—to better understand how users engage with your widgets.<br /><h2 style="text-align: left;">16KB Page Size Readiness</h2>To help prepare for future architecture requirements, we have added early warning dialogs for debuggable apps that are not 16KB page-aligned.<span><div class="separator" style="clear: both; text-align: center;"><span style="border: none; display: inline-block; height: 266px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 236px;"><img height="266" src="https://blogger.googleusercontent.com/img/a/AVvXsEjT6mvdJsa4PFRa0ZzZnc2RyJUMNWrUxfIDFDprqHkl_qjcIDSEjhHaLyLEAJKHbRpO4Oo-egIhE9GyGOd7DvzijF04SEN8nrk_YeWdZc3gXPU30LR0e_4FErwpZ-LOBOIA8t40MXZRlz-BJRAMA2JZgMk1db6oBpbLjhg6FAC4orZKDaxpMNVMcsYZ_To" style="margin-left: 0px; margin-top: 0px;" width="236" /></span></div><p dir="ltr" style="line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p></span><br /><h3 style="text-align: left;">Media, Connectivity, and Health</h3>QPR2 brings robust updates to media standards and device connectivity.<br /><h2 style="text-align: left;">IAMF and Audio Sharing</h2>We have added software decoding support for Immersive Audio Model and Formats (IAMF), an open-source spatial audio format. Additionally, Personal Audio Sharing for Bluetooth LE Audio is now integrated directly into the system Output Switcher.<span><div class="separator" style="clear: both; text-align: center;"><span style="border: none; display: inline-block; height: 313px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 244px;"><img height="543.9767441860465" src="https://blogger.googleusercontent.com/img/a/AVvXsEhmRdkZv4Fmne0Hw3rmTTkYdJ3DXa37aiPeZarlz0a_qNzPccJNbZoK_-ybdwHI4wxZ6Eihf6c_lwVXgOUSDotyc1hgYBoJgb-btVDobCNCCU4GyFaji7WK97bZcSQnv6x63BAjy_rTLsELK32ak_Xb-GDZe2d5OMMQHn4XsjuixK-rYeSvRFxDskyMPfE" style="margin-left: 0px; margin-top: -32px;" width="244" /></span></div><p dir="ltr" style="line-height: 1.2; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p></span><br /><h2 style="text-align: left;">Health Connect Updates</h2>Health Connect now automatically tracks steps using the device's sensors. If your app has the READ_STEPS permission, this data will be available from the "android" package. Not only does this simplify the code needed to do step tracking, it's also more power efficient. It also can now track weight, set index, and Rate of Perceived Exertion (RPE) in exercise segments.<br /><h2 style="text-align: left;">Smoother Migrations</h2>A new 3rd-party Data Transfer API enables more reliable data migration between Android and iOS devices.<br /><h3 style="text-align: left;">Strengthening Privacy and Security</h3>Security remains a top priority with new features designed to protect user data and device integrity.<br /><h2 style="text-align: left;">Developer Verification</h2>We introduced APIs to support developer verification during app installation along with new ADB commands to simulate verification outcomes. As a developer, you are free to install apps without verification by using ADB, so you can continue to test apps that are not intended or not yet ready to distribute to the wider consumer population.<br /><h2 style="text-align: left;">SMS OTP Protection</h2>The delivery of messages containing an <a href="https://developers.google.com/identity/sms-retriever/verify">SMS retriever hash</a> will be delayed for most apps for three hours to help prevent OTP hijacking. The <a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_SMS">RECEIVE_SMS</a> broadcast will be withheld and <a href="https://developer.android.com/reference/android/provider/Telephony.Sms.html">sms provider</a> database queries will be filtered. The SMS will be available to these apps after the three hour delay.<br /><h2 style="text-align: left;">Secure Lock Device</h2>A new system-level security state, Secure Lock Device, is being introduced. When enabled (e.g., remotely via "Find My Device"), the device locks immediately and requires the primary PIN, pattern, or password to unlock, heightening security. When active, notifications and quick affordances on the lock screen will be hidden, and biometric unlock may be temporarily disabled.<br /><h3 style="text-align: left;">Get Started</h3>If you're not in the Beta or Canary programs, your Pixel device should get the Android 16 QPR2 release shortly. If you don’t have a Pixel device, you can <a href="https://developer.android.com/about/versions/16/get#on_emulator">use the 64-bit system images with the Android Emulator</a> in Android Studio. If you are currently on the Android 16 QPR2 Beta and have not yet installed the Android 16 QPR3 beta, you can opt out of the program and you will then be offered the release version of Android 16 QPR2 over the air.<br />For the best development experience with Android 16 QPR2, we recommend that you use the latest Canary build of <a href="https://developer.android.com/studio/preview">Android Studio Otter</a>.<br />Thank you again to everyone who participated in our Android beta program. We're looking forward to seeing how your apps take advantage of the updates in Android 16 QPR2.</div><div>For complete information on Android 16 QPR2 please visit the <a href="https://developer.android.com/about/versions/16">Android 16 developer site</a>.</div></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0tag:blogger.com,1999:blog-6755709643044947179.post-33365498099596626412025-12-02T09:00:00.000-08:002025-12-02T09:00:00.116-08:00Explore AI on Android with Our Sample Catalog App<i><span style="font-family: inherit;">Posted by Thomas Ezan and Ivy Knight</span></i><div><span id="docs-internal-guid-fbe8403b-7fff-1b3a-2735-0b9be6bd10f5" style="font-family: inherit;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">As the AI landscape continues to expand, we often hear that developers aren't always sure where to start and which API or SDK is best for their use case.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">So we wanted to provide you with examples of AI-enabled features using both on-device and Cloud models and inspire you to create delightful experiences for your users.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We are thrilled to announce the launch of the redesigned </span><a href="https://github.com/android/ai-samples/" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Android AI Sample Catalog</span></a><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, a dedicated application designed to inspire and educate Android developers to build the next generation of AI-powered Android apps. </span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Discover what's possible with Google AI</span><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The Android AI Sample Catalog is designed as a one-stop destination to explore the capabilities of Google AI APIs and SDKs. Inside, you'll find a collection of samples demonstrating a wide range of AI use cases that you can test yourself. We really designed this catalog to give you a hands-on feel for what you can build and help you find the right solution and capability for your needs.</span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Here are some of the samples you can find in the catalog:</span></p><div align="center" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none; table-layout: fixed; width: 468pt;"><colgroup><col></col><col></col></colgroup><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #ffffff 1pt; border-color: rgb(255, 255, 255); border-left: solid #ffffff 1pt; border-right: solid #ffffff 1pt; border-style: solid; border-top: solid #ffffff 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 394px; overflow: hidden; width: 188px;"><img height="394" src="https://blogger.googleusercontent.com/img/a/AVvXsEii9u5f7MgV8_UHt3x7AXaf_YsKU7fy0WS8IWy8Qzr_Kw1ylcXZauFIw4rsB-WyLGTLYti9Jfst06bGJAfwWTRJqFkeVAbt6_jmKDKHkSOPwjVxIof44XdYbC8T6gzNIsbhsBZZClZjDRE2ekQYt7cYWsFZoc2JgBCoYHT34AanamMj4FpK0U-BPKQx_F4" style="margin-left: 0px; margin-top: 0px;" width="188" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Image generation with Imagen</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Uses Imagen to generate images of landscapes, objects and people in various artistic styles.</span></p></td><td style="border-bottom: solid #ffffff 1pt; border-color: rgb(255, 255, 255); border-left: solid #ffffff 1pt; border-right: solid #ffffff 1pt; border-style: solid; border-top: solid #ffffff 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 399px; overflow: hidden; width: 190px;"><img height="399" src="https://blogger.googleusercontent.com/img/a/AVvXsEjr79IZT6VB2KWHvI2oFeW7IZ5KrlAARxn-yPlDmnxoukUFWo9_QjPLN67gKAlHKuZct6ZiCsbI3R-1JwBwxF_UeG70wdjZN37uROP3NJ6dTDMefKNNQcZph8DGfROxqd0BdsIOPx3tHCwyZe2oJDumD-fs1GILfXUvTMVTs_ylVpBGN0Ve2JAX0R-nU_s" style="margin-left: 0px; margin-top: 0px;" width="190" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">On-device summarization with Gemini Nano</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Lets you summarize text on-device using Gemini Nano via the GenAI Summarization API.</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #ffffff 1pt; border-color: rgb(255, 255, 255); border-left: solid #ffffff 1pt; border-right: solid #ffffff 1pt; border-style: solid; border-top: solid #ffffff 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 395px; overflow: hidden; width: 186px;"><img height="395" src="https://blogger.googleusercontent.com/img/a/AVvXsEhKeHUe5-rXkrg2Agz8ZHr0qknRMC3NaYvi41LA2J5bmrzGMFAQ0SAHi2f601TmQhBhONZYgKoj7sYTqTARO1uycmR1GcuEIfbPzmotj_7IkOQm3KlvCIvPTjSy-pjQbNYrRyBwHgl3OHVwHo1SJ4_fFA8IiavQcBKHQekE7kw7-doqN8TmUbQ1PnCsiys" style="margin-left: 0px; margin-top: 0px;" width="186" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Chat with Nano Banana</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">A chatbot app using the Gemini 3 Pro Image model (a.k.a. "Nano Banana Pro") letting you edit images via a conversation with the model.</span></p></td><td style="border-bottom: solid #ffffff 1pt; border-color: rgb(255, 255, 255); border-left: solid #ffffff 1pt; border-right: solid #ffffff 1pt; border-style: solid; border-top: solid #ffffff 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 397px; overflow: hidden; width: 187px;"><img height="397" src="https://blogger.googleusercontent.com/img/a/AVvXsEhV9agk9aDl97wqa2umNJJQWIBJhW_kB2jBZAQHIrgTFQ2IDUV70kltydoBJ7ecZwik0AI46lM46wqj94iy3R7lQb472msGLLfw7o2yhcMj81Y-V7kXT7GJJcnYGMbWq_p2x1SadbstW_NRIFvY5Ow_4X05i33Db_LHifCJBPccScOkBoU6DSz1q-D9rq4" style="margin-left: 0px; margin-top: 0px;" width="187" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">On-device image description with Gemini Nano</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Lets you generate image descriptions using Gemini Nano via the GenAI Image Description API.</span></p></td></tr></tbody></table></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Other samples include: image editing via Imagen mask-editing capabilities, a to-do list app controlled via the voice using the Gemini Live API, on-device rewrite assistance powered by Gemini Nano, and more! </span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The samples using cloud inference are built using the </span><a href="https://firebase.google.com/docs/ai-logic/get-started?platform=android" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Firebase AI Logic SDK</span></a><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, and the </span><a href="https://developers.google.com/ml-kit/genai" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">ML Kit GenAI API</span></a><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> is used for the samples running on-device inference. We plan to continue creating new samples and updating the existing ones as new capabilities are added to the models and SDKs.</span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Fully open source and ready to copy</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We believe the best way to learn is by doing. That's why the AI Sample Catalog is not only fully open-source but it’s been architectured so the code relevant to the AI features is self-contained and easy to copy and paste, so you can quickly experiment with these code samples in your own project. </span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">When you're exploring a sample in the app and want to see how it's built, you can simply click the </span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;"><> SOURCE</span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> button to jump directly to the code on GitHub.</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje8kwqg30MUOqkN7a88LNLQSO2ylaNBMM6SKXy2lUTCqXkOuziwzLrtSov3gj-P1dQap4gx6eph9WZsivM-8AEuCTriktf76XzWzTok818d409R6k_xxFeh6gCx1b9Xofl8nrTORylr6WidlO4458XUO_DmiVFtxl2lyIfoSaEFC_8mBA1hO8cNM1xxmA/s527/Untitled.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="334" data-original-width="527" height="203" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje8kwqg30MUOqkN7a88LNLQSO2ylaNBMM6SKXy2lUTCqXkOuziwzLrtSov3gj-P1dQap4gx6eph9WZsivM-8AEuCTriktf76XzWzTok818d409R6k_xxFeh6gCx1b9Xofl8nrTORylr6WidlO4458XUO_DmiVFtxl2lyIfoSaEFC_8mBA1hO8cNM1xxmA/s320/Untitled.png" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">To help you get started quickly, each sample includes a README file that highlights the APIs used, along with key code snippets.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><div class="separator" style="clear: both; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><img border="0" data-original-height="1478" data-original-width="2082" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Y9jhgNJ1G1j6W-L5C7J1aQRk0_1KxJi6oDA4f9BN750zaujIoHixTYxXMhy2ZPUO38seRRF9CKDSBP1zre6Eam5UMHQp0uZlHaAW1d0PBtWd-zvTmRGZtIhMXiBBdgokVjiSMdkP1Bn2b3Q5mmUE1OSAnM3aW2ZaJE8QQzKPISBScFU26g6RS7jNNCs/s16000/sample_readme_bazel.png" /></span></div><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Note: To run the samples using the Firebase AI Logic SDK, you’ll need to </span><a href="https://github.com/android/ai-samples#how-to-run" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">set up a Firebase AI project</span></a><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. Also, the samples using </span><a href="https://developers.google.com/ml-kit/genai" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">ML Kit Gen AI APIs</span></a><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> powered by Gemini Nano are only supported on </span><a href="https://developers.google.com/ml-kit/genai#device-support" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">certain devices</span></a><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">We also put extra thought into the app's user interface to make your learning experience more engaging and intuitive. We've refreshed the app with a bold new brand that infuses the Android look with an expressive AI design language. Most notably, the app now features a vibrant, textured backdrop for the new </span><a href="http://material.io/" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Material 3 expressive components</span></a><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">, giving you a modern and enjoyable environment to explore the samples and dive into the code. The systematic illustrations, inspired by generated image composition, further enhance this polished, expressive experience.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt; text-align: center;"><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 627px; overflow: hidden; width: 295px;"><img height="627" src="https://blogger.googleusercontent.com/img/a/AVvXsEjdCUva_sacls1x8H2stJCdxXtLE2rbFHLF3mECvrX0-HfMIfO2Dk5pJjgjoPlsRJbAo2P3dKFJ6kdOhMdYHXZkXdkSM_2ANra8sbXstxWAgYsg4yHXfPaIaiGUMyGNLjKj9BMlZ6LipQnYcFHUboJ6JhYgUNu-tfsfeeOWxZi836HvGKR-wZNZ7YPFWDg" style="margin-left: 0px; margin-top: 0px;" width="295" /></span></span></p><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Check out the Android AI Sample Catalog today, test the features, and dive into the code on </span><a href="https://github.com/android/ai-samples/" style="text-decoration-line: none;"><span face=""Google Sans", sans-serif" style="color: #1155cc; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">GitHub</span></a><span face=""Google Sans", sans-serif" style="font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> to start bringing your own AI-powered ideas to life!</span></span></div>Android Developershttp://www.blogger.com/profile/08588467489110681140[email protected]0