Al igual que las versiones anteriores, Android 11 incluye cambios de comportamiento que podrían afectar tu app. Los siguientes cambios se aplican exclusivamente a las apps orientadas a Android 11 o versiones posteriores. Si tu app establece la targetSdkVersion
como 30
, debes modificarla para que admita estos comportamientos de manera correcta, según corresponda.
Asegúrate de revisar también la lista de cambios en el comportamiento que afectan a todas las apps que se ejecutan en Android 11.
Privacidad
Android 11 introduce cambios y restricciones para mejorar la privacidad del usuario, incluidos los siguientes:
- Aplicación de almacenamiento específico: se limita el acceso a directorios de almacenamiento externo a un directorio específico de la app y a tipos específicos de contenido multimedia que esta haya creado.
- Restablecimiento automático de permisos: si los usuarios no han interactuado con una app durante algunos meses, el sistema restablecerá automáticamente los permisos sensibles de la app.
- Acceso a la ubicación en segundo plano: se debe dirigir a los usuarios a la configuración del sistema para que otorguen permiso de ubicación en segundo plano a las apps.
- Visibilidad del paquete: cuando una app busca en la lista de apps instaladas en el dispositivo, se filtra la lista que se muestra.
Para obtener más información, visita la página Privacidad.
Seguridad
Etiquetado de punteros de montón
Detalles del cambio
Nombre del cambio: NATIVE_HEAP_POINTER_TAGGING
ID del cambio: 135754954
Cómo activarlo o desactivarlo
A medida que pruebes la compatibilidad de tu app con Android 11, podrás activar o desactivar este cambio con los siguientes comandos de ADB:
adb shell am compat enable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
adb shell am compat disable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
Para obtener más información sobre el marco de compatibilidad y sobre cómo activar o desactivar los cambios, consulta Cómo probar y depurar los cambios de comportamiento de la plataforma en tu app.
Los punteros de montón ahora tienen una etiqueta distinta de cero en el byte más importante (MSB). Las aplicaciones que usan punteros de forma incorrecta, incluidas las que modifican el MSB, ahora pueden fallar o sufrir otros problemas. Este cambio es necesario para admitir dispositivos de hardware futuros con la extensión de etiquetado de memoria (MTE) de ARM habilitada. Para obtener más información, consulta Punteros etiquetados.
Para inhabilitar esta función, consulta la documentación del manifiesto de allowNativeHeapPointerTagging
.
Actualizaciones a avisos
Los avisos personalizados en segundo plano están bloqueados
Por razones de seguridad y para mantener una buena experiencia del usuario, el sistema bloquea los avisos que contienen vistas personalizadas si una app orientada a Android 11 o versiones posteriores envía esos avisos en segundo plano. Ten en cuenta que todavía se permiten los avisos de texto creados mediante Toast.makeText()
que no llamen al método setView()
.
Si la app intenta publicar un aviso con una vista personalizada en segundo plano, el sistema no le mostrará el mensaje al usuario. En cambio, el sistema registra el siguiente mensaje en logcat:
W/NotificationService: Blocking custom toast from package \ <package> due to package not in the foreground
Devoluciones de llamada de avisos
Si quieres recibir una notificación cuando aparezca o desaparezca un aviso (de texto o personalizado), usa el método addCallback()
, que se agregó en Android 11.
Cambios en la API de avisos de texto
En las apps orientadas a Android 11 o versiones posteriores, se ven los siguientes efectos secundarios en relación con los avisos de texto:
- El método
getView()
muestranull
. - Los valores que muestran los siguientes métodos no reflejan los valores reales, por lo que no deberías confiar en ellos en tu app:
- Los siguientes métodos son no-ops, por lo que tu app no debería usarlos:
Conectividad
Acceso de lectura restringido a la base de datos del APN
Detalles del cambio
Nombre del cambio: APN_READING_PERMISSION_CHANGE_ID
ID del cambio: 124107808
Cómo activarlo o desactivarlo
A medida que pruebes la compatibilidad de tu app con Android 11, podrás activar o desactivar este cambio con los siguientes comandos de ADB:
adb shell am compat enable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME
adb shell am compat disable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME
Para obtener más información sobre el marco de compatibilidad y cómo activar o desactivar los cambios, consulta Cómo probar y depurar cambios de comportamiento de la plataforma en tu app.
Las aplicaciones orientadas a Android 11 ahora requieren el permiso con privilegios Manifest.permission.WRITE_APN_SETTINGS
para acceder a la base de datos del APN del proveedor de Telefonía o leerla. Si intentas acceder a la base de datos del APN sin este permiso, se generará una excepción de seguridad.
Accesibilidad
Declara la interacción con los motores de texto a voz en el archivo de manifiesto
Debido a los cambios en la visibilidad del paquete, las apps orientadas a Android 11 que interactúan con un motor de texto a voz (TTS) deben agregar el siguiente elemento <queries>
a sus archivos de manifiesto:
<queries> <intent> <action android:name="android.intent.action.TTS_SERVICE" /> </intent> </queries>
Cómo declarar el uso del botón de accesibilidad en el archivo de metadatos
Detalles del cambio
Nombre del cambio: REQUEST_ACCESSIBILITY_BUTTON_CHANGE
ID del cambio: 136293963
Cómo activarlo o desactivarlo
A medida que pruebes la compatibilidad de tu app con Android 11, podrás activar o desactivar este cambio con los siguientes comandos de ADB:
adb shell am compat enable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME
adb shell am compat disable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME
Para obtener más información sobre el marco de compatibilidad y sobre cómo activar o desactivar los cambios, consulta Cómo probar y depurar los cambios de comportamiento de la plataforma en tu app.
A partir de Android 11, tu servicio de accesibilidad no puede declarar una asociación con el botón de accesibilidad del sistema durante el tiempo de ejecución. Si agregas AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON
a la propiedad flags
de un objeto AccessibilityServiceInfo
, el framework no pasará los eventos de devolución de llamada del botón de accesibilidad a tu servicio.
Para recibir eventos de devolución de llamada de accesibilidad en tu servicio de accesibilidad, usa el archivo de metadatos de dicho servicio a fin de declarar su asociación con el botón de accesibilidad. Incluye el valor flagRequestAccessibilityButton
en tu definición del atributo accessibilityFlags
. Una ubicación común para el archivo de metadatos del servicio de accesibilidad es res/raw/accessibilityservice.xml
.
Cámara
Las acciones de intents multimedia requieren la cámara predeterminada del sistema
A partir de Android 11, solo las apps de cámara ya instaladas en el sistema pueden responder a las siguientes acciones de intent:
android.media.action.VIDEO_CAPTURE
android.media.action.IMAGE_CAPTURE
android.media.action.IMAGE_CAPTURE_SECURE
Si hay más de una app de cámara preinstalada disponible, el sistema presenta un diálogo para que el usuario seleccione una. Si deseas que tu app use una app de cámara de terceros específica para capturar imágenes o videos, puedes configurar esos intents de forma explícita mediante un nombre de paquete o un componente para el intent.
Cómo empaquetar e instalar apps
Archivos de recursos comprimidos
Detalles del cambio
Nombre del cambio: RESOURCES_ARSC_COMPRESSED
ID del cambio: 132742131
Cómo activarlo o desactivarlo
A medida que pruebes la compatibilidad de tu app con Android 11, podrás activar o desactivar este cambio con los siguientes comandos de ADB:
adb shell am compat enable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME
adb shell am compat disable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME
Para obtener más información sobre el marco de compatibilidad y sobre cómo activar o desactivar los cambios, consulta Cómo probar y depurar los cambios de comportamiento de la plataforma en tu app.
Las apps orientadas a Android 11 (nivel de API 30) o versiones posteriores no se pueden instalar si tienen un archivo comprimido resources.arsc
o si el archivo no está alineado con un límite de 4 bytes. El sistema no puede asignar el archivo a la memoria en ninguna de estas condiciones. Las tablas de recursos que no pueden asignarse a la memoria deben leerse en un búfer en la memoria RAM, lo que genera demasiada presión de memoria en el sistema y mayor uso de la RAM del dispositivo.
Si anteriormente usabas un archivo resources.arsc
comprimido, prueba estrategias alternativas, como reducir los recursos de la app o algún otro método para reducir, ofuscar y optimizar tu app.
Se requiere el esquema de firma de APK v2
Las apps orientadas a Android 11 (API nivel 30) que actualmente solo están firmadas con el esquema de firma de APK v1 ahora deben firmarse con el esquema de firma de APK v2 o una versión posterior. Los usuarios no pueden instalar ni actualizar apps que solo estén firmadas con el esquema de firma de APK v1 en dispositivos que ejecutan Android 11.
Para verificar que tu app esté firmada con el esquema de firma de APK v2 o posterior, puedes usar Android Studio o la herramienta apksigner
en la línea de comandos.
Firebase
Firebase JobDispatcher y GCMNetworkManager
Si tu app está orientada a una API nivel 30 o posterior, las llamadas a la API de Firebase JobDispatcher y GcmNetworkManager están inhabilitadas en dispositivos que ejecutan Android 6.0 (API nivel 23) o versiones posteriores. Para obtener información sobre la migración, consulta Cómo migrar de Firebase JobDispatcher a WorkManager y Cómo migrar de GCMNetworkManager a WorkManager.
Reconocimiento de voz
Debido a los cambios en la visibilidad del paquete, las apps orientadas a Android 11 que interactúan con un servicio de reconocimiento de voz deben agregar el siguiente elemento <queries>
a sus archivos de manifiesto:
<queries> <intent> <action android:name="android.speech.RecognitionService" /> </intent> </queries>
Cambios de devolución de llamada para OnSharedPreferenceChangeListener
Detalles del cambio
Nombre del cambio: CALLBACK_ON_CLEAR_CHANGE
ID del cambio: 119147584
Cómo activarlo o desactivarlo
A medida que pruebes la compatibilidad de tu app con Android 11, podrás activar o desactivar este cambio con los siguientes comandos de ADB:
adb shell am compat enable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME
adb shell am compat disable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME
Para obtener más información sobre el marco de compatibilidad y cómo activar o desactivar los cambios, consulta Cómo probar y depurar cambios de comportamiento de la plataforma en tu app.
Para las apps orientadas a Android 11 (nivel de API 30), cada vez que se llama a Editor.clear
, se realiza una devolución de llamada a OnSharedPreferenceChangeListener.onSharedPreferenceChanged
con una clave null
.
Restricciones en interfaces no SDK
Android 11 incluye listas actualizadas de este tipo de interfaces que están basadas en la colaboración con desarrolladores de Android y las pruebas internas más recientes. Siempre que sea posible, nos aseguramos de que las alternativas públicas estén disponibles antes de restringir las interfaces que no pertenecen al SDK.
Si tu app no está orientada a Android 11, es posible que algunos de estos cambios no te afecten de inmediato. Sin embargo, aunque actualmente puedes usar algunas interfaces que no pertenecen al SDK (según el nivel de API al que esté orientada la app), utilizar cualquier método o campo que no pertenezca al SDK siempre implica un gran riesgo de error para tu app.
En caso de no saber con certeza si tu app usa este tipo de interfaces, puedes probarla para verificarlo. Si tu app depende de interfaces que no pertenezcan al SDK, deberías planificar una migración hacia otras alternativas que sí lo hagan. Sin embargo, sabemos que algunas apps tienen casos prácticos válidos para usarlas. Si no encuentras una alternativa al uso de una interfaz que no pertenece al SDK para una función de tu app, deberías solicitar una nueva API pública.
Para obtener más información sobre los cambios implementados en esta versión de Android, consulta Actualizaciones a las restricciones de interfaces que no pertenecen al SDK en Android 11. Para obtener más información sobre interfaces que no pertenecen al SDK en general, consulta Restricciones en interfaces que no pertenecen al SDK.