<meta content="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS4ubVQL0hsVmbuMRCMgCsA64s6F0Wig_D5T3m3AS0DHuvr7A9BwniaktsYZpZ7LCU4NxdZNKSYvCM_lIjFav4DQxB-gDQo_hmz871Od0QQ3lsyoAgnLtiMTXkPdv80cubXkIsUBlkjU7f1Tmk-zErZ3ztQGsuxUgOs7y4e4HBVjr66m7W9MuUq5Sc9FE/s1600/A16-wordmark.png" name="twitter:image"></meta>
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS4ubVQL0hsVmbuMRCMgCsA64s6F0Wig_D5T3m3AS0DHuvr7A9BwniaktsYZpZ7LCU4NxdZNKSYvCM_lIjFav4DQxB-gDQo_hmz871Od0QQ3lsyoAgnLtiMTXkPdv80cubXkIsUBlkjU7f1Tmk-zErZ3ztQGsuxUgOs7y4e4HBVjr66m7W9MuUq5Sc9FE/s1600/A16-wordmark.png" style="display: none;" />
<em>Posted by Matthew McCullough, VP of Product Management, Android Developer</em><div><i><br /></i>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5iA7jVSAp0NGA9fum6jWcAmOif-8nWor1sFfpv_am-1qytjP41RzvEzxYt8TN7bCsFIkI1fHLHnq-d-XKUSiklBiwsJL4uM6LtjJ_teV_vAVfAxj2UgqYUtpCRSABS797VLdFq8O9j-1mB7LzVoMvtYPuFSx-CCjTDfZiiAz1mCq5jOG1uabc4bbMVEU/s1600/Banner%201600x476.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/AVvXsEg5iA7jVSAp0NGA9fum6jWcAmOif-8nWor1sFfpv_am-1qytjP41RzvEzxYt8TN7bCsFIkI1fHLHnq-d-XKUSiklBiwsJL4uM6LtjJ_teV_vAVfAxj2UgqYUtpCRSABS797VLdFq8O9j-1mB7LzVoMvtYPuFSx-CCjTDfZiiAz1mCq5jOG1uabc4bbMVEU/s16000/Banner%201600x476.png" /></a></div>
<p>Android 16 QPR2 has released Platform Stability today with Beta 2! That means that the API surface is locked, and the app-facing behaviors are final, so you can incorporate them into your apps and take advantage of our latest platform innovations.</p><h2 style="font-size: x-large; text-align: left;">New in the QPR2 Beta</h2><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI9Yw09rM2z-8QHmsJYC7mGplLSljbrss8rO1iMkgaSJRAJkjEUCeliShyphenhyphenyBlXUO_B89mbES3VAoRJIqFxnisH_TcVBjMZz3pMFRX6aj0dWu1nMne8kroAHucy6uEWokZz_4gcu_KsTulm4_6AXu5JKtvV6o-PRlLZd5z14Fk88h_ZhrWYandW-odwoW0/s960/image2.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="214" data-original-width="960" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI9Yw09rM2z-8QHmsJYC7mGplLSljbrss8rO1iMkgaSJRAJkjEUCeliShyphenhyphenyBlXUO_B89mbES3VAoRJIqFxnisH_TcVBjMZz3pMFRX6aj0dWu1nMne8kroAHucy6uEWokZz_4gcu_KsTulm4_6AXu5JKtvV6o-PRlLZd5z14Fk88h_ZhrWYandW-odwoW0/s16000/image2.png" /></a></div><br /><div><br /></div>At this later stage in the development cycle, we're focused on the critical work of readying the platform for release. Here are the few impactful changes we want to highlight:<h3 style="text-align: left;"><span style="font-size: large;">Testing developer verification</span></h3><p>To better protect Android users from repeat offenders, Android is introducing <a href="https://developer.android.com/developer-verification" rel="nofollow" target="_blank">developer verification</a>, a new requirement to make app installation safer by preventing the spread of malware and scams. Starting in September 2026 and in specific regions, Android will require apps to be registered by verified developers to be installed on certified Android devices, with an exception made for installs made through the Android Debug Bridge (ADB).</p><p><b>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.</b></p><p>For apps that <a href="https://support.google.com/googleplay/android-developer/answer/12085295" rel="nofollow" target="_blank">enable user-initiated installation of app packages</a>, Android 16 QPR2 Beta 2 contains new <a href="https://developer.android.com/reference/android/content/pm/PackageInstaller#EXTRA_DEVELOPER_VERIFICATION_FAILURE_REASON" rel="nofollow" target="_blank">APIs</a> that support developer verification during installation, along with a new adb command to let you force a verification outcome for testing purposes.</p><pre style="line-height: 125%; margin: 0px;"><span style="background-color: white; font-family: courier;">adb shell pm set-developer-verification-result</span>
</pre><p>By using this command, (see <span style="color: #0d904f; font-family: courier;">adb shell</span><span style="color: #0d904f; font-family: courier;"> pm</span> help for full details) you can now simulate verification failures. This allows you to understand the end-to-end user experience for both successful and unsuccessful verification, so you can prepare accordingly before enforcement begins.</p><p>We encourage all developers who distribute apps on certified Android devices to <a href="https://developer.android.com/developer-verification#sign-up-for-early-access" rel="nofollow" target="_blank">sign up for early access</a> to get ready and stay updated.</p><h3>SMS OTP Protection</h3><div style="text-align: left;"><p>The delivery of messages containing an <a href="https://developers.google.com/identity/sms-retriever/verify" rel="nofollow" target="_blank">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" rel="nofollow" target="_blank">RECEIVE_SMS</a> broadcast will be withheld and <a href="https://developer.android.com/reference/android/provider/Telephony.Sms.html" rel="nofollow" target="_blank">sms provider</a> database queries will be filtered. The SMS will be available to these apps after the three hour delay.</p><p>Certain apps such as the default SMS, assistant, and dialer apps, along with connected device companion, system apps, etc will be exempt from this delay, and apps can continue to use the <a href="https://developers.google.com/identity/sms-retriever/overview" rel="nofollow" target="_blank">SMS retriever API</a> to access messages intended for them in a timely manner.</p></div><div style="text-align: left;"><h3>Custom app icon shapes</h3></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8dwhhu6knm2n1BDhXC_5JQQ0PHC0Dt5W-qqXyHNXZq9SXQTHQ0kjIFFlzObU7fpD1d9kl7KwHFPt2SrsH06vwi9l8YtX9HYXtwnBX56oSR8iv-lKaYL6Fyy5CLYYNeLdAsz5EsyZ5ye16xx8eEV-qJVI-S8FTUWKgr69nnJpAvK3qr8qSlDej7RYg1J8/s1999/image3.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1999" data-original-width="923" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8dwhhu6knm2n1BDhXC_5JQQ0PHC0Dt5W-qqXyHNXZq9SXQTHQ0kjIFFlzObU7fpD1d9kl7KwHFPt2SrsH06vwi9l8YtX9HYXtwnBX56oSR8iv-lKaYL6Fyy5CLYYNeLdAsz5EsyZ5ye16xx8eEV-qJVI-S8FTUWKgr69nnJpAvK3qr8qSlDej7RYg1J8/s320/image3.png" width="148" /></a>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8QVsk0bYzM2AcLGRMLbMtEz5LhZuDcMkLJ08D8eAEjOdZRrn5Gb1Y_9J78RLW7uJ_abBe85TpQD89NzrSs9M6W57hug124SU2bKmSU4jA5qY9xu8Vr9-s0-IpyRVS68ZkLWudx1N1h3gMp_lofCRHfGSCDQh389s7hj-Ow11CFcfStSxKPyxELutALMI/s1999/image4.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1999" data-original-width="923" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8QVsk0bYzM2AcLGRMLbMtEz5LhZuDcMkLJ08D8eAEjOdZRrn5Gb1Y_9J78RLW7uJ_abBe85TpQD89NzrSs9M6W57hug124SU2bKmSU4jA5qY9xu8Vr9-s0-IpyRVS68ZkLWudx1N1h3gMp_lofCRHfGSCDQh389s7hj-Ow11CFcfStSxKPyxELutALMI/s320/image4.png" width="148" /></a></div>
<div>Android 16 QPR2 allows users to select from a list of icon shapes that apply to all app icons and folder previews. Check to make sure that your adaptive icon works well with any shape the user selects.</div><div><h3>More efficient garbage collection</h3></div><p style="text-align: left;">The Android Runtime (ART) now includes a Generational Concurrent Mark-Compact (CMC) Garbage Collector in Android 16 QPR2 that focuses collection efforts on newly allocated objects, which are more likely to be garbage. You can expect reduced CPU usage from garbage collection, a smoother user experience with less jank, and improved battery efficiency.</p><div><h3>Native step tracking and expanded exercise data in Health Connect</h3></div><div><p style="text-align: left;">Health Connect now automatically tracks steps using the device's sensors. If your app has the <span style="font-family: courier;"><span style="color: #0d904f;">READ_STEPS</span></span> permission, this data will be available from the "android" package. Not only does this simplify the code needed to do step tracking, it's more power efficient as well.</p><p style="text-align: left;">Also, the <span style="color: #0d904f; font-family: courier;">ExerciseSegment</span> and <span style="color: #0d904f; font-family: courier;">ExerciseSession</span> data types have been updated. You can now record and read weight, set index, and Rate of Perceived Exertion (RPE) for exercise segments. Since Health Connect is updated independently of the platform, checking for feature availability before writing the data will ensure compatibility with the current local version of Health Connect.</p><div style="background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: #3d7b7b; font-style: italic;">// Check if the expanded exercise features are available</span>
<span style="color: green; font-weight: bold;">val</span><span style="color: #bbbbbb;"> </span><span style="color: #19177c;">newFieldsAvailable</span><span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span>healthConnectClient.<span style="color: #687822;">features</span>.<span style="color: #687822;">getFeatureStatus</span>(
<span style="color: #bbbbbb;"> </span>HealthConnectFeatures.<span style="color: #687822;">FEATURE_EXPANDED_EXERCISE_RECORD</span>
)<span style="color: #bbbbbb;"> </span><span style="color: #666666;">==</span><span style="color: #bbbbbb;"> </span>HealthConnectFeatures.<span style="color: #687822;">FEATURE_STATUS_AVAILABLE</span>
<span style="color: green; font-weight: bold;">val</span><span style="color: #bbbbbb;"> </span><span style="color: #19177c;">segment</span><span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span>ExerciseSegment(
<span style="color: #bbbbbb;"> </span><span style="color: #3d7b7b; font-style: italic;">//...</span>
<span style="color: #bbbbbb;"> </span><span style="color: #3d7b7b; font-style: italic;">// Conditionally add the new data fields</span>
<span style="color: #bbbbbb;"> </span>weight<span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">if</span><span style="color: #bbbbbb;"> </span>(newFieldsAvailable)<span style="color: #bbbbbb;"> </span>Mass.<span style="color: #687822;">fromKilograms</span>(<span style="color: #666666;">50.0</span>)<span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">else</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">null</span>,
<span style="color: #bbbbbb;"> </span>setIndex<span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">if</span><span style="color: #bbbbbb;"> </span>(newFieldsAvailable)<span style="color: #bbbbbb;"> </span><span style="color: #666666;">1</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">else</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">null</span>,
<span style="color: #bbbbbb;"> </span>rateOfPerceivedExertion<span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">if</span><span style="color: #bbbbbb;"> </span>(newFieldsAvailable)<span style="color: #bbbbbb;"> </span><span style="color: #666666;">7.0f</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">else</span><span style="color: #bbbbbb;"> </span><span style="color: green; font-weight: bold;">null</span>
)
</pre></div>
<h2><span style="font-size: x-large;">A minor SDK version</span></h2>
<p>QPR2 marks the first Android release with a minor SDK version allowing us to more rapidly innovate with new platform APIs provided outside of our usual once-yearly timeline. Unlike the major platform release (Android 16) in 2025-Q2 that included behavior changes that impact app compatibility, the changes in this release are largely additive and designed to minimize the need for additional app testing.</p>
<image><div style="text-align: center;"><img alt="Android 16 SDK release cadence" border="0" id="imgCaption" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi08BSp5rhpK_ux7TCYUW02KjKqjLXCsla9VGZ7V0nicsX9S6ySNwD2dmjaQbPJJ0EWdeAbUe77WUitxemEzDuP33SgIynUppkthk47yaM6TCq4vdb4l1bOPS-vvo8c57HOOyrpnYw8emeze-h49FwQ-X0xl7vGgDimFE9ggKTLXjwBfUFr_t3zBLkYyyU/s16000/Android-16-SDK-releases-2025-timeline.png" width="100%" /></div></image>
<p>Your app can safely call the new APIs on devices where they are available by using <span style="font-family: courier;"><a href="https://developer.android.com/reference/android/os/Build.VERSION#SDK_INT_FULL" target="_blank">SDK_INT_FULL</a></span> and the respective value from the <span style="font-family: courier;"><a href="https://developer.android.com/reference/android/os/Build.VERSION_CODES_FULL" target="_blank">VERSION_CODES_FULL</a></span> enumeration.</p>
<!--Kotlin--><div style="background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: green; font-weight: bold;">if</span><span style="color: #bbbbbb;"> </span>(Build.<span style="color: #687822;">VERSION</span>.<span style="color: #687822;">SDK_INT_FULL</span><span style="color: #bbbbbb;"> </span><span style="color: #666666;">>=</span><span style="color: #bbbbbb;"> </span>Build.<span style="color: #687822;">VERSION_CODES_FULL</span>.<span style="color: #687822;">BAKLAVA_1</span>)<span style="color: #bbbbbb;"> </span>{
<span style="color: #bbbbbb;"> </span><span style="color: #3d7b7b; font-style: italic;">// Call new APIs from the Android 16 QPR2 release</span>
}
</pre></div>
<p>You can also use the <span style="font-family: courier;"><a href="https://developer.android.com/reference/android/os/Build#getMinorSdkVersion%28int%29" target="_blank">Build.getMinorSdkVersion()</a></span> method to get just the minor SDK version number.</p>
<!--Kotlin--><div style="background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: green; font-weight: bold;">val</span><span style="color: #bbbbbb;"> </span><span style="color: #19177c;">minorSdkVersion</span><span style="color: #bbbbbb;"> </span><span style="color: #666666;">=</span><span style="color: #bbbbbb;"> </span>Build.<span style="color: #687822;">getMinorSdkVersion</span>(VERSION_CODES_FULL.<span style="color: #687822;">BAKLAVA</span>)
</pre></div>
<p>The original <span style="font-family: courier;"><a href="https://developer.android.com/reference/android/os/Build.VERSION_CODES" target="_blank">VERSION_CODES</a></span> enumeration can still be used to compare against the <span style="font-family: courier;"><a href="https://developer.android.com/reference/android/os/Build.VERSION#SDK_INT" target="_blank">SDK_INT</a></span> enumeration for APIs declared in non minor releases.</p>
<!--Kotlin--><div style="background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span></span><span style="color: green; font-weight: bold;">if</span><span style="color: #bbbbbb;"> </span>(Build.<span style="color: #687822;">VERSION</span>.<span style="color: #687822;">SDK_INT</span><span style="color: #bbbbbb;"> </span><span style="color: #666666;">>=</span><span style="color: #bbbbbb;"> </span>Build.<span style="color: #687822;">VERSION_CODES</span>.<span style="color: #687822;">BAKLAVA</span>)<span style="color: #bbbbbb;"> </span>{
<span style="color: #bbbbbb;"> </span><span style="color: #3d7b7b; font-style: italic;">// Call new APIs from the Android 16 release</span>
}
</pre></div>
<p>Since minor releases aren't intended to have breaking behavior changes, they cannot be used in the <span style="font-family: courier;"><a href="https://developer.android.com/guide/topics/manifest/uses-sdk-element" target="_blank">uses-sdk manifest attributes</a></span>.</p><ul><ul>
</ul></ul>
<h2>Get started with the Android 16 QPR2 beta</h2>
<p>You can <a href="https://www.google.com/android/beta" rel="nofollow" target="_blank">enroll any supported Pixel device</a> to get this and future Android Beta updates over-the-air. If you don’t have a Pixel device, you can <a href="https://developer.android.com/about/versions/16/qpr2/get#on_emulator" rel="nofollow" target="_blank">use the 64-bit system images with the Android Emulator</a> in Android Studio. If you are already in the Android Beta program, you will be offered an over-the-air update to Beta 2. We’ll update the <a href="https://developer.android.com/about/versions/16/qpr2/download" rel="nofollow" target="_blank">system images</a> and SDK regularly throughout the Android 16 QPR2 release cycle.</p>
<p><b>If you are in the Canary program and would like to enter the Beta program, you will need to wipe your device and manually flash it to the beta release.</b></p>
<p>For the best development experience with Android 16 QPR2, we recommend that you use the latest Canary version of <a href="https://developer.android.com/studio/preview" target="_blank">Android Studio Narwhal Feature Drop</a>.</p>
<p>We're looking for your feedback so please <a href="https://developer.android.com/about/versions/16/qpr2/feedback" target="_blank">report issues and submit feature requests</a> on the <a href="https://developer.android.com/about/versions/16/qpr2/feedback" target="_blank">feedback page</a>. The earlier we get your feedback, the more we can include in our work on the final release. Thank you for helping to shape the future of the Android platform.</p></div></div>