Testing involves installing your production app or a test app making use of your library or engine
using Google Play or other means onto a device or emulator running Android 17 Beta 3. Work through all your app’s flows and look for functional or UI issues. Review the behavior changes to focus your testing. Each release of Android contains platform changes that improve privacy, security, and overall user experience, and these changes can affect your apps. Here are some changes to focus on:
Android 17 allows users to independently manage where specific system sounds are played. They can choose to route notifications, ringtones, and alarms to connected hearing aids or the device’s built-in speaker, helping to avoid unwanted in-ear interruptions while maintaining a Bluetooth connection for hearing aid management apps. The routing is handled at the system level using existing audio strategy APIs, meaning your app’s audio will follow the user’s preference automatically without requiring any implementation changes or new API integrations.
Extended HE-AAC software encoder
Android 17 introduces a system-provided Extended HE-AAC software encoder. This encoder supports both low and high bitrates using unified speech and audio coding, providing significantly better audio quality for voice messages in low-bandwidth conditions. A key benefit of Extended HE-AAC is thesc mandatory support for loudness metadata, which ensures that your app’s audio maintains a consistent volume level across various devices and playback environments. You can access this encoder via the MediaCodec API using the name c2.android.xheaac.encoder or by querying for the audio/mp4a-latm MIME type.
Code Sample
Performance and Battery Enhancements
Discover how the latest system optimizations and power management tools can help you build smoother, more energy-efficient applications.
Reduce wakelocks with listener support for allow-while-idle alarms
Android 17 introduces a new variant of AlarmManager.setExactAndAllowWhileIdle that accepts an OnAlarmListener instead of a PendingIntent, without needing exact alarm permissions. Previously, apps needing exact alarms that fire during Doze or Battery Saver were limited to using PendingIntent, which often results in unnecessary overhead if your app is already in an active lifecycle state, such as running a foreground service. This new callback-based mechanism is ideal for apps that currently rely on continuous wakelocks to perform periodic tasks and want to avoid using a PendingIntent, such as messaging apps maintaining socket connections or medical devices monitoring health data. By using this API, you can receive precise callbacks without the need for long partial wakelocks, significantly reducing your app’s power consumption and allowing the device to enter suspend states more effectively.
Code Sample
val alarmManager = getSystemService(AlarmManager::class.java)// Do work here
}
listener,
null
)
Privacy updates
This section covers new privacy enhancements designed to give users more granular control over their data, alongside secure, system-provided components that simplify how you handle sensitive information and permissions.
System-provided Location Button
Android is introducing a system-rendered location button that you will be able to embed directly into your app’s layout using an Android Jetpack library to provide a privacy-conscious way for users to share their precise location. When a user taps this system button, your app is granted precise location access for the current session only, and subsequent user taps during the run of the app grant the permission without a system dialog. (This offers a better user experience than using the existing permission with the ‘Only this time’ selection.) To implement this, you need to declare the USE_LOCATION_BUTTON permission. You can customize the button’s appearance, including colors, corner radius, size and a selection from a list of provided labels, while the system handles secure rendering and interaction.
Discrete password visibility settings for touch and physical keyboards
Previously, a single toggle applied to all input methods. By default, characters entered via physical keyboards are now hidden immediately, while touch inputs continue to briefly echo the last character. If your app targets the latest SDK and uses standard framework components like PasswordTransformationMethod or Jetpack Compose’s SecureTextField, it will automatically respect these new preferences. Apps with custom password fields should migrate to the new ShowSecretsSetting API to ensure their implementation aligns with the user’s system-wide privacy choices.
Security
To help you build safer experiences, we are introducing new system-level security enhancements that provide stronger protections for user privacy and app access.
Enforced read-only dynamic code loading
To improve security against code injection attacks, Android now enforces that dynamically loaded native libraries must be read-only. If your app targets Android 17 or higher and attempts to load a native library it must be read-only otherwise the system will throw an exception.
Code Sample
val libraryFile = File(context.filesDir, “my_native_lib.so”)
// … download or write the library file …
// Mark the file as read-only before loading to comply with Android 17+ security requirements
libraryFile.setReadOnly()
Post-Quantum Cryptography (PQC) Hybrid APK Signing
To prepare for future advancements in quantum computing, Android is introducing support for Post-Quantum Cryptography (PQC) through the new v3.2 APK Signature Scheme. This scheme utilizes a hybrid approach, combining a classical signature (such as RSA or Elliptic Curve) with an ML-DSA (Module-Lattice-Based Digital Signature Algorithm) signature. This allows your app to meet upcoming NIST standards while remaining compatible with existing devices. When you adopt hybrid signing, your app updates must maintain both the classical and PQC signers in the signing lineage. Furthermore, the system now enforces that signature-based capabilities, such as shared user IDs and permission grants, require validation of both signers to prevent security compromises. You can implement this new scheme using the updated apksigner tool, which has been enhanced to support ML-DSA key instantiation and hybrid block generation.
User experience and system UI
Better support for widgets on external displays
This feature improves the visual consistency of app widgets when they are shown on connected or external displays with different pixel densities. You can now use a new overload for RemoteViews.setViewPadding that accepts complex units, such as DP or SP, allowing the system to resolve the correct pixel values at rendering time. To help your app adapt its content, the system now includes OPTION_APPWIDGET_DISPLAY_ID in the widget’s options bundle, which you can use to retrieve the specific DisplayMetrics for the target screen. Additionally, for apps using legacy pixel-based APIs for padding, text size, or layout attributes, the system now automatically scales these values based on the density difference between your app’s original context and the target display.
val options = appWidgetManager.getAppWidgetOptions(appWidgetId)
val remoteViews = RemoteViews(context.packageName, R.layout.widget_layout)
R.id.container,
16f, 8f, 16f, 8f,
)
Hidden app labels on the home screen
Android now provides a user setting to hide app names (labels) on the home screen workspace, accessible via the system customization and wallpaper picker settings. While this is a user-facing preference that requires no code changes to your app, this is one more reason to ensure that your app icon is distinct and recognizable to help users identify your app when labels are hidden.
Desktop Interactive Picture-in-Picture
Android introduces an Interactive Picture-in-Picture (iPiP) mode as part of Android’s desktop windowing, accessible via the new ActivityManager.AppTask.requestWindowingLayer() API. This feature allows your app to request that its task be moved to a “pinned” windowing layer when Android is running in desktop windowing mode — an optional mode for tablets and the default mode on connected external displays.
Unlike traditional Picture-in-Picture, these pinned windows remain interactive while staying always-on-top of other application windows. To use this feature, your app must declare the USE_PINNED_WINDOWING_LAYER permission and ensure the Picture-in-Picture special permission is granted. The system manages the decorations, maximum size and initial positioning of these windows to ensure consistency; your app cannot programmatically move the window, though it can request resizes. This is particularly useful for multi-tasking scenarios, such as keeping video call controls accessible while navigating other apps.
Code Sample
context.mainExecutor,
override fun onResult(result: Int) {
// Task successfully moved to pinned layer
}
// The system is in a state where the request cannot be fulfilled, but the request itself was valid
}
}
override fun onError(error: Exception) {
// Handle developer error, such as missing permission
}
}
)
Redesigned screen recording toolbar
Android is introducing a redesigned screen recording experience that improves the user interface and adds new capabilities for content creators. The update includes a new floating toolbar that provides easier access to recording controls and capture settings. The system-level UI is designed to be visible to the user during the recording process but is automatically excluded from the final video capture.There are no changes required for your app to support this new UI.
Bubbles
Bubbles is a windowing mode feature that offers a new floating UI experience separate from the messaging bubbles API. We covered this feature in the Beta 2 blog post, and it’s now fully enabled in the beta 3 release (as well as in the Android Canary channel).
Core functionality
VPN app exclusion settings
Android now provides a standardized way for VPN apps built on the VpnManager framework to offer app exclusion (split-tunneling) capabilities. By using the new ACTION_VPN_APP_EXCLUSION_SETTINGS Intent, your app can launch a system-managed Settings screen where users can select specific installed applications to bypass the VPN tunnel. This allows traffic from excluded apps to use the underlying network directly, which is useful for services incompatible with VPNs. The system identifies your app as the caller and manages an exclusion list specific to your VPN profile. Changes made by the user take effect immediately if the VPN is active or upon its next connection.
Support for the Intent is mandatory on phones and tablets; however, as a standard practice, developers should always verify that a Settings activity is available to handle it using resolveActivity() before launching the Intent.
Code Sample
val intent = Intent(Settings.ACTION_VPN_APP_EXCLUSION_SETTINGS)
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)}
Dynamic system font fallback updates
Android now supports dynamic updates to the system’s font fallback chain at runtime. This allows the system to deliver updated emoji sets and improved typography assets more frequently without waiting for a full OS update. When the fallback chain is updated, the system automatically invalidates the global Typeface cache. Your app does not need to make any modifications; it will automatically pick up and render the latest font assets during its next layout and draw pass, ensuring a consistent and modern visual experience for your users.
OpenJDK 25 and 21 API updates
Android continues to modernize its core libraries by integrating a broader range of APIs from recent OpenJDK releases. This update brings extensive features and refinements from OpenJDK 21 and OpenJDK 25, including the latest Unicode support in the Character class and enhanced SSL support for named groups in TLS, which enables more modern cryptographic standards. You’ll also find numerous additions across fundamental packages like java.lang, java.util, and javax.xml, providing more robust language utilities for your development workflow. These improvements align Android with modern OpenJDK standards, enhance code portability, and ensure a consistent foundation for years to come.
Health and fitness
Health Connect Device Data Providers
Android now supports Device Data Providers (DDPs) within Health Connect, allowing hardware sources like the phone itself or Wear OS watches to contribute health and fitness data directly. This feature introduces new APIs for you to query available device data sources, understand device capabilities, and properly attribute data to specific hardware. If your app reads data from Health Connect, you can now distinguish between data generated by apps and data originating directly from system-verified hardware.
Get started with Android 17
If you are currently in the Android Beta program, you will be offered an over-the-air update to Beta 3.
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.
For the best development experience with Android 17, we recommend that you use the latest preview of Android Studio (Panda). Once you’re set up, here are some of the things you should do:
- Compile against the new SDK, test in CI environments, and report any issues in our tracker on the feedback page.
- Test your current app for compatibility, learn whether your app is affected by changes in Android 17, and install your app onto a device or emulator running Android 17 and extensively test it.
We’ll update the preview/beta system images and SDK regularly throughout the Android 17 release cycle. Once you’ve installed a beta build, you’ll automatically get future updates over-the-air for all later previews and Betas.
For complete information, visit the Android 17 developer site.
Join the conversation
Your feedback remains our most valuable asset. Whether you’re an early adopter on the Canary channel or an app developer testing on Beta 3, consider joining our communities and filing feedback. We’re listening.










