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 forma parte del marco de compatibilidad en Android 12 (nivel de API 31). 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 que se incluye en el marco de compatibilidad de Android 12.

Puedes filtrar la lista de cambios por Estado predeterminado.

Cambios de comportamiento agregados al marco de compatibilidad de Android 12

ALWAYS_SANDBOX_DISPLAY_APIS

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

Cuando se habilita, aplica la zona de pruebas de la API de Display a un paquete independientemente del modo de renderización en ventanas. Las APIs de Display siempre proporcionarán los límites de la app.

Para obtener más información sobre este cambio, consulta la sección sobre métodos de Display obsoletos en la página de cambios de comportamiento de Android 12.

AUTOFILL_NON_TEXT_REQUIRES_ON_RECEIVE_CONTENT_LISTENER

ID del cambio: 163400105
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 32) o versiones posteriores.

A partir de Android 12, la plataforma puede proporcionar sugerencias que no sean de texto (como imágenes) mediante Autofill Framework aumentado (consulta Servicios de autocompletado). Para que una app pueda controlar estas sugerencias, generalmente, debe implementar la API de OnReceiveContentListener.

A fin de mejorar la adopción de esta API para las apps que ya implementaron la API de InputConnection.commitContent(InputContentInfo, int, Bundle), la reutilizamos como resguardo si la app aún no implementó OnReceiveContentListener. Este resguardo solo está habilitado en Android 12 (nivel de API 31). Este ID de cambio inhabilita el resguardo, de modo que las apps orientadas a Android 12 (nivel de API 32) y versiones posteriores deben implementar la API de OnReceiveContentListener para aceptar sugerencias que no sean de texto.

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 (nivel de API 31), 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 utiliza, se restringirá.

BLOCK_GPS_STATUS_USAGE

ID del cambio: 144027538
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Para las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, todo el uso de la API de GpsStatus debe reemplazarse por las API de GnssStatus.

BLOCK_IMMUTABLE_PENDING_INTENTS

ID del cambio: 171317480
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) 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 (nivel de API 31) o versiones posteriores.

Para las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, las API del sistema LocationRequest no se pueden usar con solicitudes de ubicación PendingIntent.

BLOCK_UNTRUSTED_TOUCHES

ID del cambio: 158002302
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.

CALL_ACTIVITY_RESULT_BEFORE_RESUME

ID del cambio: 78294732
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 32) o versiones posteriores.

En el caso de las apps que se orientan a Android 12 (nivel de API 32) y versiones posteriores, se corrige el ciclo de vida del resultado de la actividad para garantizar que una obtiene el resultado justo antes de que se reanude.

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.

CANNOT_INSTALL_WITH_BAD_PERMISSION_GROUPS

ID del cambio: 146211400
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 32) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 32) y versiones posteriores, el administrador de paquetes no instalará un paquete si hay grupos de permisos con errores de formato. Los grupos de permisos solo se deben compartir entre apps que compartan un certificado. Si un permiso pertenece a un grupo, también se debe definir ese grupo.

CHANGE_ID_AUTH_STATE_DENIED

ID del cambio: 181350407
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps cliente orientadas a Android 12 (nivel de API 31) y versiones posteriores, se arroja una SecurityException cuando están en el estado de autorización denegado e intentan enviar un mensaje a una nanoapp.

CHANGE_ID_SAMPLING_RATE_SENSORS_PERMISSION

ID del cambio: 136069189
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, se genera una SecurityException cuando no tienen el permiso HIGH_SAMPLING_RATE_SENSORS, se ejecutan en modo de depuración y solicitan tasas de muestreo más rápidas que 200 Hz.

DELIVER_HISTORICAL_LOCATIONS

ID del cambio: 73144566
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, los clientes de ubicación pueden recibir ubicaciones históricas (anteriores a la fecha actual) en algunas circunstancias.

DISPLAY_INFO_NR_ADVANCED_SUPPORTED

ID del cambio: 181658987
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Para las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, proporciona retrocompatibilidad con los cambios en TelephonyDisplayInfo.

DISPLAY_MODE_RETURNS_PHYSICAL_REFRESH_RATE

ID del cambio: 170503758
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, la plataforma podría reducir la velocidad de fotogramas de una app a un divisor de la frecuencia de actualización si es más preferible (por ejemplo, si la app llama a Surface.setFrameRate(float, int)). Las apps experimentarán devoluciones de llamadas de Choreographer.postFrameCallback(Choreographer.FrameCallback) y contrapresión a la velocidad de fotogramas limitada. Las apps usan Display.getRefreshRate() y Display.Mode.getRefreshRate() para saber cuál es la frecuencia de actualización de la pantalla. Display.getRefreshRate() siempre mostrará la velocidad de fotogramas de la aplicación y no la frecuencia de actualización de pantalla física para permitir que las apps establezcan el ritmo de fotogramas correctamente. Display.Mode.getRefreshRate() mostrará la velocidad de fotogramas de la app si se compila en una versión anterior y, a partir de Android 12 (nivel de API 31), mostrará la frecuencia de actualización de pantalla física.

DOWNSCALED

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

Este cambio es el guardián de todos los cambios de escalamiento descendente de búfer por app. Si habilitas este cambio, se podrán aplicar los siguientes factores de escala:

Cuando se habilita este cambio para un paquete de app, se fuerza el cambio de tamaño de la app al factor de escala más alto habilitado. Por ejemplo, se usa el 80% si están habilitados el 80% y el 70% (DOWNSCALE_80 y DOWNSCALE_70).

DOWNSCALE_30

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 30% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_35

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 35% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_40

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 40% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_45

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con un 45% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_50

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 50% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_55

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 55% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_60

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 60% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_65

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 65% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_70

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 70% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_75

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 75% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_80

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 80% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_85

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 85% de las resoluciones vertical y horizontal de la pantalla real.

DOWNSCALE_90

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

Cuando el estado de DOWNSCALED también es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con el 90% de las resoluciones vertical y horizontal de la pantalla real.

DO_NOT_DOWNSCALE_TO_1080P_ON_TV

ID del cambio: 157629738
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Se espera que las apps de Android TV orientadas a Android 12 (nivel de API 31) y versiones posteriores procesen cualquier tamaño de ventana, incluidos los tamaños de ventana superiores a 1080p. Las apps orientadas a versiones anteriores de Android no esperan recibir ventanas de más de 1080p, por lo que sus ventanas se reducen a 1080p cuando es necesario.

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.

ENABLE_CHECKS_FOR_PRIVATE_FILES

ID del cambio: 172100307
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores no pueden insertar ni actualizar archivos privados con el proveedor de contenido multimedia.

ENABLE_DEFERRED_SCAN

ID del cambio: 180326732
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Habilita esta opción a fin de diferir el análisis que se activa como parte de MediaProvider#update().

ENABLE_GET_CALL_STATE_PERMISSION_PROTECTION

ID del cambio: 157233955
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, habilita la protección READ_PHONE_STATE en las consultas de API y la notificación del estado de las llamadas, como TelecomManager#getCallState, TelephonyManager.getCallStateForSubscription() y TelephonyCallback.CallStateListener.

ENABLE_GET_PHONE_ACCOUNT_PERMISSION_PROTECTION

ID del cambio: 183407956
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, habilita las protecciones READ_PHONE_NUMBERS o READ_PRIVILEGED_PHONE_STATE en getPhoneAccount(PhoneAccountHandle).

ENABLE_INCLUDE_ALL_VOLUMES

ID del cambio: 182734110
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Habilita esta opción a fin de incluir filas de archivos de la base de datos de un volumen desactivado recientemente en MediaProvider#query.

ENABLE_RAW_MANAGE_EXTERNAL_STORAGE_ACCESS

ID del cambio: 178209446
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Habilita esta opción a fin de permitir que las apps que tienen el permiso Manifest.permission.MANAGE_EXTERNAL_STORAGE soliciten acceso al almacenamiento externo sin procesar.

ENFORCE_MINIMUM_WINDOW_ON_INEXACT_ALARMS

ID del cambio: 185199076
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Para las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, todas las alarmas inexactas deben tener un tamaño mínimo de ventana, que se espera que sea de unos pocos minutos. En la práctica, todas las alarmas que requieran ventanas más pequeñas son las mismas que las alarmas exactas y deberían usar las API correspondientes proporcionadas, como setExact(int, long, PendingIntent). Las alarmas inexactas con ventanas más cortas especificadas harán que el sistema alargue sus ventanas.

ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES

ID del cambio: 142191088
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Las apps orientadas a Android 12 (nivel de API 31) 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: 143231523
Estado predeterminado: Inhabilitado para todas las apps.

Cuando se habilita, SQLiteQueryBuilder verifica todas las selecciones de consultas de CalendarProvider2 con argumentos maliciosos.

FGS_BG_START_RESTRICTION_CHANGE_ID

ID del cambio: 170668199
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, restringe cuándo las apps pueden iniciar servicios en primer plano mientras se ejecutan en segundo plano.

FGS_START_EXCEPTION_CHANGE_ID

ID del cambio: 174041399
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, permite que el sistema muestre una IllegalStateException si una app intenta iniciar un servicio en primer plano mientras se ejecuta en segundo plano.

FINISH_INPUT_NO_FALLBACK_CONNECTION

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

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, finaliza la InputConnection cuando el dispositivo sea non-interactive.

Si la input method actual la habilita, la conexión de entrada actual será finished cada vez que los dispositivos se vuelvan no interactivos.

Si no está habilitada, la conexión de entrada actual se desactivará de manera silenciosa cuando los dispositivos se vuelvan no interactivos, y se enviará un par de onFinishInput() y onStartInput() cuando el dispositivo vuelva a ser interactivo.

FORCE_DISABLE_HEVC_SUPPORT

ID del cambio: 174227820
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 se puede usar para forzar a una app a que no admita HEVC, lo que fuerza la transcodificación mientras se accede a contenido multimedia codificado en HEVC. La configuración de esta marca anula 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. Si tanto esta marca como FORCE_ENABLE_HEVC_SUPPORT están habilitadas, el SO ignora ambas marcas.

FORCE_ENABLE_HEVC_SUPPORT

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

Fuerza la habilitación de una app para admitir la capacidad de contenido multimedia HEVC. Las apps deben declarar las capacidades de contenido multimedia compatibles en su manifiesto, pero esta marca se puede usar para forzar la compatibilidad de una app con HEVC. Por lo tanto, se evita la transcodificación al acceder a contenido multimedia codificado en HEVC. La configuración de esta marca anula 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. Si tanto esta marca como FORCE_DISABLE_HEVC_SUPPORT están habilitados, el SO ignora ambas marcas.

FORCE_NON_RESIZE_APP

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

Fuerza los paquetes a los que se aplica de modo que no puedan cambiar el tamaño.

FORCE_RESIZE_APP

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

Fuerza los paquetes a los que se aplica de modo 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: 171979766
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

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

IGNORE_ALLOW_BACKUP_IN_D2D

ID del cambio: 183147249
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, se ignora android:allowBackup para las apps durante las migraciones de dispositivo a dispositivo (D2D).

IGNORE_FULL_BACKUP_CONTENT_IN_D2D

ID del cambio: 180523564
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, las reglas de inclusión y exclusión especificadas mediante android:fullBackupContent se ignoran durante las transferencias de dispositivo a dispositivo (D2D).

IME_AUTOFILL_DEFAULT_SUPPORTED_LOCALES_IS_EMPTY

ID del cambio: 169273070
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, getSupportedLocales() ahora muestra una lista de configuraciones regionales vacía cuando no está configurada, en lugar de la configuración regional predeterminada del sistema.

IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE

ID del cambio: 158482162
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

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

KEYSTORE_OPERATION_CREATION_MAY_FAIL

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

Cuando se habilita, la creación de la operación del almacén de claves puede fallar según la nueva estrategia de reducción. El almacén de claves solía trabajar bajo el supuesto de que la creación de operaciones criptográficas siempre se realizaba correctamente. Sin embargo, el backend de KeyMint solo tiene una cantidad limitada de ranuras de operación.

Para mantener la apariencia de las ranuras de operación "infinitas", el daemon del almacén de claves reduciría las operaciones que menos se usaron recientemente si no había una ranura de operación disponible. Como resultado, las operaciones buenas podían terminarse de manera prematura. Esto abrió AndroidKeystore a la denegación del servicio (DoS) y el bloqueo en vivo no deseado. Por ejemplo, si se despiertan varias apps al mismo tiempo debido a optimizaciones de administración de batería y se intentan realizar operaciones criptográficas, comienzan a finalizar las operaciones entre ellas sin lograr ningún progreso.

Para eliminar los bloqueos en funcionamiento y desalentar los intentos de DoS, cambiamos la estrategia de reducción para que prefiera a los clientes que usan pocas ranuras de operación por poco tiempo. Como resultado, las operaciones individuales que no permanezcan inactivas durante más de 5 segundos casi siempre concluirán sin que se obstaculice 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 esos casos son extremadamente poco frecuentes. Como efecto secundario de esta nueva operación de estrategia de reducción, 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 llamador pueda reducir una operación, debe encontrar una operación con un malus superior al propio. Si deseas obtener más detalles 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 se realiza de forma correcta. Sin embargo, es posible que la operación tarde más. 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.

LOCK_DOWN_CLOSE_SYSTEM_DIALOGS

ID del cambio: 174664365
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, no se puede enviar Intent.ACTION_CLOSE_SYSTEM_DIALOGS, a menos que la app también tenga el permiso android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS. Ten en cuenta que esta es la versión más restrictiva de #DROP_CLOSE_SYSTEM_DIALOGS que espera que la app deje de enviar el intent Intent.ACTION_CLOSE_SYSTEM_DIALOGS una vez que esta se inicia en Android 12 (nivel de API 31) o versiones posteriores.

LOCK_DOWN_COLLAPSE_STATUS_BAR

ID del cambio: 173031413
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, se requiere el permiso Manifest.permission.STATUS_BAR para contraer los paneles de la barra de estado por razones de seguridad. Algunos softwares maliciosos estaban aprovechando esto para evitar que el usuario acceda a notificaciones críticas.

LOW_POWER_EXCEPTIONS

ID del cambio: 168936375
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

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

MISSING_EXPORTED_FLAG

ID del cambio: 150232615
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) 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_HEAP_POINTER_TAGGING_APP_ZYGOTE

ID del cambio: 207557677
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 32) o versiones posteriores.

En el caso de las apps que se orientan a Android 12 (nivel de API 32) y versiones posteriores, las asignaciones de montón nativas en el proceso AppZygote y sus descendientes usan una etiqueta distinta de cero en el byte más importante.

Para obtener más información sobre este cambio, consulta Punteros etiquetados.

NATIVE_HEAP_ZERO_INIT

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

Habilita la inicialización automática en cero de las asignaciones nativas de memoria del montón.

NATIVE_MEMTAG_ASYNC

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

Habilita la verificación de etiquetas de memoria asíncrona (ASYNC) en este proceso. 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.

NEVER_SANDBOX_DISPLAY_APIS

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

Cuando se habilita, impide que la zona de pruebas de la API de Display se aplique a un letterbox o a la actividad de SCM. Las APIs de Display continuarán proporcionando los límites DisplayArea.

Para obtener más información sobre este cambio, consulta la sección sobre métodos de Display obsoletos en la página de cambios de comportamiento de Android 12.

NOTIFICATION_CANCELLATION_REASONS

ID del cambio: 175319604
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Permite que los objetos de escucha de notificaciones comprendan nuevos motivos de cancelación más específicos.

NOTIFICATION_TRAMPOLINE_BLOCK

ID del cambio: 167676448
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) 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.

NULL_TELEPHONY_THROW_NO_CB

ID del cambio: 182185642
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Se usa a fin de verificar si la versión del SDK de destino para el proceso actual es Android 12 (nivel de API 31) o una posterior.

Se aplica a los siguientes métodos:

OVERRIDE_MIN_ASPECT_RATIO

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

Este cambio es el guardián de todos los cambios que fuercen una relación de aspecto mínima dada. Si se habilita este cambio, se podrán aplicar las siguientes relaciones de aspecto mínimas:

Cuando se habilita este cambio para un paquete de app, la relación de aspecto mínima proporcionada en el manifiesto de la app se anula con la relación de aspecto más grande habilitada, a menos que el valor del manifiesto de la app sea superior.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

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

Cuando el estado de OVERRIDE_MIN_ASPECT_RATIO también es habilitado, habilitar este cambio para un paquete establece la relación de aspecto mínima de la actividad en un valor grande definido por OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE.

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

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

Cuando el estado de OVERRIDE_MIN_ASPECT_RATIO también es habilitado, habilitar este cambio para un paquete establece la relación de aspecto mínima de la actividad en un valor medio definido por OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE.

PENDING_INTENT_EXPLICIT_MUTABILITY_REQUIRED

ID del cambio: 160794467
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Para las apps orientadas a Android 12 (nivel de API 31) 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.

PREVENT_SETTING_PASSWORD_QUALITY_ON_PARENT

ID del cambio: 165573442
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

Las apps de administración orientadas a Android 12 (nivel de API 31) y versiones posteriores no pueden usar DevicePolicyManager.setPasswordQuality(ComponentName, int) para establecer la calidad de la contraseña en la instancia DevicePolicyManager que se obtiene mediante una llamada a DevicePolicyManager.getParentProfileInstance(ComponentName). En cambio, deben usar DevicePolicyManager.setRequiredPasswordComplexity(int) para establecer requisitos de contraseñas generales en todo el dispositivo.

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 sobrecargar al usuario 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.

REQUIRE_EXACT_ALARM_PERMISSION

ID del cambio: 171306433
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, las apps deben tener el permiso Manifest.permission.SCHEDULE_EXACT_ALARM para usar cualquier API a fin de establecer alarmas exactas, como setExactAndAllowWhileIdle(int, long, PendingIntent) y setAlarmClock(AlarmClockInfo, PendingIntent).

REQUIRE_READ_PHONE_STATE_PERMISSION_FOR_ACTIVE_DATA_SUB_ID

ID del cambio: 182478738
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, las apps deben tener el permiso Manifest.permission.READ_PHONE_STATE para llamar a TelephonyCallback.ActiveDataSubscriptionIdListener.

REQUIRE_READ_PHONE_STATE_PERMISSION_FOR_CELL_INFO

ID del cambio: 184323934
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, las apps deben tener el permiso Manifest.permission.READ_PHONE_STATE para llamar a TelephonyCallback.CellInfoListener.

REQUIRE_READ_PHONE_STATE_PERMISSION_FOR_DISPLAY_INFO

ID del cambio: 183164979
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, las apps deben tener el permiso Manifest.permission.READ_PHONE_STATE para llamar a TelephonyCallback.DisplayInfoListener.

RESTRICT_ADB_BACKUP

ID del cambio: 171032338
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, adb backup se activa automáticamente para las apps que se ejecutan como depurables (android:debuggable establecido en true) y no está disponible para ninguna otra app.

RESTRICT_DOMAINS

ID del cambio: 175408749
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, se requiere el formato actualizado de la API de verificación de vínculos de apps. Este requisito implica que una app debe declarar dominios dentro de un filtro de intents que incluya lo siguiente:

  • android:autoVerify="true"
  • Intent.ACTION_VIEW
  • Intent.CATEGORY_BROWSABLE
  • Intet.CATEGORY_DEFAULT
  • Solo IntentFilter.SCHEME_HTTP o IntentFilter.SCHEME_HTTPS, sin otros esquemas

En versiones anteriores de Android, Intent.CATEGORY_BROWSABLE no era un requisito, se permitían otros esquemas y configurar autoVerify como true en cualquier filtro de intents fingía de manera implícita que todos los filtros de intents se establecieran como autoVerify="true".

SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE

ID del cambio: 151105954
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) 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 manifiesto del paquete que se especifica como un 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 (nivel de API 31) o versiones posteriores.

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

SETTINGS_API_V2

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

La API nueva de preferencias del usuario, que verifica dominios marcados como autoVerify=true en los filtros de intents de AndroidManifest.xml, aún no se implementó en la vista previa actual de la plataforma. Por ahora, es posible obtener una vista previa de los cambios en las nuevas preferencias de los usuarios habilitando este ChangeId y usando adb shell pm set-app-links-user-selection y comandos similares.

USE_SHORT_FGS_USAGE_INTERACTION_TIME

ID del cambio: 183972877
Estado predeterminado: Habilitado para apps que se orientan a Android 12 (nivel de API 31) o versiones posteriores.

En el caso de las apps orientadas a Android 12 (nivel de API 31) y versiones posteriores, determina si se usa un tiempo de espera más corto antes de elevar el intervalo de Standby a ACTIVE cuando las apps inician un servicio en primer plano.