20 August 2025
Today we're releasing Android 16 quarterly platform release 2 (QPR2) Beta 1, providing you with an early opportunity to try out the APIs and features that are moving Android forward. This beta focuses on several key improvements:
This release marks the first Android beta 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 in 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.
Your app can safely call the new APIs on devices where they are available by using SDK_INT_FULL and the respective value from the VERSION_CODES_FULL enumeration.
if (Build.VERSION.SDK_INT_FULL >= Build.VERSION_CODES_FULL.BAKLAVA_1) { // Call new APIs from the Android 16 QPR2 release }
You can also use the Build.getMinorSdkVersion() method to get just the minor SDK version number.
val minorSdkVersion = Build.getMinorSdkVersion(VERSION_CODES_FULL.BAKLAVA)
The original VERSION_CODES enumeration can still be used to compare against the SDK_INT enumeration for APIs declared in non minor releases.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) { // Call new APIs from the Android 16 release }
Since minor releases aren't intended to have breaking behavior changes, they cannot be used in the uses-sdk manifest attributes.
This release introduces refinements to the system UI, user experience, and accessibility, from theming changes to input handling to new APIs for adaptive apps.
To create a more consistent user experience for users who have low vision, photosensitivity, or simply those who prefer a dark system-wide appearance, an expanded option under dark theme is being introduced. When enabled by a user, the system will intelligently invert the UI of apps that appear light despite users having selected the dark theme.
The system uses your app's isLightTheme theme attribute to determine whether to apply inversion. If your app inherits from one of the standard DayNight themes, this is done automatically for you, otherwise 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. The system also automatically darkens your app's splash screen and adjusts the status bar color for contrast.
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 always readable, and prevent any visual glitches from happening when your UI is automatically inverted, guaranteeing a polished, reliable experience for your users.
We recommend that apps control the design of their themed app icon by including a monochrome layer within their adaptive icon. You can preview the themed version of your app icon using Android Studio.
Android 16 QPR2 can automatically generate a themed icon for your app if you don't provide a dedicated one. The system applies a color filtering algorithm to your existing launcher icon to render it in a monochrome style, allowing it to integrate with the user's chosen theme.
This new capability allows your app's UI to remain fully interactive when the system sharesheet is open. You can display custom UI, dynamically update the content or targets in the Chooser, and programmatically control its state. You'll use the new ChooserManager to start an interactive session and the ChooserSession object to manage it.
A new 3rd-party Data Transfer API is being introduced to enable more reliable and secure data migration between Android and iOS devices. Your app can now opt-in to participate in cross-platform data transfers. This requires updating your app's data extraction rules XML with a new <cross-platform-transfer> tag and implementing custom logic in the BackupAgent to export and import app data to and from other platforms. New methods are also being added to BackupAgent, such as onMeasureFullBackup, to give you more control over the backup process for large datasets.
The android.graphics.pdf package has been significantly expanded to support annotating and editing PDF documents. This class provides core APIs for apps that wish to create their own PDF user experience, and is the foundation for the Jetpack PDF library, which also provides the UI for an embedded PDF viewer. The PdfRenderer.Page class now allows you to:
With these new APIs, your apps can support use cases such as form filling, document signing, document review/collaboration, interactive study/note taking, and more. We're also working to bring these annotation and editing capabilities to the Jetpack PDF library to further simplify the integration of these features.
To support advanced multi-display experiences, the new Display Topology API provides your app with information about how multiple displays are arranged — their relative positions and absolute bounds. A new Display.isInternal() method helps distinguish between built-in and other screens. You can also register a TopologyListener to receive real-time updates when the display setup changes.
ViewConfiguration values (e.g., touch slop, long press timeout) can now be tailored to individual virtual devices. This means that an app running on a virtual device will now use configuration values appropriate for that device's characteristics, not the host device's.
To ensure your app behaves correctly in multi-display scenarios (e.g., an activity on the phone and another on a connected smart display), you should migrate from static ViewConfiguration methods to instance-based methods by calling ViewConfiguration.get(context).
// Instead of this: // val longPressTimeout = ViewConfiguration.getLongPressTimeout() // Do this, using the specific Activity's context: val vc = ViewConfiguration.get(myActivityContext) val longPressTimeout = vc.longPressTimeout
A new API allows you to specify the usage in terms of VibrationAttributes (e.g., USAGE_TOUCH) when triggering haptic feedback. This ensures your app's vibrations align more precisely with user-defined intensity settings for different contexts, like touch vs. accessibility.
Use the new View.performHapticFeedback(HapticFeedbackRequest) method to pass a request that specifies both the HapticFeedbackConstant and the desired Usage. Existing calls will continue to work as before.
To improve the discoverability of your app's Quick Settings tiles, you can now optionally assign them to a predefined category. By adding a <meta-data> tag to your TileService declaration in the AndroidManifest.xml, your tile can be grouped with similar system tiles in the Quick Settings Edit mode.
Example for a connectivity-related tile:
<service android:name=".MyConnectivityTileService" ... > <intent-filter> <action android:name="android.service.quicksettings.action.QS_TILE" /> </intent-filter> <meta-data android:name="android.service.quicksettings.TILE_CATEGORY" android:value="android.service.quicksettings.CATEGORY_CONNECTIVITY" /> </service>
This release brings support for new audio formats, provides more granular control over audio playback, and enhances the volume experience for voice interactions.
Android 16 QPR2 adds software decoding for Immersive Audio Model and Formats (IAMF) audio. IAMF is a new open-source spatial audio format, available under a royalty free license from Alliance for Open Media. The IAMF decoder supports Opus, PCM, AAC and FLAC audio within IAMF files, in full compliance with the IAMF specification. You can leverage IAMF to deliver rich, immersive audio experiences in your Android apps.
ExoPlayer will automatically use the framework IAMF decoder when available. For backwards compatibility, the IAMF ExoPlayer Extension can also be used to decode IAMF.
Personal Audio Sharing for Bluetooth Low Energy (LE) Audio devices is now integrated directly into the system's Output Switcher. This system-level UI enhancement provides a more intuitive and consistent way for users to manage and share audio from your app to multiple LE Audio devices without requiring any changes to your existing audio playback code.
The native AAudio library for high-performance audio has been updated. These new APIs provide more control and better performance for demanding audio applications that rely on the NDK, especially those focused on power-efficient, high-quality playback.
New APIs are available to support emerging connectivity standards, enhance device management, and give users more control over network privacy.
The Companion Device Manager (CDM) is receiving several updates to improve cross-app interactions and user control in system Settings.
To support casting to devices over new mediums like Bluetooth and UWB, the MediaRouter framework is evolving. Your app can now cast to a wider array of devices, including in-car displays and gym equipment, while contributing to a more privacy-preserving discovery model.
The recommended approach is to use the system Output Switcher, which handles discovery over sensitive mediums without requiring your app to hold extra permissions. If your app uses a custom in-app picker and you want to discover devices over these new mediums, you will need to request permissions from the NEARBY_DEVICES permission group (e.g., BLUETOOTH_SCAN). New MediaRoute2Info.Builder methods are available for route providers to declare required permissions.
This release continues to enhance user privacy and device security with new features for locking devices and managing sensitive data.
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.
A user-facing toggle is being added to Theft Protection Settings, allowing users to enable or disable the "Failed Authentication Lock" security feature (introduced in Android 15) that automatically locks down your device after multiple failed login attempts.
New features and APIs are available to streamline debugging, testing, and profiling.
New AppWidgetManager APIs allow you to query for user interaction events with your widgets within a given time range, including clicks, scrolls, and impressions, providing data you can use to help you improve your widget's design.
To help you prepare for the future requirement that all apps are 16 KB page-aligned, Android will now show alignment warnings on 4 KB production devices for debuggable apps installed via ADB. If your app is not 16 KB-aligned, a dialog will appear at launch, listing the specific native libraries that need to be fixed — allowing you to address them ahead of the Play Store deadline.
The ProfilingManager has added support for new system-initiated profiling triggers, including when your app is killed by the user from the Recents screen, Force Stop, or the task manager. You can also now request the currently running background system trace using ProfilingManager.requestRunningSystemTrace(), allowing you to capture profiling that has occurred before the request takes place. Note that the background trace runs intermittently and will not be available all the time.
A new "Verbose print logging" toggle is now available in Developer Options. When enabled, the Android Print Framework and associated services will output additional debug information to logcat, which can help you troubleshoot printing-related issues in your apps.
To facilitate more robust testing of your apps on connected displays, new public APIs are available in UiAutomation to programmatically capture screenshots on non-default displays. Additionally, the AccessibilityWindowInfo.refresh() method is now public, allowing accessibility services to ensure they are working with the most up-to-date window information.
You can integrate these new UiAutomation capabilities into your test suites to expand coverage for your app's desktop mode or external monitor use cases. For accessibility service developers, calling refresh() can improve the reliability of your service.
The Android 16 QPR2 beta program runs from August 2025 until the final public release in Q4. At key development milestones, we'll deliver updates for your development and testing environments. Each update includes SDK tools, system images, emulators, API reference, and API diffs. We'll highlight new APIs and features for you to try out as they are ready to test in blogs and on the Android 16 developer website.
We’re targeting October of 2025 for our Platform Stability milestone. At this milestone, we’ll deliver final SDK/NDK APIs. From that time you’ll have several months before the final release to complete any integrations. Check out the release timeline details for milestones and updates.
You can enroll any supported Pixel device to get this and future Android Beta updates over-the-air. If you don’t have a Pixel device, you can use the 64-bit system images with the Android Emulator in Android Studio. If you are already in the Android Beta program, you will be offered an over-the-air update to Beta 1. We’ll update the system images and SDK regularly throughout the Android 16 QPR2 release cycle.
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.
For the best development experience with Android 16 QPR2, we recommend that you use the latest Canary of the feature drop of Android Studio (Narwhal).
We're looking for your feedback so please report issues and submit feature requests on the feedback page. 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.