Home / News / Android 16 QPR2 Beta 1 is here

Android 16 QPR2 Beta 1 is here

Posted by Matthew McCullough – VP of Product Management, Android Developer

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:

    • Enhanced User Experience: A better experience across all form factors, from phones to foldables and tablets.
    • Enabling Richer Apps: New APIs for creative expression, productivity, media, and connectivity.
    • Developer Productivity: new platform features to help you debug and test your apps.

A minor SDK version

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.

Android 16 SDK release cadence

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.

UI, system experience, and accessibility

This release introduces refinements to the system UI, user experience, and accessibility, from theming changes to input handling to new APIs for adaptive apps.

Dark theme’s new expanded option

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.

A split image showing standard light theme on the left and expanded dark theme on the right on a pixel device

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.

Auto-themed app icons

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.

Interactive chooser sessions

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.

Smoother Android migrations

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.

PDF document editing

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.

Display Topology API

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.

Device-aware ViewConfiguration

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

More granular haptic feedback control

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.

Quick Settings Tile categories

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>

Additional UI and System Experience updates

    • Controlled Mouse Scrolling: A new mouse system setting allows users to enable “Controlled Scrolling” for external mice, which makes scrolling speed directly proportional to the physical wheel movement.
    • Picture-in-Picture (PiP) Refactoring: The underlying mechanics of PiP transitions have been refactored, resulting in smoother and more reliable animations.
    • Public System Update Intent: The android.settings.ACTION_SYSTEM_UPDATE_SETTINGS intent action is now a public API, providing a standardized way for apps to direct users to their device’s system update page. See the documentation for how to launch this intent securely.
    • Time Zone Notifications: The system will now notify users when their time zone is automatically changed.
    • Files Desktop UX: The DocumentsUI file manager is receiving a Material 3 Expressive design refresh and will show “Visual Signals” for file operations.
    • Printer Info Screen: The Android Default Print Service now displays a more comprehensive printer information screen, including status and supply levels.

Media and Audio

This release brings support for new audio formats, provides more granular control over audio playback, and enhances the volume experience for voice interactions.

IAMF decoding support

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 in Output Switcher

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.

New AAudio APIs for performance and control

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.

    • Partial Buffer Processing in Callbacks: A new data callback, AAudioStream_partialDataCallback, allows your app to specify exactly how many frames it has processed. This gives you more flexibility when working with large data buffers (like in compressed offload scenarios), as you no longer need to provide the entire requested buffer at once.
    • PCM Offload over MMAP: To improve power efficiency, AAudio now supports PCM offload over the MMAP path. You can request this by setting the performance mode to AAUDIO_PERFORMANCE_MODE_POWER_SAVING_OFFLOADED. A new API, AAudioStream_flushFromFrame, is also available for MMAP offload streams to reset the playback position when a user seeks or skips a track.

Additional Media and Audio updates

    • HDR/SDR Brightness Slider: A new system-level slider allows users to adjust the perceived brightness of HDR content. Your app’s HDR content will automatically adapt to this user preference without any required code changes.

Connectivity

New APIs are available to support emerging connectivity standards, enhance device management, and give users more control over network privacy.

Companion Device Management enhancements

The Companion Device Manager (CDM) is receiving several updates to improve cross-app interactions and user control in system Settings.

    • Custom device icons: Your app can now provide a custom icon for self-managed device associations by supplying a Bitmap using the new setDeviceIcon() method on the AssociationRequest.Builder. The icon will be displayed in system dialogs and settings, creating a more recognizable and trusted user experience. You can also retrieve the icon for an existing association using AssociationInfo.getDeviceIcon().
    • Association removal notifications: Your app can now listen for the EVENT_ASSOCIATION_REMOVED callback via startObservingDevicePresence. This event fires when a user “forgets” a device in system Settings or when your app’s data is cleared, allowing your app to maintain an accurate connection state.
    • Cross-App verification: System apps can now verify if your companion app has a legitimate association with a device and monitor the presence of devices managed by your app using the DeviceId created during association with the new createAndSetDeviceId API.

Additional connectivity updates

MediaRouter Network Privacy improvements

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.

Privacy and Security

This release continues to enhance user privacy and device security with new features for locking devices and managing sensitive data.

Secure Lock Device

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.

Phone Theft Protection toggle

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.

Additional Security updates

Developer productivity

New features and APIs are available to streamline debugging, testing, and profiling.

Widget engagement metrics

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.

Early warnings for 16KB page size compatibility

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.

Android 16 program timeline highlighting beta releases in August

Enhanced profiling with new system triggers

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.

Debug printing with a new developer toggle

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.

More robust testing for desktop and multi-display experiences

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.

    • API for Backported Fixes: Android 16 QPR2 contains support for the upcoming androidx.core:core-backported-fixes library, which will allow your app to programmatically query if a specific critical bug has been fixed on a device, enabling you to roll out features that depend on the fix much faster, without waiting for an OS release.
    • GUI Apps in Linux Terminal: The Linux terminal feature is being expanded to support running Linux GUI applications directly within the terminal environment virtual machine.
    • RootView Changed Listener: The WindowInspector class now includes addGlobalWindowViewsListener(), which allows your app or testing framework to be notified in real-time when root views (like Toasts) are added or removed, improving telemetry and test efficiency.

Program timeline

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.

Android 16 program timeline highlighting beta releases in August

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.

Get started with the Android 16 QPR2 beta

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.

Tagged: