Prepárate para 12L, una actualización de funciones para pantallas grandes que se lanzará a principios del próximo año. Pruébala hoy.

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.

Fuerza los paquetes a los que se aplica, de modo que siempre se aplique la zona de pruebas de la API de Display, independientemente del modo de renderización en ventanas. Las API de Display siempre proporcionarán los límites de la app.

Si deseas obtener más información sobre este cambio, consulta Display#getRealSize y getRealMetrics: baja y zona de pruebas.

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.

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.

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 frecuencia de fotogramas de la aplicación y no la frecuencia de actualización de pantalla física para permitir que las apps establezcan correctamente el ritmo de fotogramas. 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. Inhabilitar este cambio evita que funcionen 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 usará 80% si tanto 80% como 70% están habilitados.

DOWNSCALE_30

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

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

DOWNSCALE_35

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

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

DOWNSCALE_40

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

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

DOWNSCALE_45

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

Cuando el estado de DOWNSCALEDtambién es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con una resolución vertical y horizontal del 45% 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 una resolución vertical y horizontal del 50% de la pantalla real.

DOWNSCALE_55

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

Cuando el estado de DOWNSCALEDtambién es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con una resolución vertical y horizontal del 55% 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 una resolución vertical y horizontal del 60% de la pantalla real.

DOWNSCALE_65

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

Cuando el estado de DOWNSCALEDtambién es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con una resolución vertical y horizontal del 65% 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 una resolución vertical y horizontal del 70% de la pantalla real.

DOWNSCALE_75

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

Cuando el estado de DOWNSCALEDtambién es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con una resolución vertical y horizontal del 75% 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 una resolución vertical y horizontal del 80% de la pantalla real.

DOWNSCALE_85

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

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

DOWNSCALE_90

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

Cuando el estado de DOWNSCALEDtambién es habilitado, habilitar este cambio para un paquete fuerza a la app a asumir que se está ejecutando en una pantalla con una resolución vertical y horizontal del 90% 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 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_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 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: 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 está habilitada, la creación de la operaciones del almacén de claves puede fallar según la nueva estrategia de reducción. 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.

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

Fuerza los paquetes a los que se aplica de modo que nunca se aplique la zona de pruebas de la API de Display en letterbox ni en una actividad de SCM. Las API de Display continuarán proporcionando los límites DisplayArea.

Si deseas obtener más información sobre este cambio, consulta Display#getRealSize y getRealMetrics: baja y zona de pruebas.

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

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.