In my previous musings post,
I wrote:
Android 16 Beta 1 probably is the last Android 16 pre-release version with significant
API changes.
I had not realized that “platform stability” is slated for March, after two betas.
This is a bit of a change from our recent round of OS version updates, where
platform stability hit with Beta 1.
Regardless, here are a fresh round of musings, based on the API differences report
and the blog post. As
usual, I focus on things that did not get mentioned in the blog post or where the blog
post had some issues, such as with the first items.
What Makes Me Like Editors
In the blog post, there is a section named “Elegant font APIs deprecated and disabled”,
with the following:
Apps targeting Android 15 (API level 35) have the elegantTextHeight
TextView
attribute set to true
by default, replacing the compact font with one that is much more readable. You could override this by setting the elegantTextHeight
attribute to false
.
Android 16 deprecates the elegantTextHeight
attribute, and the attribute will be ignored once your app targets Android 16. The “UI fonts” controlled by these APIs are being discontinued, so you should adapt any layouts to ensure consistent and future proof text rendering in Arabic, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam, Odia, Telugu or Thai.
That is fine, up to the part about the “UI fonts” being discontinued. It is unclear
if this means:
-
The changes made in Android 15 are being rolled back, and we’re on our own for dealing with this font rendering issue, or
-
The changes made in Android 15 are being mandated (no more opt-out)
What Seems Janky
There are a new series of APIs for identifying UI jank at runtime, centered around
AppJankStats
and
RelativeFrameTimeHistogram
.
Presumably, this ties into the Jetpack JankStats library.
You can ask a View
to add your own jank stats,
though it is unclear when we would want to do this.
What Seems Advanced, and Possibly Protective
Google has had their Advanced Protection Program
for quite some time. Android 16 now has AdvancedProtectionManager
.
Right now, all we can do is find out when the device has been enrolled in “advanced
protection”, or unenrolled from the same. I am assuming that the naming here is
intentional, and that AdvancedProtectionManager
is connected to the Advanced Protection
Program, but that is not certain.
Note that you might need to request the QUERY_ADVANCED_PROTECTION_MODE
permission
to use this API, though it is unclear whether this is a runtime permission or not.
What Might Be Fruit-Flavored
iOS and Android have had distinct approaches towards application settings. iOS tends
to expect apps to register to have a screen inside the system Settings app, with
centrally-managed settings. Android has largely left application settings up to
individual developers.
Android 16, though, adds a SettingsPreferenceService
that apps can implement. This exposes APIs to enumerate available settings and allow
clients to read and write those settings. My guess is that this is a foundation piece
for eventually having the system Settings app expose application-level settings via
a standard UI.
What Other Things Changed in Settings
There are four new action strings
for launching screens within the system Settings app:
- What is the first day of the week
- What is the unit measurement system (SI, Imperial)
- What is the temperature unit system (Celsius, Fahrenheit)
- What is the “region” (uncertain what this means, presumably a geographic region)
As a physics major, I hope that Kelvin is a valid temperature unit.
What Else Seemed Interesting
DevicePolicyManager
now has APIs related to “auto time”.
Based on the API, I am guessing that this refers to the device being able to synchronize
the time and time zone with external data sources, such as SNTP servers or time data
baked into cell signals.
App widgets are returning to the “keyguard” (locked screen state), at least on tablets
IIRC. If you do not want your app widget being offered there,
you can now declare that expectation.
You can now find out when displays are added, removed, and altered.
“Altered” includes changes to the refresh rate.
There are a bunch of additional IAMF audio formats for encoding/decoding.
There are many new key events,
including F13 through F24.
—Feb 15, 2025
This week brought us updates to Media3 and test libraries:
androidx.media3:media3-cast:1.6.0-alpha02
androidx.media3:media3-cast:1.6.0-alpha03
androidx.media3:media3-common:1.6.0-alpha02
androidx.media3:media3-common:1.6.0-alpha03
androidx.media3:media3-common-ktx:1.6.0-alpha02
androidx.media3:media3-common-ktx:1.6.0-alpha03
androidx.media3:media3-container:1.6.0-alpha02
androidx.media3:media3-container:1.6.0-alpha03
androidx.media3:media3-database:1.6.0-alpha02
androidx.media3:media3-database:1.6.0-alpha03
androidx.media3:media3-datasource:1.6.0-alpha02
androidx.media3:media3-datasource:1.6.0-alpha03
androidx.media3:media3-datasource-cronet:1.6.0-alpha02
androidx.media3:media3-datasource-cronet:1.6.0-alpha03
androidx.media3:media3-datasource-okhttp:1.6.0-alpha02
androidx.media3:media3-datasource-okhttp:1.6.0-alpha03
androidx.media3:media3-datasource-rtmp:1.6.0-alpha02
androidx.media3:media3-datasource-rtmp:1.6.0-alpha03
androidx.media3:media3-decoder:1.6.0-alpha02
androidx.media3:media3-decoder:1.6.0-alpha03
androidx.media3:media3-effect:1.6.0-alpha02
androidx.media3:media3-effect:1.6.0-alpha03
androidx.media3:media3-exoplayer:1.6.0-alpha02
androidx.media3:media3-exoplayer:1.6.0-alpha03
androidx.media3:media3-exoplayer-dash:1.6.0-alpha02
androidx.media3:media3-exoplayer-dash:1.6.0-alpha03
androidx.media3:media3-exoplayer-hls:1.6.0-alpha02
androidx.media3:media3-exoplayer-hls:1.6.0-alpha03
androidx.media3:media3-exoplayer-ima:1.6.0-alpha02
androidx.media3:media3-exoplayer-ima:1.6.0-alpha03
androidx.media3:media3-exoplayer-midi:1.6.0-alpha02
androidx.media3:media3-exoplayer-midi:1.6.0-alpha03
androidx.media3:media3-exoplayer-rtsp:1.6.0-alpha02
androidx.media3:media3-exoplayer-rtsp:1.6.0-alpha03
androidx.media3:media3-exoplayer-smoothstreaming:1.6.0-alpha02
androidx.media3:media3-exoplayer-smoothstreaming:1.6.0-alpha03
androidx.media3:media3-exoplayer-workmanager:1.6.0-alpha02
androidx.media3:media3-exoplayer-workmanager:1.6.0-alpha03
androidx.media3:media3-extractor:1.6.0-alpha02
androidx.media3:media3-extractor:1.6.0-alpha03
androidx.media3:media3-muxer:1.6.0-alpha02
androidx.media3:media3-muxer:1.6.0-alpha03
androidx.media3:media3-session:1.6.0-alpha02
androidx.media3:media3-session:1.6.0-alpha03
androidx.media3:media3-test-utils:1.6.0-alpha02
androidx.media3:media3-test-utils:1.6.0-alpha03
androidx.media3:media3-test-utils-robolectric:1.6.0-alpha02
androidx.media3:media3-test-utils-robolectric:1.6.0-alpha03
androidx.media3:media3-transformer:1.6.0-alpha02
androidx.media3:media3-transformer:1.6.0-alpha03
androidx.media3:media3-ui:1.6.0-alpha02
androidx.media3:media3-ui:1.6.0-alpha03
androidx.media3:media3-ui-compose:1.6.0-alpha03
androidx.media3:media3-ui-leanback:1.6.0-alpha02
androidx.media3:media3-ui-leanback:1.6.0-alpha03
androidx.test:core:1.7.0-alpha01
androidx.test:core-ktx:1.7.0-alpha01
androidx.test:monitor:1.8.0-alpha01
androidx.test:orchestrator:1.6.0-alpha02
androidx.test:rules:1.7.0-alpha01
androidx.test:runner:1.7.0-alpha01
androidx.test.espresso:espresso-accessibility:3.7.0-alpha01
androidx.test.espresso:espresso-contrib:3.7.0-alpha01
androidx.test.espresso:espresso-core:3.7.0-alpha01
androidx.test.espresso:espresso-device:1.1.0-alpha01
androidx.test.espresso:espresso-idling-resource:3.7.0-alpha01
androidx.test.espresso:espresso-intents:3.7.0-alpha01
androidx.test.espresso:espresso-remote:3.7.0-alpha01
androidx.test.espresso:espresso-web:3.7.0-alpha01
androidx.test.espresso.idling:idling-concurrent:3.7.0-alpha01
androidx.test.espresso.idling:idling-net:3.7.0-alpha01
androidx.test.ext:junit:1.3.0-alpha01
androidx.test.ext:junit-ktx:1.3.0-alpha01
androidx.test.ext:truth:1.7.0-alpha01
androidx.test.services:storage:1.6.0-alpha02
androidx.test.services:test-services:1.6.0-alpha02
Note that androidx.media3:media3-ui-compose
is a new artifact.
—Feb 05, 2025
Android 16 Beta 1 probably is the last Android 16 pre-release version with significant
API changes.
So, in addition to the blog post
and the features-and-changes list,
let’s see what is was modified with less fanfare.
What Else Changed with Notifications?
One of the major items that was announced is support for “progress-centric notifications”,
also known as “Live Updates”, because branding is hard.
In addition, though, they have added the concept of “promoted notifications”. You
can see if your app is allowed to do this,
and if not, ask the user to allow it.
It is unclear how to designate individual notifications as “promoted”, but
there is a flag to identify those that were.
Quoting the docs:
Properly formatted priority notifications are elevated in appearance. For example they may be able to use colors, have richer progress bars, show as chips in the status bar, and/or permanently appear on always-on-displays. This functionality is intended to be reserved for user initiated ongoing activities like navigation, phone calls, and ride sharing.
Oddly, that rationale is part of the “Live Updates” definition. Perhaps ProgressStyle
notifications will get the “promoted” treatment, if the user allows.
What Is “Ranging”, And Does It Involve Herding Livestock?
There is a new RangingManager
system service.
This allows you to find out what sorts of technology is available on the device to
determine the device’s location relative to local signals, using various Bluetooth
specs or WiFi round-trip times. If 1+ of those technologies are available, you can
open a RangingSession
to start and stop trying to determine your device’s relative location.
There is also a new hardware feature
to be able to filter installs to only be on devices that support Bluetooth Channel
Sounding.
What Sounds Like a National Security Issue?
There is a new SatelliteManager
,
described as:
Manages satellite states such as monitoring enabled state and operations such as provisioning, pointing, messaging, location sharing, etc.
Notably, that description does not say whose satellites you get to manage this way.
(in reality, this seems to be tied to “satphone” telephony)
What Left Without Saying “Goodbye”?
android.app.appsearch.functions
has vanished. Other app functions-related APIs were retained.
They also removed intentMatchingFlags
, used to refine the Intent
matching rules
that were applied to your components.
BATTERY_PROPERTY_STATE_OF_HEALTH
, a BatteryManager
value to determine how healthy
the battery is, was eliminated.
The removed setFrameRate()
on Surface
and other frame rate-related values.
What Came Back to Life?
isImportantWhileForeground()
on JobInfo
was deprecated and now is undeprecated.
In related news, “undeprecated” is a word, apparently.
What Holes Got Plugged?
It would appear that the 16KB page boundary change for native libraries did not go
as smoothly as desired, as you can opt into supporting 4KB mode.
What Else Showed Up?
There is a new TetheringManager
.
Probably this is a system service, though they did not add an associated name for it
to Context
. This is for controlling tethering functionality (e.g., WiFi hotspot, presumably).
TtsSpan
, for providing more detail for text-to-speech, now supports
a duration type.
—Jan 25, 2025