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 las aplicaciones orientadas Nivel de API 28 o versiones posteriores Las apps que establecen targetSdkVersion en el nivel de API 28 o versiones posteriores deben modificarse para admitir correctamente estos comportamientos, cuando corresponda.

Para los cambios que afectan a todas las apps que se ejecutan en Android 9, independientemente de la API el nivel al que se orientan, ver Cambios en el comportamiento: Todas las apps.

Servicios en primer plano

Las apps que están orientadas a Android 9 o versiones posteriores y usan servicios en primer plano deben solicitar el permiso FOREGROUND_SERVICE. Este es un permiso normal. para que el sistema se la otorgue automáticamente a la app solicitante.

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

Cambios en 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 de serie del dispositivo mejorar la privacidad del usuario.

Baja del número de serie de compilación

En Android 9, Build.SERIAL es siempre se establece en "UNKNOWN" para proteger las claves la privacidad.

Si tu app necesita acceder al número de serie del hardware de un dispositivo, deberías en su lugar, solicita la READ_PHONE_STATE permiso y, luego, llama 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

Android 9 incluye varios cambios de comportamiento que mejoran tu la seguridad de la app, pero estos cambios solo tienen efecto si tu app está orientada al nivel de API 28 o una versión posterior

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 texto simple para dominios específicos, debes establecer cleartextTrafficPermitted en true de forma explícita para los dominios en la sección Seguridad de red Configuración.

Directorios de datos basados en la Web separados por procesos

Para mejorar la estabilidad de las apps y la integridad de los datos en Android 9, estas no pueden compartir un solo dato de WebView directorio entre varios procesos. Normalmente, estos directorios de datos almacenan cookies, cachés HTTP y otros tipos de datos persistentes almacenamiento temporal relacionado con la navegación web.

En la mayoría de los casos, tu app debería usar clases de la android.webkit, como como WebView y CookieManager, en una sola el proceso de administración de recursos. Por ejemplo, deberías mover todo Objetos Activity que usan un WebView en el mismo proceso. Puedes aplicar de manera más estricta el "un solo proceso" regla llamando disableWebView() in otros procesos de tu app. Esta llamada evita que se inicialice WebView. en los otros procesos por error, incluso si se lo llama biblioteca.

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, con el método WebView.setDataDirectorySuffix(), antes de usar una instancia determinada de WebView en ese proceso. Este método coloca los datos web de cada proceso en su propio directorio dentro de los datos de tu app .

Dominios SELinux por app

Las apps orientadas a Android 9 o versiones posteriores no pueden compartir datos con otras apps mediante permisos de Unix accesibles para todo el mundo. Este cambio mejora la integridad del Zona de pruebas de aplicaciones para Android, en particular, el requisito de que los datos privados sean accesibles solo mediante esa 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 se orientan a Android 9 o versiones posteriores, el sistema cuenta el tráfico de red en redes que no son la predeterminada actual (como el tráfico móvil mientras el dispositivo está 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 antes mencionado. 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. Apps que se ejecutan en Android 9 debe llamar al método y seguir esta sugerencia.

La ConnectivityManager.NetworkCallback ahora envía información sobre las VPN a las apps. Este cambio hace que sea mucho más fácil para que las apps escuchen eventos de conectividad sin tener que mezclar eventos llamadas asíncronas y el uso de APIs limitadas. Además, significa que la transferencia de información funciona como se espera cuando un dispositivo está conectado a varios Redes Wi-Fi o varias redes móviles al mismo tiempo.

Baja del cliente HTTP de Apache

En Android 6.0, quitamos 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"/>

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 de clases. con las clases proporcionadas en el entorno de ejecución.

Cambios de IU

Enfoque de objetos View

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 modo táctil. En cambio, depende de ti solicitar explícitamente el foco inicial, si deseado.

Manejo de valores hexadecimales CSS RGBA

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

Nivel 4 del módulo de color de CSS ha sido compatible con Chrome desde la versión 52, pero Actualmente, WebView inhabilita la función. porque se descubrió que las aplicaciones para Android existentes contienen colores hexadecimales de 32 bits. en el orden de Android (ARGB), lo que generaría errores de renderización.

Por ejemplo, el color #80ff8080 se renderiza actualmente en WebView como opaco rojo claro (#ff8080) para las apps orientadas a niveles de API a partir del 27. Líder (que Android interpretaría como el componente alfa) ignorados actualmente. Si una app tiene como objetivo el nivel de API 28 o uno superior, #80ff8080 es se interpreta como un 50% de verde claro transparente (#80ff80).

Detección de tipo MIME para archivos: URI

Las versiones de Android anteriores a Android 9 podían inferir los tipos de MIME del archivo contenidos. A partir de Android 9 (nivel de API 28), las apps deben usar la extensión de archivo correcta al cargar URIs file: en un WebView.

El uso del contenido del archivo para inferir los tipos de MIME puede originar errores de seguridad, y, por lo general, los navegadores modernos no lo permiten.

Si un archivo tiene una extensión de archivo reconocida como .html, .txt, .js o .css, la extensión determinará el tipo de MIME. Si un archivo no tiene extensión o si la extensión no se reconoce, el tipo de MIME no se mostrará texto.

Por ejemplo, un URI como file:///sdcard/test.html se procesará como HTML, pero un URI como file:///sdcard/test se procesará como texto sin formato, incluso si el archivo contiene datos HTML.

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. Android 9 habilita el comportamiento que cumple con los estándares, en el que el elemento de desplazamiento es la 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 al viewport, desplázate valores, usa document.scrollingElement, si está disponible.

Notificaciones de apps suspendidas

Antes de Android 9, las notificaciones de apps suspendidas se cancelaban. A partir de Android 9, las notificaciones de las apps suspendidas se ocultan hasta se reanuda la app.