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.

De un vistazo
| Versión | Android 8.0 |
| Nivel de API | 26 |
| Nombre | Oreo, público |
Build.VERSION_CODES | O |
| APIs finales y SDK | 8 de junio de 2017, con la Developer Preview 3 |
| Lanzamiento | 21 de agosto de 2017. Las OTA para Pixel y Nexus llegaron por fases tras las pruebas de operador |
| Dispositivos de lanzamiento | Sony 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 Play | Apps 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 unMessagingStyleque 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:supportsPictureInPicturey entra conenterPictureInPictureMode(PictureInPictureParams). En PiP queda pausada pero visible, así que la reproducción debe detenerse enonStop(), no enonPause(). - 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.
TextViewcon 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,TextClassifierpara la selección inteligente de texto,java.time,java.nio.fileyjava.lang.invokede OpenJDK, y cuotas de caché por app (getCacheQuotaBytes()).WebViewsuma 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_IDahora es distinto para cada clave de firma, usuario y dispositivo.Build.SERIALqueda obsoleto en favor deBuild.getSerial(), que exigeREAD_PHONE_STATE.net.hostnameestá vacío y el cliente DHCP ya no envía un nombre de host. - TLS. SSLv3 desaparece, y
HttpsURLConnectionya 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_CALLSyREAD_PHONE_NUMBERS, ambos peligrosos y del grupoPHONE;MANAGE_OWN_CALLS, un permiso normal para apps de VoIP que gestionan sus propias llamadas con unConnectionServiceautogestionado. - Instalar apps desconocidas.
REQUEST_INSTALL_PACKAGESya 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 essignature|appop: el usuario lo concede por app en Ajustes, no en un diálogo en ejecución. Lleva al usuario a esa pantalla conACTION_MANAGE_UNKNOWN_APP_SOURCESy compruébalo concanRequestPackageInstalls(). - 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_ACCOUNTSya no basta para que una app con target API 26 vea las cuentas del usuario. UsaAccountManager.newChooseAccountIntent()o el método propio del autenticador. - Ventanas de alerta. Las apps con
SYSTEM_ALERT_WINDOWy target API 26 deben dibujar conTYPE_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
| Cambio | Qué hacer |
|---|---|
| Las apps en segundo plano reciben ubicación pocas veces por hora | Usa 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 app | Prueba con los límites activos aunque tu target sea API 25 o menor |
| Las apps en caché pierden sus wake locks | No dependas de un wake lock mientras tu app está en segundo plano |
ANDROID_ID depende de la clave de firma | No lo uses para vincular apps de distintos desarrolladores; para anuncios usa el Advertising ID |
El broadcast INSTALL_SHORTCUT no tiene efecto | Ancla accesos directos con ShortcutManager.requestPinShortcut() |
| Las APIs de datos de formulario de WebView no hacen nada | getSaveFormData() devuelve false; ahora el framework de autocompletado llena los formularios |
| Un filtro seccomp limita las llamadas al sistema | Llama solo a lo que expone bionic |
Las rutas del APK ya no terminan en -1 o -2 | Lee ApplicationInfo.sourceDir en lugar de armar la ruta |
El doble toque de TalkBack se convierte en ACTION_CLICK | Revisa el manejo táctil propio con TalkBack; sobrescribe performAccessibilityAction() si hace falta |
findViewById() devuelve <T extends View> T | Corrige las sobrecargas ambiguas y agrega un cast donde Java 8 no infiere el tipo |
| Las estadísticas de uso de contactos son aproximadas | No leas valores exactos de TIMES_CONTACTED ni de LAST_TIME_CONTACTED |
Apps con target API 26
| Cambio | Qué hacer |
|---|---|
| Los servicios en segundo plano de una app inactiva se detienen a los pocos minutos | Lleva el trabajo a JobScheduler o JobIntentService |
startService() desde segundo plano lanza una excepción | Usa 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ícitos | Regístralos en ejecución con Context.registerReceiver(), o reemplaza el receiver por un job |
| Una notificación sin canal no se muestra | Crea los canales antes de publicar; “Show notification channel warnings” en Developer options avisa de los olvidos |
Build.SERIAL está obsoleto | Llama a Build.getSerial() con READ_PHONE_STATE |
net.dns1 a net.dns4 no están disponibles | Lee los servidores DNS con ConnectivityManager y NetworkCallback |
notifyChange() exige un ContentProvider real para la URI | Define el proveedor para cada authority que notificas |
| Las librerías nativas con segmentos escribibles y ejecutables fallan | Recompílalas sin segmentos de carga W+X |
| Las vistas clicables son enfocables por defecto | Pon android:focusable="false" donde el foco no corresponde |
| WebView rechaza HTTP si se desactivó el tráfico en claro | Sirve 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.enabledlo 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()exigeREAD_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
Ocquariuma la actividad, y las patas se mueven conSpringAnimation, 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ónOPR6.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.javade AOSP,SERIALse 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_serverse 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.
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 flasheoGoogle 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 :)”.
| Fecha | 21 de marzo de 2017 |
| Build | OPP1.170223.013, según la etiqueta de AOSP “Android O Preview Release 1” |
| Dispositivos | Nexus 5X, Nexus 6P, Nexus Player, Pixel, Pixel XL y Pixel C; Android Emulator; emulador de Wear |
| Cómo se obtenía | Solo por descarga y flasheo manual; Android Beta todavía no estaba abierto para O |
| Estabilidad de la API | No; 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.
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úblicaLa 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.
| Fecha | 17 de mayo de 2017 |
| Build | OPP2.170420.017 |
| Dispositivos | Nexus 5X, Nexus 6P, Nexus Player, Pixel, Pixel XL y Pixel C; emulador |
| Cómo se obtenía | Por OTA con Android Beta, o flasheando la imagen de fábrica |
| Estabilidad de la API | No; 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.
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 finalLa 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.
| Fecha | 8 de junio de 2017 |
| Build | OPP3.170518.006 |
| Dispositivos | Nexus 5X, Nexus 6P, Nexus Player, Pixel, Pixel XL y Pixel C; emulador |
| Cómo se obtenía | Por OTA con Android Beta, o flasheando la imagen de fábrica |
| Estabilidad de la API | Sí: 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
compileSdkVersionen 26, ytargetSdkVersionen 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.
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 finalLa 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”.
| Fecha | 24 de julio de 2017 |
| Build | OPP4.170623.014 |
| Dispositivos | Nexus 5X, Nexus 6P, Nexus Player, Pixel, Pixel XL y Pixel C; emulador |
| Cómo se obtenía | Por OTA con Android Beta, o flasheando la imagen de fábrica |
| Estabilidad de la API | Sí, 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.