Random Musings on the N Developer Preview 2
Each time Google releases a new developer preview, I try to talk about the changes that Google isn’t talking about.
N Developer Preview 2 is an incremental change over N Developer Preview 1. The announcement blog post does not mention all that much, spending the most screen space talking about emoji. However, despite that, there are things that you really should know about NDP2 compared to the previous NDP1, beyond what is mentioned there. And, yes, beyond emoji.
Regressions… Compared to Production Android
Google changed the “Behavior Changes” page without pointing out what the actual changes were in NDP2 compared to NDP1. Of note:
Google admitted that the
Urischeme is defunct, as we discovered the hard way in NDP1
In the same section of the docs, Google now points out that
MODE_WORLD_WRITEABLE, beyond merely being deprecated, will crash with a
SecurityException, and that attempts to access
DownloadManagerwill also result in a
StrictModeconfiguration for checking for network I/O on the main application thread must have been focused on HTTP APIs or something. Regardless, apparently you could open and write to a
Socketdirectly without triggering the dreaded
NetworkOnMainThreadException. This has been tightened up. Apps that had skated by with UI-thread network I/O due to this hole now need to be patched.
Regresssions… Compared to NDP1
Some symbols that you used in your NDP1 tests may have been revised in NDP2, so be compared for some compilation errors.
For example, a number of things related to multi-window support changed:
android:minimumSizenow split into
Modewas also added in other related spots (e.g.,
Minor Bits of Goodness
While I tend to focus on the problem areas, there are some less-known good things that arose in NDP2.
onSaveInstanceState()and various other methods that involved IPC, if they resulted in a
TransactionTooLargeException(e.g., the state
Bundleexceeding 1MB), would fail fairly quietly. Now, such exceptions will be wrapped in some form of
RuntimeException. This should not result in new problems, but it may result in new exceptions. While that may cause angst, the exception details will help you clean up your code, since it was not working correctly previously anyway.
Debug.startMethodTracing(), IIRC, used to write its output to the root of external storage. Now, it will write to
getExternalFilesDir()or someplace around there. In a nutshell, you will not need
WRITE_EXTERNAL_STORAGEjust to capture method traces.
PowerManagernow has a
SUSTAINED_PERFORMANCE_WAKE_LOCK, described as “used by Gaming and VR applications to ensure the device provides will provide consistent performance over a large amount of time”. It is unclear exactly what the behavior of this will be.
Long-time Android developers will remember that
Activityused to support
getLastNonConfigurationInstance(). These were deprecated back in API Level 11, replaced by retained fragments. For some reason, they have been un-deprecated (de-deprecated? dis-deprecated? anti-deprecated?!?) in NDP2.
I reported in the NDP1 “random musings” post that
Activityhad a new
onProvideKeyboardShortcuts()method, suggesting a greater emphasis on physical keyboards. That was removed in NDP2, with no obvious replacement. If it was removed because I pointed it out, I wish to apologize to
onProvideKeyboardShortcuts()and its next of kin.
There is a whole new
android.os.healthpackage, described as:
Applications running in the background are responsible for a significant amount of battery usage on a typical android device. There are several things that applications can do in order to reduce their impact… This package provides more insight into what is going on behind the scenes when an application is running.
The API seems convoluted, at least on first glance, and it is largely
undocumented at this point. But, it appears
that we can access things like the number of times our
were invoked, how many times our services were started, how many ANRs
we generated, how much CPU time we have used, and so forth.
Some of the bugs that I filed against NDP1 were fixed. Of note, it appears that the multi-window minimal-size stuff works better and the network security configuration is no longer sensitive to whitespace.
However, some bugs that I filed are still outstanding, such as
RemoteInput documentation gap.
Plus, all three of my
TileService bugs still seem to be outstanding:
One bug is
partially fixed, and it’s an interesting one. For many years,
the documentation has claimed that you can use a
Uri to install an app.
This does not work on production versions of Android
and did not work on NDP1,
as there was simply no activity that could handle installing with
Uri. On NDP2, the activity now exists.
It doesn't work, at
least in my tests, and so once I have a fresh up-to-date sample, I will
be filing a fresh bug report to match. If you are implementing some
sort of app installer, or a self-upgrading app, having
is very useful for security, which is why it was frustrating that Google
ignored this for years.
I am sure that many more things changed in NDP2 than I caught in the past couple of hours. And most of what I pointed out in NDP1 stil holds true.
Need an extra hand with your Android app development project? CommonsWare can help — reach out for details!