<CarlosDev/>

Actual

Android 8.0 Oreo: límites al segundo plano

API 26, agosto de 2017. Se acotaron los servicios en segundo plano y los broadcasts implícitos, cada notificación pidió un canal y Treble separó Android del código del fabricante.

Publicado
Lectura
18 min
Redacción
Estable
Serie
Parte 8 de 19 · Android, versión por versión
Banner de Android 8.0 Oreo, con el logo de la versión.
En este registro11 secciones

Android 8.0 Oreo es la versión que le puso correa al trabajo en segundo plano. Las apps con target API 26 ya no pueden ejecutar servicios libremente desde el segundo plano ni escuchar la mayoría de los broadcasts implícitos desde su manifest, y cada notificación tiene que pertenecer a un canal que controla el usuario. Por debajo, Project Treble separó el framework de Android del código del fabricante, para que un teléfono pudiera actualizarse sin que el fabricante del chip tuviera que rehacer su trabajo primero.

La pantalla de inicio de Android 8.0 en un Pixel: una píldora de búsqueda de Google arriba a la izquierda, el clima y la fecha, Monday, August 21, arriba a la derecha, un fondo azul oscuro y un dock con Teléfono, Mensajes, Gmail, Chrome y Cámara sobre los botones de atrás, inicio y recientes
La pantalla de inicio de Android 8.0 en un Pixel, el día del lanzamiento. Wikimedia Commons · Apache License 2.0

De un vistazo

VersiónAndroid 8.0
Nivel de API26
NombreOreo, público
Build.VERSION_CODESO
APIs finales y SDK8 de junio de 2017, con la Developer Preview 3
Lanzamiento21 de agosto de 2017. Las OTA para Pixel y Nexus llegaron por fases tras las pruebas de operador
Dispositivos de lanzamientoSony Xperia XZ1 y XZ1 Compact, anunciados el 31 de agosto de 2017, los primeros teléfonos que salieron con ella. Pixel 2 y Pixel 2 XL, anunciados el 4 de octubre de 2017, los primeros teléfonos de Google que salieron con ella
Plazo de target API en Google PlayApps nuevas desde agosto de 2018, actualizaciones de apps existentes desde noviembre de 2018

La primera developer preview salió el 21 de marzo de 2017, para Nexus 5X, Nexus 6P, Nexus Player, Pixel, Pixel XL y Pixel C; las cuatro developer previews son las partes que siguen a esta vista general. Google congeló la API el 8 de junio de 2017 y ese mismo día abrió Play a las apps con target API 26. El 21 de agosto publicó el código en AOSP, actualizó los dispositivos de Android Beta y anunció que las versiones para Pixel, Nexus 5X, Nexus 6P, Pixel C y Nexus Player estaban en pruebas con los operadores. Las primeras etiquetas públicas de AOSP para esos dispositivos llevan parches de seguridad de agosto de 2017.

El nombre se anunció ese mismo día, durante el eclipse solar, con galletas Oreo temáticas de Android que Nabisco hizo para el evento de lanzamiento.

Qué trajo

  • Límites en segundo plano. Es el cambio que define la versión; está detallado más abajo, en “Qué cambió para tu app”.
  • Canales de notificación. Cada notificación pertenece a un canal que la app crea con NotificationChannel. El usuario elige sonido, vibración e importancia por canal; Ajustes los llama “categories”. Una vez creado el canal, la app ya no puede cambiar su comportamiento, solo su nombre y su descripción.
  • Más controles de notificación. Puntos de notificación en los íconos del launcher, posponer notificaciones, setTimeoutAfter() para las que se cancelan solas, setColorized() para tareas en curso como la navegación o una llamada, y un MessagingStyle que muestra más contenido contraído.
  • Picture-in-picture en teléfonos. Hasta 8.0 era una función de Android TV. Una actividad se suma con android:supportsPictureInPicture y entra con enterPictureInPictureMode(PictureInPictureParams). En PiP queda pausada pero visible, así que la reproducción debe detenerse en onStop(), no en onPause().
  • Framework de autocompletado. Los gestores de contraseñas reciben una API del sistema para llenar formularios de acceso y de pago en cualquier app. Las vistas de entrada estándar funcionan con él sin código; el usuario elige el servicio en Ajustes.
  • Íconos adaptables. Un ícono tiene dos capas, primer plano y fondo, de 108×108 dp cada una. La máscara del fabricante recorta la forma, y solo los 66×66 dp centrales se ven siempre.
  • Fuentes como recursos. Las fuentes van en res/font/ y se usan en los layouts por nombre. Las fuentes descargables permiten compartir una fuente desde un proveedor en lugar de incluirla en el APK; el mismo mecanismo entrega emoji actualizados. La Support Library 26 lleva ambas cosas a versiones anteriores.
  • Otros añadidos. TextView con tamaño automático, accesos directos y widgets anclados (requestPinShortcut()), color de gama amplia por actividad, Wi-Fi Aware, soporte de LDAC y Bluetooth 5, TextClassifier para la selección inteligente de texto, java.time, java.nio.file y java.lang.invoke de OpenJDK, y cuotas de caché por app (getCacheQuotaBytes()). WebView suma APIs de Safe Browsing, de versión, de terminación del renderer y de importancia del renderer; una actividad puede pasar de una pantalla a otra, y la app puede elegir en cuál se abre; el emparejamiento de dispositivos complementarios permite personalizar el diálogo de emparejamiento por Bluetooth, BLE y Wi-Fi.
  • Los usuarios vieron una app de Ajustes reorganizada, un set de emoji rediseñado con más de 60 emoji nuevos de Unicode 10 (las caras redondas reemplazaron a los emoji “blob” de Google) y un arranque que Google describió como hasta el doble de rápido en el Pixel.

Seguridad y privacidad

  • Project Treble. Una interfaz estable con el fabricante se ubica ahora entre el framework de Android y el código propio del dispositivo, escrito sobre todo por los fabricantes de chips. La valida la Vendor Test Suite, como CTS valida la API de las apps. Google dijo que llegaría a todo dispositivo nuevo lanzado con Android 8.0; Ars Technica informó que era opcional para los dispositivos actualizados.
  • Instalar apps desconocidas. Desaparece el interruptor global “Unknown sources”. Ahora el usuario autoriza por separado cada app que instala, en “Install unknown apps”. Google lo justificó por el “hostile downloader”: una app que engaña al usuario para instalar malware disfrazado de actualización.
  • Sandbox. Un filtro seccomp se aplica a todas las apps y limita las llamadas al sistema a las que expone bionic. WebView renderiza por defecto en un proceso separado y aislado. Treble llevó muchos componentes de hardware a sandboxes más estrictas.
  • Kernel y espacio de usuario. Hardened usercopy, emulación de PAN, read-only after init y KASLR en el kernel; integridad del flujo de control (CFI) en el stack multimedia. Las superposiciones de apps ya no pueden tapar ventanas críticas del sistema.
  • Arranque y claves. Llegó Android Verified Boot (AVB), con protección contra rollback en el código del bootloader. La atestación de claves pasó a ser obligatoria en todo dispositivo que sale con 8.0, y la credencial de la pantalla de bloqueo puede verificarse en hardware resistente a manipulaciones.
  • Identificadores. ANDROID_ID ahora es distinto para cada clave de firma, usuario y dispositivo. Build.SERIAL queda obsoleto en favor de Build.getSerial(), que exige READ_PHONE_STATE. net.hostname está vacío y el cliente DHCP ya no envía un nombre de host.
  • TLS. SSLv3 desaparece, y HttpsURLConnection ya no retrocede a una versión anterior de TLS cuando un servidor negocia mal.
  • Actualizaciones. Las actualizaciones A/B por streaming se instalan aunque el dispositivo tenga poco espacio. Solo funcionan en dispositivos con particiones A/B.

Permisos

  • Nuevos. ANSWER_PHONE_CALLS y READ_PHONE_NUMBERS, ambos peligrosos y del grupo PHONE; MANAGE_OWN_CALLS, un permiso normal para apps de VoIP que gestionan sus propias llamadas con un ConnectionService autogestionado.
  • Instalar apps desconocidas. REQUEST_INSTALL_PACKAGES ya existía, pero una app con target API 26 ahora debe declararlo para enviar al usuario al instalador de paquetes. Su nivel de protección es signature|appop: el usuario lo concede por app en Ajustes, no en un diálogo en ejecución. Lleva al usuario a esa pantalla con ACTION_MANAGE_UNKNOWN_APP_SOURCES y compruébalo con canRequestPackageInstalls().
  • Otorgamiento por grupo corregido. Antes de 8.0, conceder un permiso también concedía todos los demás de su grupo que la app declaraba. En las apps con target API 26 solo se concede el que se pidió. Una solicitud posterior del mismo grupo se sigue aprobando sin diálogo.
  • Cuentas. GET_ACCOUNTS ya no basta para que una app con target API 26 vea las cuentas del usuario. Usa AccountManager.newChooseAccountIntent() o el método propio del autenticador.
  • Ventanas de alerta. Las apps con SYSTEM_ALERT_WINDOW y target API 26 deben dibujar con TYPE_APPLICATION_OVERLAY. Esas ventanas quedan debajo de la barra de estado y del teclado, y el usuario puede bloquearlas desde el panel de notificaciones.

Qué cambió para tu app

Todas las apps en Android 8.0

CambioQué hacer
Las apps en segundo plano reciben ubicación pocas veces por horaUsa el Fused Location Provider o geofencing; un servicio en primer plano recupera la frecuencia anterior
El usuario puede aplicar los límites de segundo plano a cualquier appPrueba con los límites activos aunque tu target sea API 25 o menor
Las apps en caché pierden sus wake locksNo dependas de un wake lock mientras tu app está en segundo plano
ANDROID_ID depende de la clave de firmaNo lo uses para vincular apps de distintos desarrolladores; para anuncios usa el Advertising ID
El broadcast INSTALL_SHORTCUT no tiene efectoAncla accesos directos con ShortcutManager.requestPinShortcut()
Las APIs de datos de formulario de WebView no hacen nadagetSaveFormData() devuelve false; ahora el framework de autocompletado llena los formularios
Un filtro seccomp limita las llamadas al sistemaLlama solo a lo que expone bionic
Las rutas del APK ya no terminan en -1 o -2Lee ApplicationInfo.sourceDir en lugar de armar la ruta
El doble toque de TalkBack se convierte en ACTION_CLICKRevisa el manejo táctil propio con TalkBack; sobrescribe performAccessibilityAction() si hace falta
findViewById() devuelve <T extends View> TCorrige las sobrecargas ambiguas y agrega un cast donde Java 8 no infiere el tipo
Las estadísticas de uso de contactos son aproximadasNo leas valores exactos de TIMES_CONTACTED ni de LAST_TIME_CONTACTED

Apps con target API 26

sí no startService Trabajo pendiente con la app en segundo plano ¿Lo nota el usuario? startForegroundService Llamar a startForeground en menos de cinco segundos Programar un job de JobScheduler o JobIntentService IllegalStateException
CambioQué hacer
Los servicios en segundo plano de una app inactiva se detienen a los pocos minutosLleva el trabajo a JobScheduler o JobIntentService
startService() desde segundo plano lanza una excepciónUsa startForegroundService() y luego startForeground() en menos de cinco segundos, o la app recibe un ANR
Los receivers del manifest no reciben la mayoría de los broadcasts implícitosRegístralos en ejecución con Context.registerReceiver(), o reemplaza el receiver por un job
Una notificación sin canal no se muestraCrea los canales antes de publicar; “Show notification channel warnings” en Developer options avisa de los olvidos
Build.SERIAL está obsoletoLlama a Build.getSerial() con READ_PHONE_STATE
net.dns1 a net.dns4 no están disponiblesLee los servidores DNS con ConnectivityManager y NetworkCallback
notifyChange() exige un ContentProvider real para la URIDefine el proveedor para cada authority que notificas
Las librerías nativas con segmentos escribibles y ejecutables fallanRecompílalas sin segmentos de carga W+X
Las vistas clicables son enfocables por defectoPon android:focusable="false" donde el foco no corresponde
WebView rechaza HTTP si se desactivó el tráfico en claroSirve el contenido de WebView por HTTPS

Los receivers del manifest siguen recibiendo los broadcasts enviados solo a la propia app (como ACTION_MY_PACKAGE_REPLACED), los que exigen un permiso de firma y una lista publicada de broadcasts implícitos exentos. Los cambios de permisos para apps con target API 26 (instalaciones, cuentas, ventanas de alerta, otorgamiento por grupo) están en Permisos.

Qué perduró

  • Los límites en segundo plano siguieron apretando. Android 9 agregó el permiso FOREGROUND_SERVICE, y las apps con target Android 12 ya no pueden iniciar servicios en primer plano desde segundo plano, salvo en unos pocos casos.
  • Los canales de notificación siguen siendo obligatorios. Android 13 sumó encima el permiso en ejecución POST_NOTIFICATIONS.
  • Los íconos adaptables son hoy el formato de ícono. Android 13 agregó una capa monocromática para los íconos temáticos.
  • Treble rindió frutos en Android 9: los dispositivos lanzados con 9 o posterior pueden ejecutar una imagen genérica del sistema (adb shell getprop ro.treble.enabled lo indica). Las interfaces HIDL de esa época hoy están obsoletas en favor de AIDL para las capas de abstracción de hardware.
  • El número de serie y el IMEI fueron más lejos en Android 10: Build.getSerial() exige READ_PRIVILEGED_PHONE_STATE, que las apps de Play no pueden tener.
  • Instalar apps desconocidas se sigue concediendo por app.
  • La regla de target API de Play empezó con esta versión: API 26 para apps nuevas en agosto de 2018 y para actualizaciones en noviembre de 2018. Desde 2019 el mínimo sube cada año, dentro del año siguiente a cada versión de Android.

Para saber

  • El Easter egg es un pulpo. Toca “Android version” en “About phone”, mantén presionada la “O” que aparece y un pulpo flota en la pantalla. AOSP llama Ocquarium a la actividad, y las patas se mueven con SpringAnimation, del paquete de física de la support library.
  • Los IDs de compilación de Android 8.0 empiezan con OPR (la primera etiqueta de AOSP, para el Pixel C, es la compilación OPR6.170623.010), y esa cadena aparece en el user agent. Google advirtió que la detección de navegadores que busca /OPR/ puede confundir cualquier navegador con Opera.
  • El CDD de 8.0 exige que cada clave de atestación la compartan suficientes dispositivos como para que no identifique a ninguno. La forma que sugiere: una clave por cada 100 000 unidades de un modelo.
  • En Build.java de AOSP, SERIAL se inicializa a propósito con una llamada a función, “to prevent its value being inlined in the app during compilation”, porque el sistema lo fija según el target SDK de la app.
  • Un bucle de reinicios activa ahora “Rescue Party”. Cuando system_server se reinicia cinco veces en cinco minutos, o una app persistente del sistema falla cinco veces en 30 segundos, el sistema restablece ajustes en tres pasos cada vez más amplios. El cuarto arranca en recovery y ofrece restablecer el dispositivo de fábrica. En 8.0, una compilación userdebug conectada por USB lo omite.

Parte 1 de 4

1 min

Android O Developer Preview 1: solo por flasheo

21 de marzo de 2017. La primera build de Android O, solo para desarrolladores y por flasheo manual, trajo límites en segundo plano, canales, autocompletado y PiP en teléfonos.

Leer por separado: Android O Developer Preview 1: solo por flasheo

Google publicó la primera developer preview de “Android O” el 21 de marzo de 2017, cinco meses antes de la versión final. El post de Dave Burke la presentó como temprana: “there are more features coming, and there’s still plenty of stabilization and performance work ahead of us. But it’s booting :)”.

Fecha21 de marzo de 2017
BuildOPP1.170223.013, según la etiqueta de AOSP “Android O Preview Release 1”
DispositivosNexus 5X, Nexus 6P, Nexus Player, Pixel, Pixel XL y Pixel C; Android Emulator; emulador de Wear
Cómo se obteníaSolo por descarga y flasheo manual; Android Beta todavía no estaba abierto para O
Estabilidad de la APINo; las API seguían cambiando

Casi todo lo que define a Android 8.0 ya estaba en esta build: los límites en segundo plano para broadcasts implícitos, servicios y actualizaciones de ubicación; los canales de notificación; el framework de autocompletado; el picture-in-picture en teléfonos y tablets; las fuentes como recurso XML; los íconos adaptables; el color de gama amplia por actividad; Wi-Fi Aware y el códec LDAC; la API nativa de audio AAudio, publicada como versión temprana para recibir comentarios; el WebView multiproceso por defecto con Safe Browsing, y java.time. Google pidió leer primero los límites en segundo plano, porque “represent a significant change in Android”.

El consejo de Google fue probar la app actual en la preview y publicar una actualización compatible sin cambiar targetSdkVersion. La Support Library 26.0.0 salió ese día como alfa y subió su minSdkVersion a 14. Google recibió los reportes de errores de la preview en Issue Tracker, la herramienta que también usa internamente.

Parte 2 de 4

1 min

Android O Developer Preview 2: beta pública

17 de mayo de 2017, en Google I/O. La primera build de calidad beta abrió Android Beta para O y sumó puntos de notificación, Autofill with Google y Smart Text Selection.

Leer por separado: Android O Developer Preview 2: beta pública

La Developer Preview 2 salió el 17 de mayo de 2017, en Google I/O. Google la llamó “our first beta-quality candidate, available to test on your primary phone or tablet” y ese mismo día abrió el programa Android Beta para Android O.

Fecha17 de mayo de 2017
BuildOPP2.170420.017
DispositivosNexus 5X, Nexus 6P, Nexus Player, Pixel, Pixel XL y Pixel C; emulador
Cómo se obteníaPor OTA con Android Beta, o flasheando la imagen de fábrica
Estabilidad de la APINo; las API cambiaron desde la Preview 1 y Google remitió al informe de diferencias

Qué sumó la Preview 2

  • Puntos de notificación en los íconos del launcher, que según Google “work with zero effort for most apps”, con el color del punto tomado del ícono.
  • Autofill with Google: el autocompletado de Chrome llevado a las apps Android sobre el framework de autocompletado. Las apps pueden indicar qué dato espera cada campo.
  • Smart Text Selection: aprendizaje automático en el dispositivo selecciona una dirección, URL, teléfono o correo completo y ofrece la app que corresponde.
  • Una nueva pantalla de inicio de Android TV donde las apps publican canales, con la librería de soporte TvProvider.

Google también anunció TensorFlow Lite y una Neural Networks API para una actualización de mantenimiento a fin de año, y mostró Android Go para dispositivos con 1 GB de memoria o menos.

Las librerías de soporte pasaron del SDK Manager al repositorio Maven de Google con la Support Library 26.0.0 beta. Los dispositivos inscritos en la beta de Android N tenían que volver a inscribirse para recibir O, según 9to5Google.

Parte 3 de 4

1 min

Android O Developer Preview 3: API 26 final

8 de junio de 2017. La tercera preview congeló la API en el nivel 26, trajo el SDK final y permitió publicar en Google Play apps con target API 26.

Leer por separado: Android O Developer Preview 3: API 26 final

La Developer Preview 3 salió el 8 de junio de 2017 con “the final Android O APIs”. Desde esta build el nivel de API 26 ya no cambió, así que se podía compilar contra él y publicar.

Fecha8 de junio de 2017
BuildOPP3.170518.006
DispositivosNexus 5X, Nexus 6P, Nexus Player, Pixel, Pixel XL y Pixel C; emulador
Cómo se obteníaPor OTA con Android Beta, o flasheando la imagen de fábrica
Estabilidad de la APISí: nivel de API 26 final

Qué significó la API final para los desarrolladores

  • SDK final. El SDK de API 26 llegó por el SDK Manager, y la Support Library 26.0.0 beta 2 por el repositorio Maven de Google. Google recomendó poner compileSdkVersion en 26, y targetSdkVersion en 26 para probar los cambios de comportamiento de Android O.
  • Publicar en Play. Las apps compiladas contra API 26, con o sin target API 26, podían ir a los canales alfa, beta y producción. Los dispositivos de Android Beta fueron los primeros en recibirlas.
  • Herramientas. Android Studio 3.0, en el canal canary, traía el asistente de íconos adaptables y soporte para fuentes XML y descargables. Android Studio 2.3.3, en el canal estable, podía compilar para O sin esas herramientas.
  • Cambios de API. Las API volvieron a cambiar desde la Preview 2; Google remitió al informe de diferencias para el código escrito contra las previews anteriores.

Google anunció “one more preview update coming in July” con imágenes de sistema casi finales.

Parte 4 de 4

1 min

Android O Developer Preview 4: candidata final

24 de julio de 2017. La última preview fue una release candidate con el comportamiento final, la API 26 congelada desde la Preview 3 y la Support Library 26.0.0 estable.

Leer por separado: Android O Developer Preview 4: candidata final

La Developer Preview 4 salió el 24 de julio de 2017, cuatro semanas antes de la versión final. Google la llamó “a release candidate build of Android O” y “the final preview before we launch the official Android O platform to consumers”.

Fecha24 de julio de 2017
BuildOPP4.170623.014
DispositivosNexus 5X, Nexus 6P, Nexus Player, Pixel, Pixel XL y Pixel C; emulador
Cómo se obteníaPor OTA con Android Beta, o flasheando la imagen de fábrica
Estabilidad de la APISí, desde la Preview 3

La build no sumó API. Trajo “the final system behaviors, the latest bug fixes and optimizations”, sobre el nivel de API 26 que era final desde la Preview 3. La Support Library 26.0.0 pasó a estable ese mismo día, y Google anunció una nueva Android Testing Support Library con Android Test Orchestrator y Espresso multiproceso.

Google pidió terminar las pruebas y publicar actualizaciones con el target actual, revisando los límites de ubicación en segundo plano, los canales de notificación y los cambios de red, seguridad e identificadores. Android 8.0 Oreo salió el 21 de agosto de 2017.

Clasificado en

Citas

45

Referencias externas