Random Musings on the Android 17 Beta 3

Well, Android 17 Beta 3 dropped. Ordinarily, we would expect a third beta to be a very minor release, especially since the point of this release is that Android 17 “officially reached platform stability”. Instead, Beta 3 might be the biggest of the pre-release versions in terms of the amount of change, and we have the least time to cope with that change. I am curious as to who in Google thinks that this approach is a good idea, and why.

Compounding the challenge is that a lot of the changes that I see in the API differences report seem to be undocumented.

So, let’s start in on the random musings…

What Feels Like Double-Speak

They added a new setExactAndAllowWhileIdle() overload on AlarmManager that takes a listener. It is “ideal for apps that currently rely on continuous wakelocks” according to the announcement blog post, but it is explained in the same post as “reducing wakelocks”. It is unclear how continuous wakelocks represent a reduction.

What Feels Like Double-Speak, Part Deux

Android now provides a user setting to hide app names (labels) on the home screen workspace. Ensure your app icon is distinct and recognizable.

Well, our app icon cannot be “distinct and recognizable” based on colors, courtesy of mandatory Material You theming. And our app icon cannot be “distinct and recognizable” based on outer shape, courtesy of user-configurable launcher icon shapes. Google’s entire point seems to be to make it such that app icons are not “distinct and recognizable”, and now some users might wind up not even having captions for those indistinguishable icons. 🧐

What Needs More Documentation

Media projection is the Android SDK’s area for screenshots and screencasts. That seems to have been expanded to cover “app content projection”, but it is unclear what that is.

There is a new SerialManager for access to serial ports. It is unclear whether this is limited to direct serial ports or if it includes things like USB-to-serial adapters.

There is a new WebAppManager “that manages the installation and querying of Web Apps” and serves as “the entry point for managing Web Apps installed as Android apps”. It is unclear whether this is communicating with the user’s default Web browser or what.

There is a new PccSandboxManager and a lot of other new APIs tied to a Private Compute Core (PCC) sandbox. It is not completely clear what use cases this is intended for and who is allowed to actually employ it.

There is a new VoiceInteractionManager that seems like it is tied to assistant or assistive technologies, but could really use more details.

What Makes It Seems Like Android Desktops Are Coming Soon

A few items showed up in this beta tied to desktop mode, such as:

What Makes Me Wonder If Spam Is Everywhere

There are now caps on how many keys an app can put in the Android Keystore.

What Seems Blurry

SurfaceView now has getBlurRegions() and setBlurRegions(). Apparently, these let you blur sections of the SurfaceView. Given the nature of SurfaceView, I am not surprised that they needed to add a dedicated API for this — with TextureView, you should be able to do your own blurs as needed. However, a bit more documentation on this would be nice.

What Is a Secret, Sometimes

ShowSecretsSetting is how we find out whether “characters entered into a password, pin or other secret field… should either be shown or echoed briefly”, with separate values for physical keyboards versus touchscreen keyboards.

What Signals Your Impending Doom

You can now find out when you are nearing your ANR timeout. Your job is to head to the escape pods before your process is terminated.

What’s Going… Going… Gone

As part of the “extensive features and refinements from OpenJDK 21 and OpenJDK 25”, Google got rid of getChars() from String. That had trickle-down effects, with getChars() being removed from SpannedString and SpannableStringBuilder, among other places.

ACTION_TAG_DISCOVERED is deprecated in favor of ACTION_NDEF_DISCOVERED, ACTION_TECH_DISCOVERED, or other approaches for NFC integration.

getInstance() on DnsResolver was removed, replaced by an equivalent constructor.

What Else is Curious

Android finally has a FileManager. However, in this case, it is not an app, but instead is a “system service manager for handling privileged, long-running file operations”. It would appear that they are trying to give us better options for background disk I/O that do not require WorkManager. See also the requests and results that it appears that you can use.

DocumentsContract defines a CATEGORY_APPROVED_DOCUMENT_HANDLER. You add this to the <intent-filter> of ACTION_SEND and/or ACTION_SEND_MULTIPLE activities that are capable of handling document intents. The system might surface your activity in new and exciting places, as the user tries sharing documents.

StrictMode now has policies tied to implicit Uri permission grants. That capability is going away with Android 18. Strangely, this policy seems to be on the recipient of the Uri, even though the bug is in the sender of the Uri for not explicitly granting permission.

getByteArray() and putByteArray() moved from Bundle to BaseBundle. If you are using PersistableBundle, this change might be very useful, if you were using hacks to get around the lack of ByteArray support previously.

Android 17 supports bridged notifications, which is “a notification sent from another device via a bridging application. The notification is displayed with customized content to differentiate it to the user from a local notification.” It is unclear what differs “bridged notifications” from notifications displayed on a projected device, though.

There is now a way to get an attribution for the source of an app interaction, though it is unclear if this is something that ordinary Android app developers might be able to leverage.

Android 17 has a new framework for supporting sending SMS-style messages over alternative transports, such as RCS or carrier pigeons or whatever.

What Ends the Annual Gaslighting

The version code for Android 17 now officially is 37, not 10000.