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.