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 Apps que configuran targetSdkVersion en el nivel de API 28 o más alto deben modificar sus apps para admitir estos comportamientos de manera adecuada, 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 se orientan a Android 9 o versiones posteriores y usan servicios en primer plano deben solicitar el FOREGROUND_SERVICE permiso. 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 está orientada a Android 9, debes tener en cuenta lo siguiente: 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 asegurarse de que, si el agente de resolución del sistema usa DNS-over-TLS, DNS integrado usa un DNS encriptado al mismo nombre de host que del sistema o que estén inhabilitadas para el agente de resolución 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, la 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 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 una proveedor.

Cambios de conectividad

Recuento de datos de conectividad y múltiples rutas

En las apps que se orientan a Android 9 o versiones posteriores, el sistema registra el tráfico de red en las redes que no son la configuración predeterminada actual, como el tráfico móvil cuando el dispositivo está encendido Wi-Fi, y proporciona métodos en la NetworkStatsManager para consultar ese tráfico.

En particular, getMultipathPreference() ahora muestra un valor basado en el tráfico de red antes mencionado. Comienza con En Android 9, el método muestra true para los datos de celdas, pero cuando hay más de una cierta cantidad de tráfico se acumula en un día, 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

Con Android 6.0, quitamos la compatibilidad con el cliente HTTP de Apache. A partir de Android 9, esa biblioteca se quita del bootclasspath y no está disponible para las apps de forma predeterminada.

Para seguir usando el cliente HTTP de Apache, las apps orientadas a Android 9 y versiones posteriores puedes 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 del entorno de ejecución, las apps pueden empaquetar versión propia 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 la extensión de archivo correcta cuando se cargan URI de file: en un WebView.

Usar el contenido del archivo para inferir los tipos de MIME puede ser fuente de errores de seguridad. y los navegadores actualizados no suelen permitirlo.

Si un archivo tiene una extensión de archivo reconocida, como .html, haz lo siguiente: La extensión determinará el tipo de MIME en .txt, .js o .css. 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 renderizará como HTML, pero un URI como file:///sdcard/test se renderizará 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 la raíz de un documento es el elemento de desplazamiento. En versiones anteriores, la posición de desplazamiento se establecía en el elemento del cuerpo. el elemento raíz no tenía valores de desplazamiento. 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án de forma 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.