Android 8.0: What You Should Worry About

Minimizing the Panic

The Slow Roll of 8.0

  • 8.0 will affect 1% of users by end of 2017, 15-20% by end of 2018
  • 2017 will feature disproportionate number of "power users"

Minimizing the Panic

"Focus, Daniel-san. Focus."

  • OMG my code's gonna break
  • OK, when ya gonna implement this thing that everyone else has?
  • Oh, hey, that's cool for users, cheap and easy for us
    • Normally, a reasonable amount of this
    • Android 8.0, not so much

Breaking Changes

Putting the O in OMG

  • Background service changes
  • Background location degradation
  • Implicit broadcast ban
  • Changes in app management
  • Changes with overlay windows
  • Changes with ANDROID_ID

Background Service Lifetime

We Can't Have Nice Things

  • Limited to "several minutes"... where "several" seems be "one"
  • After that, service will be stopped, akin to stopService()
  • Does not directly terminate your process, but dramatically increases the odds that it will terminate shortly
  • Affects targetSdkVersion 26... and anyone the user chooses to blame

Background Service Lifetime

The Workarounds

  • Foreground service
  • JobIntentService
    • On Android 7.1 and older, behaves like IntentService
    • On Android 8.0+, uses JobScheduler
    • Gives you a larger but undocumented window for work (10 minutes?)

Starting Services in the Background

For Those of You Inclined to Cheat

  • After the one-minute background service window, background services are stopped and cannot be started
  • There in part to avoid "ping-pong" way to work around background service limit
  • Also affects you if your app has never been in the foreground (e.g., ACTION_BOOT_COMPLETED)
  • Affects targetSdkVersion 26... and anyone the user chooses to blame

Starting Services in the Background: Workarounds


  • startForegroundService()
  • getForegroundService() on PendingIntent
  • JobIntentService

Background Location Degradation

We Can't Know Where the Nice Things Are

  • While app is in the background, location updates will be sporadic
  • May be superfluous, as your ability to work in the background is limited anyway
  • Continuous location updates probably requires a foreground service

Implicit Broadcast Ban

Because Polling Is So Much More Efficient... Wait...

  • targetSdkVersion 26 apps cannot receive implicit broadcasts via manifest-registered receivers
  • Massive expansion of formerly uncommon limitation (e.g., ACTION_BATTERY_CHANGED)
  • Rationale: process churn
  • Select system implicit broadcasts are whitelisted, as are self-broadcasts protected by signature permissions

Implicit Broadcast Ban

The Workarounds: Receivers

  • If internal to your app, switch to an event bus
  • Find another way to get this information, via polling and JobScheduler
  • Use a foreground service and a dynamic receiver
  • Keep your targetSdkVersion below 26 until you can figure out a better workaround

Implicit Broadcast Ban

The Workarounds: Senders

  • If internal to your app, switch to an event bus
  • Use explicit broadcasts
    • Single peer app? Single explicit broadcast
    • Unknowable number of recipients? Manual fanout
  • Switch to some other API model that supports polling and JobScheduler

Detecting Package Changes

Because Polling... Didn't We Cover This Already?

  • ACTION_PACKAGE_ADDED and kin subject to implicit broadcast ban
  • Workaround: JobScheduler and getChangedPackages()

Installing/Removing Apps

Admitting There's More Than the Play Store

  • Users can now grant install/removal rights on a per-app basis
  • Mechanics
    • Can call canRequestPackageInstalls() on PackageManager

Misc Breaking(?) Changes

On Stuff That I Try to Avoid Using

  • Floating windows (e.g., TYPE_SYSTEM_ALERT)
    • Now all devolve to TYPE_APPLICATION_OVERLAY
    • Cannot overlay "critical system windows" (e.g. IME)
    • User has system-generated notification to block these windows

Misc Breaking(?) Changes

On Stuff That I Try to Avoid Using

    • Now per-user/per-app (or, more accurately, per sharedUserId)
    • Part of continued privacy moves, to block device-level identifiers

What Android 8.0 Users Will Expect

TL;DR: Not Too Much

  • Notification channels
  • Autofill
  • Your app not crashing horribly due to the aforementioned breaking changes
  • A pony

Notification Channels

500 Channels, Still Nothing On

  • New home for hardware requests (LED, vibration, etc.) and importance
  • Allow user to override those settings on a per-channel basis
  • Notifications raised in the context of a channel
  • Use channel groups if you have lots of channels
  • Idea: allow users to tailor notifications based on their perceived value

Mechanics of Notification Channels

Not That Bad, All Things Considered

  • On first run, define channels and groups... which you can never modify again
  • In Notification.Builder, supply channel identifier
  • Optional: link to ACTION_CHANNEL_NOTIFICATION_SETTINGS (e.g., from your app's settings)
  • Required for targetSdkVersion 26... but no default channel for older targets


Oh, This Is Gonna Be Fun

  • Roughly analogous to equivalent feature in Web browsers
  • Pluggable autofill service providers, configured in Settings
  • User is prompted, after form finished, whether to save information for autofill
  • Later, offered opportunity to apply that autofill information in future forms

Autofill: Opting In

Come On In! The Water's Fine!

  • Apply autofill hints to fields that match specific roles (e.g, username, password, credit card number)
  • That's pretty much it

Autofill: Opting Out

Because Autofill Services Might Suck

  • Widget hierarchy: android:importantForAutofill="no" or "noExcludeDescendants"
  • Entire Activity


Autofill: Security

There Are Reasons Why I Am Worried

  • Autofill security is contingent upon well-written autofill service providers
  • Possible to leak private data to malicious apps
    • Limited if autofill service is well-written
    • Very simple if autofill service sucks
  • Details to follow