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.