Cambios en los comportamientos: apps orientadas a niveles de API a partir del 28

Android 9 (nivel 28 de API) presenta varios cambios en el sistema de Android. Los siguientes cambios de comportamiento se aplican exclusivamente a apps orientadas a niveles de API a partir del 28. Las apps en las que se fija targetSdkVersion en niveles de API a partir del 28 deben modificarse apps para admitir correctamente estos comportamientos, cuando corresponda.

Para conocer los cambios que afectan a todas las apps que funcionan en Android 9, independientemente del nivel de API al que estén orientadas, consulta Cambios en los comportamientos: todas las apps.

Servicios en primer plano

Las apps que se orientan a Android 9 o versiones posteriores y usan servicios en primer plano deben solicitar el permiso FOREGROUND_SERVICE. Este es un permiso normal; el sistema se lo otorga automáticamente a la app que lo solicita.

Si una app orientada a Android 9 o versiones posteriores intenta crear un servicio en primer plano sin solicitar FOREGROUND_SERVICE, se genera una SecurityException en el sistema.

Cambios relacionados con la privacidad

Si tu app se orienta a Android 9, debes tener en cuenta los siguientes cambios de comportamiento. Estas actualizaciones de la información de DNS y el número de serie del dispositivo suponen una mejora para la privacidad del usuario.

Baja del número de serie de compilación

En Android 9, Build.SERIAL se fija siempre en "UNKNOWN" para proteger la privacidad del usuario.

Si tu app debe acceder al número de serie del hardware de un dispositivo, debes solicitar el permiso READ_PHONE_STATE y luego llamar a getSerial().

Privacidad de DNS

Las apps orientadas a Android 9 deben respetar las API de DNS privados. En particular, las apps deben controlar que, si el solucionador del sistema usa DNS por TLS, todos los clientes de DNS incorporados usen DNS encriptados para el mismo nombre de host que el sistema o estén inhabilitados en favor del solucionador del sistema.

Cambios de seguridad del marco de trabajo

Android 9 incluye varios cambios de comportamiento que mejoran la seguridad de tu app, pero estos cambios tienen efecto únicamente si esta se orienta a niveles de API a partir del 28.

TLS de la red habilitada de forma predeterminada

Si tu app está orientada a Android 9 o versiones posteriores, el método isCleartextTrafficPermitted() muestra false de forma predeterminada. Si tu app necesita habilitar cleartext para dominios específicos, debes fijar explícitamente cleartextTrafficPermitted en true para esos dominios en la configuración de seguridad de la red de tu app.

Directorios de datos basados en la Web separados por procesos

Para mejorar la estabilidad de la app y la integridad de los datos en Android 9, las apps no pueden compartir un único directorio de datos WebView entre varios procesos. Normalmente, estos directorios de datos almacenan cookies, cachés de HTTP y otros datos almacenados persistentes y temporales relacionados con la navegación web.

En la mayoría de los casos, tu app debe usar clases del paquete android.webkit, como WebView y CookieManager, en un único proceso. Por ejemplo, debes mover al mismo proceso todos los objetos Activity que usen WebView. Puedes aplicar de manera más estricta la regla de “un único proceso” llamando a disableWebView() en los demás procesos de tu app. Esta llamada evita que WebView se inicialice por error en esos procesos, incluso si recibe la llamada de una biblioteca dependiente.

Si tu app debe usar instancias de WebView en más de un proceso, debes asignar un sufijo de directorio de datos único para cada proceso, usando el método WebView.setDataDirectorySuffix(), antes de aplicar una instancia determinada de WebView en ese proceso. Este método ubica datos web de cada proceso en su propio directorio dentro del directorio de datos de tu app.

Nota: Aun cuando uses setDataDirectorySuffix(), el sistema no compartirá cookies y otros datos web si esto implica un exceso de los límites de los procesos de tu app. Si varios procesos de tu app necesitan acceso a los mismos datos web, debes copiarlos entre esos procesos por tu cuenta. Por ejemplo, puedes llamar a getCookie() y setCookie() para transferir datos de cookies de forma manual de un proceso a otro.

Dominios SELinux por app

Las Apps orientadas a Android 9 o versiones posteriores no pueden compartir datos con otras apps usando permisos Unix accesibles para todo el mundo. Este cambio mejora la integridad de la zona de pruebas de aplicaciones de Android; en particular, el requisito de que a los datos privados de una app pueda acceder únicamente la misma app.

Para compartir archivos con otras apps, usa un proveedor de contenido.

Cambios de conectividad

Recuento de datos de conectividad y múltiples rutas

Entre las apps que tienen como destino Android 9 o versiones posteriores, el sistema cuenta el tráfico de red en redes que no sean la predeterminada actual (como el tráfico móvil mientras el dispositivo se halla conectado a una red Wi-Fi) y proporciona métodos en la clase NetworkStatsManager para buscar ese tráfico.

En particular, getMultipathPreference() ahora muestra un valor basado en el tráfico de red mencionado anteriormente. A partir de Android 9, el método muestra true para los datos de celdas, pero cuando en un día se acumula más de una cierta cantidad de tráfico, comienza a mostrar false. Las apps que funcionan en Android 9 primero deben llamar al método y cumplir con esto.

La clase ConnectivityManager.NetworkCallback ahora envía información sobre las VPN a las apps. Este cambio hace que las apps puedan escuchar de manera mucho más sencilla eventos de conectividad sin necesidad de mezclar llamadas síncronas y asíncronas, y con API limitadas. Además, significa que la transferencia de información funciona como se espera cuando un dispositivo se conecta a varias redes Wi-Fi o móviles simultáneamente.

Baja del cliente HTTP de Apache

En Android 6.0, eliminamos la compatibilidad con el cliente HTTP de Apache. A partir de Android 9, esa biblioteca deja de existir en bootclasspath y no se encuentra disponible de manera predeterminada para las apps.

Para seguir usando el cliente HTTP de Apache, las apps orientadas a Android 9 y versiones posteriores pueden agregar lo siguiente a su AndroidManifest.xml:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Nota: El atributo android:required="false" es necesario para las apps que tengan como mínimo el SDK 23 o versiones anteriores, ya que en dispositivos con niveles de API inferiores al 24 la biblioteca org.apache.http.legacy no se encuentra disponible. (En esos dispositivos, las clases HTTP de Apache están disponibles en bootclasspath).

Como alternativa al uso de la biblioteca Apache de tiempo de ejecución, las apps pueden hacer un conjunto de su propia versión de la biblioteca org.apache.http en su APK. Si haces esto, debes volver a empaquetar la biblioteca (con una utilidad como Jar Jar) para evitar problemas de compatibilidad con las clases que se proporcionen en el tiempo de ejecución.

Cambios de IU

Enfoque de vistas

Las vistas con valores de superficie 0 (valores nulos de ancho y alto) ya no son enfocables.

Además, las actividades ya no asignan implícitamente el foco inicial en el modo táctil. En lugar de ello, depende de ti solicitar explícitamente el foco inicial, si así lo deseas.

Manejo de valores hexadecimales CSS RGBA

Las apps orientadas a Android 9 o versiones posteriores deben habilitar el comportamiento del borrador nivel 4 de módulo de color CSS para manejar colores de CSS de 4 y 8 dígitos hexadecimales.

El nivel 4 de módulo de color de CSS ha sido compatible con Chrome desde la actualización 52, pero WebView actualmente inhabilita la característica porque se descubrió que las aplicaciones de Android existentes contienen colores hexadecimales de 32 bits en la ordenación de Android (ARGB), lo cual genera errores de representación.

Por ejemplo, el color #80ff8080 actualmente se representa en WebView como rojo claro opaco (#ff8080) para las apps orientadas a niveles de API hasta el 27. Actualmente, se ignora el componente inicial (que Android interpretaría como el componente alfa). Si una app se orienta a niveles de API a partir del 28, #80ff8080 se interpreta como un verde claro con una transparencia del 50% (#80ff80).

Elemento de desplazamiento de documentos

Android 9 controla adecuadamente el caso en el que el elemento raíz de un documento es el elemento que se desplaza. En versiones anteriores, la posición de desplazamiento se fijaba en el elemento del cuerpo y el elemento raíz tenía valores de desplazamiento nulos. En Android 9, se habilita el comportamiento acorde a los estándares, según el cual el elemento de desplazamiento es el elemento raíz.

Además, el acceso directo a document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop o document.documentElement.scrollLeft se comportará de manera diferente según el SDK de destino. Para acceder a los valores de desplazamiento de la vista del puerto, usa document.scrollingElement si se encuentra disponible.

Notificaciones de apps suspendidas

Antes de Android 9, las notificaciones de apps suspendidas se cancelaban. A partir de Android 9, estas notificaciones se ocultan hasta que la app continúa funcionando.

Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.