¡Te damos la bienvenida a la Vista previa para desarrolladores de Android 12! Envíanos comentarios con frecuencia y tan pronto como puedas, y ayúdanos a hacer de Android 12 la mejor versión hasta el momento.

Cambios en el marco de compatibilidad (Android 12)

Figura 1: La pantalla Cambios de compatibilidad con apps de las opciones para desarrolladores muestra los cambios que puedes activar o desactivar.

En esta página, se describe cada cambio de comportamiento que se agregó al marco de compatibilidad en Android 12. Usa esta lista, junto con las opciones para desarrolladores y los comandos de ADB para probar y depurar tu app mientras te preparas para la compatibilidad y la orientación a Android 12.

A continuación, te mostramos algunas de las acciones que puedes realizar con las herramientas del marco de compatibilidad:

  • Probar los cambios orientados sin cambiar realmente la targetSdkVersion de la app. Puedes usar los botones de activación y desactivación para forzar cambios de comportamiento orientados específicos a fin de evaluar el impacto en tu app existente.
  • Enfocar tus pruebas solo a cambios específicos. En lugar de tener que abordar todos los cambios orientados a la vez, los botones de activación y desactivación te permiten inhabilitar todos los cambios orientados, excepto los que deseas probar.
  • Administrar los cambios que se pueden activar y desactivar mediante adb. Puedes usar comandos ADB para habilitar o inhabilitar los cambios que se pueden activar o desactivar en tu entorno de prueba automatizado.
  • Depurar más rápido con los ID de cambio estándar. Cada cambio que se puede activar y desactivar tiene un ID y un nombre únicos que puedes usar para depurar rápidamente la causa raíz en el resultado del registro.

Si quieres obtener más información sobre cómo usar las herramientas para cada uno de estos casos de uso, consulta Herramientas del marco de compatibilidad.

Cambios de comportamiento incluidos en el marco de compatibilidad

En la lista de esta sección, se describe cada cambio de comportamiento incluido en el marco de compatibilidad de la compilación más reciente de la Vista previa para desarrolladores de Android 12.

Puedes filtrar la lista de cambios por Estado predeterminado.

Cambios de comportamiento agregados al marco de compatibilidad de Android 12

ALLOW_TEST_API_ACCESS

ID del cambio: 166236554
Estado predeterminado: Inhabilitado para todas las apps.

Permite que las apps accedan a las API de @TestApi.

Nota: Este cambio está inhabilitado de forma predeterminada y solo debe usarlo el código de prueba de la plataforma.

BLOCK_FLAG_SLIPPERY

ID del cambio: 157929241
Estado predeterminado: Habilitado para todas las apps.

En el caso de las apps que se ejecutan en Android 12, comprueba si se usa FLAG_SLIPPERY con cualquier ventana de la app. Esperamos que solo los componentes del sistema usen esta marca, ya que se trata de un campo no admitido. Si se usa, se restringirá.

BLOCK_GPS_STATUS_USAGE

ID del cambio: 1144027538
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, todo el uso de la API de GpsStatus debe reemplazarse con las API de GnssStatus.

BLOCK_IMMUTABLE_PENDING_INTENTS

ID del cambio: 111717480
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, los objetos PendingIntent inmutables que se pasan a la API de ubicación generarán una IllegalArgumentException.

BLOCK_PENDING_INTENT_SYSTEM_API_USAGE

ID del cambio: 169887240
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, las API del sistema LocationRequest no se pueden usar con solicitudes de ubicación PendingIntent.

BLOCK_UNTRUSTED_TOUCHES

ID del cambio: 1520002302
Estado predeterminado: Habilitado para todas las apps.

Con el objetivo de preservar la seguridad del sistema y una buena experiencia del usuario, Android 12 evita que las apps consuman eventos táctiles, en los que una superposición bloquea la app de forma insegura.

Para obtener más información sobre este cambio, consulta Bloqueo de los eventos táctiles que no son de confianza.

CAMERA_MIC_INDICATORS_NOT_PRESENT

ID del cambio: 162547999
Estado predeterminado: Inhabilitado para todas las apps.

Determina que este dispositivo admite indicadores de cámara y micrófono. Será false si está presente porque el método CompatChanges#isChangeEnabled muestra true si el ID de cambio no está presente.

DELIVER_HISTORICAL_LOCATIONS

ID del cambio: 73144566
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, es posible que los clientes de ubicación reciban ubicaciones históricas (anteriores a la fecha actual) en algunas circunstancias.

DROP_CLOSE_SYSTEM_DIALOGS

ID del cambio: 174664120
Estado predeterminado: Habilitado para todas las apps.

Para mejorar el control del usuario cuando interactúa con apps y el sistema, la acción de intent ACTION_CLOSE_SYSTEM_DIALOGS deja de estar disponible a partir de Android 12.

Para obtener más información sobre este cambio, consulta Las apps no pueden cerrar los diálogos del sistema.

ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES

ID del cambio: 142108108
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

Las apps orientadas a Android 12 y versiones posteriores deben declarar dependencias a las bibliotecas compartidas nativas y públicas que define el fabricante del dispositivo con la etiqueta uses-native-library en su AndroidManifest.xml. Si alguna de las dependencias no se puede cumplir (por ejemplo, una de las dependencias no existe), el administrador de paquetes no instalará la app. La dependencia se puede especificar como opcional mediante el atributo android:required en la etiqueta y, en caso de no satisfacer la dependencia, no se detendrá la instalación.

Una vez instalada, se proporciona una app solo con las bibliotecas compartidas nativas especificadas en el manifiesto de la app. La llamada a dlopen en una biblioteca compartida nativa que no aparece en el manifiesto de la app fallará incluso si existe en el dispositivo.

ENFORCE_STRICT_QUERY_BUILDER

ID del cambio: 1414323
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, SQLiteQueryBuilder ahora verifica todas las selecciones de consultas de CalendarProvider2 con argumentos maliciosos.

FGS_BG_START_USE_EXEMPTION_LIST_CHANGE_ID

ID del cambio: 175801883
Estado predeterminado: Habilitado para todas las apps.

Si se configura como false para un paquete, el sistema no lo eximirá de FGS-BG-start, incluso si está en ActiveServices.sFgsBgStartExemptedPackages.

FORCE_DISABLE_HEVC_SUPPORT

ID del cambio: 117427420
Estado predeterminado: Inhabilitado para todas las apps.

Fuerza la inhabilitación de una app para que no sea compatible con la capacidad de contenido multimedia HEVC. Las apps deben declarar las capacidades de contenido multimedia admitidas en su manifiesto, pero esta marca puede usarse para forzar el acceso de una app a HEVC, lo que fuerza la transcodificación mientras se accede al contenido multimedia codificado en HEVC. La configuración de esta marca anulará cualquier valor predeterminado en el nivel del SO para las apps. Está inhabilitado de forma predeterminada, lo que significa que los valores predeterminados del SO tienen prioridad. Configurar esta marca y FORCE_ENABLE_HEVC_SUPPORT es un estado indefinido y provocará que el SO ignore ambas marcas.

FORCE_ENABLE_HEVC_SUPPORT

ID del cambio: 174228127
Estado predeterminado: Inhabilitado para todas las apps.

Fuerza a una app a admitir la capacidad de contenido multimedia HEVC. Las apps deberían declarar las capacidades de contenido multimedia en su manifiesto, pero esta marca se puede usar para forzar a la app a admitir HEVC. Por lo tanto, se debe evitar la transcodificación mientras se accede al contenido multimedia codificado en HEVC. La configuración de esta marca anulará cualquier valor predeterminado en el nivel del SO para las apps. Está inhabilitado de forma predeterminada, lo que significa que los valores predeterminados del SO tendrán prioridad. Configurar esta marca y FORCE_DISABLE_HEVC_SUPPORT es un estado indefinido y provocará que el SO ignore ambas marcas.

FORCE_RESIZE_APP

ID del cambio: 174042936
Estado predeterminado: Inhabilitado para todas las apps.

Fuerza los paquetes a los que se aplica para que puedan cambiar el tamaño. Solo permitimos cambiar el tamaño en el modo de renderización de ventanas de pantalla completa, pero no se fuerza a la app a cambiar el tamaño del modo multiventana.

HIDE_PROP_ICUBINARY_DATA_PATH

ID del cambio: 117197976
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, quita el acceso a la propiedad android.icu.impl.ICUBinary.dataPath.

IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE

ID del cambio: 158482162
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, se aplica el permiso BACKUP necesario para el objeto isBackupServiceActive() del servicio y no del cliente en BackupManager.

KEYSTORE_OPERATION_CREATION_MAY_FAIL

ID del cambio: 169897160
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, la creación de la operación de almacén de claves puede fallar. Los almacenes de claves solían trabajar bajo la suposición de que la creación de operaciones criptográficas siempre se realizaba correctamente. Sin embargo, el backend de KeyMint solo tiene un número limitado de ranuras de operación.

Para mantener la apariencia de las ranuras de las operaciones "infinitas", el daemon del almacén de claves reducía las operaciones usadas recientemente si no había una ranura de operación disponible. Como resultado, las operaciones buenas se podían finalizar de forma prematura. Esto llevaba a AndroidKeystore a la denegación del servicio (DoS) y un bloqueo activo no intencional. Por ejemplo, si varias aplicaciones se activaban al mismo tiempo debido a optimizaciones de administración de energía e intentaban realizar operaciones criptográficas, comenzaban a finalizar las operaciones entre sí sin ningún progreso.

A fin de eliminar los bloqueos activos y desalentar los intentos de DoS, cambiamos la estrategia de reducción para que prefiera clientes que usen pocas ranuras de operación. Como resultado, las operaciones individuales que no resultan inactivas por más de 5 segundos casi siempre concluirán sin problemas gracias a la estrategia de reducción. Aún existen algunas operaciones relacionadas con la encriptación del sistema de archivos que pueden reducir incluso estas operaciones, pero son casos poco frecuentes. Como efecto secundario de esta nueva operación de estrategia de reducción, ahora la creación puede fallar si el cliente tiene una potencia de reducción menor que todas las operaciones existentes.

Estrategia de reducción: A fin de encontrar un candidato adecuado, calculamos el malus para el emisor y cada operación existente. El malus es la inversa de la potencia de reducción (emisor) o la resistencia a la reducción (operación existente). Para que el emisor pueda reducir una operación, debe buscar una operación con un malus superior al suyo. Para obtener más información sobre la estrategia de reducción, consulta la implementación de operation.rs. En Android 11 (nivel de API 30) y versiones anteriores, KeyStore2 consultará el daemon del almacén de claves para obtener un espacio de operación libre. En el caso de las apps orientadas a Android 11 (nivel de API 30) y versiones anteriores, seguirá pareciendo que la inicialización del objeto de firma y el algoritmo de cifrado siempre es exitosa; sin embargo, obtener una operación podría demorar más tiempo. Todas las versiones de Android se benefician de la programación de ranuras de operación más justas y una mejor oportunidad para finalizar una operación con éxito.

LOW_POWER_EXCEPTIONS

ID del cambio: 16836375
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, todos los objetos LocationRequest marcados como con potencia baja lanzan una excepción si el emisor no tiene el permiso LOCATION_HARDWARE, en lugar de descartar silenciosamente la parte de la solicitud que tiene potencia baja.

MISSING_EXPORTED_FLAG

ID del cambio: 15032156
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, se debe especificar un valor explícito para el atributo android:exported cada vez que se define un filtro de intents.

Si quieres obtener más información sobre este cambio, consulta Exportación de componentes más segura.

NATIVE_MEMTAG_ASYNC

ID del cambio: 135772972
Estado predeterminado: Inhabilitado para todas las apps.

Habilita las comprobaciones de etiquetas de memoria en apps que no son del sistema. Esta marca solo afecta el hardware que admite la extensión de etiquetado de memoria (MTE) de ARM.

NATIVE_MEMTAG_SYNC

ID del cambio: 177438394
Estado predeterminado: Inhabilitado para todas las apps.

Habilita la verificación de etiquetas de memoria síncrona (SYNC) en este proceso. Esta marca solo afecta el hardware que admite la extensión de etiquetado de memoria (MTE) de ARM. Si NATIVE_MEMTAG_ASYNC y esta opción están habilitadas, esta opción tiene prioridad y la MTE se habilita en modo SYNC.

NOTIFICATION_TRAMPOLINE_BLOCK

ID del cambio: 1616776448
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

Para mejorar el rendimiento y la UX de las apps, las aplicaciones orientadas a Android 12 no pueden usar servicios ni receptores de emisión como trampolines de notificación.

Si quieres obtener más información sobre este cambio, consulta No es posible crear trampolines de notificación desde servicios o receptores de emisión.

PENDING_INTENT_EXPLICIT_MUTABILITY_REQUIRED

ID del cambio: 160794467
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, debes especificar la mutabilidad de cada objeto PendingIntent que crea tu app. Este requisito adicional mejora la seguridad de tu app.

Para obtener más información sobre este cambio, consulta Los intents pendientes deben declarar la mutabilidad.

RATE_LIMIT_TOASTS

ID del cambio: 174840628
Estado predeterminado: Este cambio no se puede activar ni desactivar. Solo se registra en el marco de compatibilidad.

Habilita el límite de frecuencia en la cantidad de llamadas a Toast.show() para evitar que el usuario se sobrecargue con demasiados avisos en un tiempo limitado. Cualquier intento de mostrar más avisos de lo que se permite en un período determinado hará que se descarten los avisos.

RETURN_NULL_HARDWARE_ADDRESS

ID del cambio: 170188668
Estado predeterminado: Habilitado para apps que se orientan a Android 11 (nivel de API 30) o versiones posteriores.

En el caso de las apps orientadas a Android 11 (nivel de API 30) y versiones posteriores, getHardwareAddress() muestra null cuando la dirección de hardware es inaccesible. Si el cambio está inhabilitado, en su lugar se muestra la dirección MAC predeterminada (02:00:00:00:00:00).

Para obtener más información sobre este cambio, consulta Restricciones en las direcciones MAC de Netlink.

SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE

ID del cambio: 151105954
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En el caso de las apps orientadas a Android 12 y versiones posteriores, exige que todas las attributionTags enviadas a noteOp(String, int, String), noteProxyOp(String, String) y startOp(String, int, String) estén definidas en el manifiesto del paquete que se especifica como parámetro de los métodos.

A fin de habilitar este cambio, el paquete que llama a noteOp(String, int, String) y el paquete especificado como parámetro del método deben tener habilitado este cambio.

SELINUX_LATEST_CHANGES

ID del cambio: 143539591
Estado predeterminado: Habilitado para apps que se orientan a Android 12 o versiones posteriores.

En las apps orientadas a Android 12 y versiones posteriores, habilita los cambios más recientes de SELinux. Desactivar este cambio para una app orientada a Android 12 o una versión posterior es una no-op. No tiene efecto en apps que usan un ID de usuario compartido.

THROW_EXCEPTION_ON_REQUIRE_INSTALL_PACKAGES_TO_ADD_INSTALLER_PACKAGE

ID del cambio: 150857253
Estado predeterminado: Habilitado para apps que se orientan a Android 11 (nivel de API 30) o versiones posteriores.

En el caso de las apps orientadas a Android 11 (nivel de API 30) y versiones posteriores, agregar un nombre de paquete de instalación a un paquete que no lo tenga ahora requiere el permiso INSTALL_PACKAGES. Si el emisor se orienta a Android 11 (nivel de API 30), se genera una SecurityException. De lo contrario, la solicitud falla de forma silenciosa. En ambos casos, independientemente de si se habilita este cambio, el paquete del instalador no se modifica.