Cambios en el comportamiento: apps orientadas a Android 11

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:

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 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:

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 los 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 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:

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 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 los 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.