Cambios en el comportamiento: apps orientadas a Android 17 o versiones posteriores

Al igual que las versiones anteriores, Android 17 incluye cambios de comportamiento que podrían afectar tu app. Los siguientes cambios se aplican exclusivamente a las apps que tienen como objetivo Android 17 o versiones posteriores. Si tu app está orientada a Android 17 o versiones posteriores, debes modificarla para que admita estos comportamientos, cuando corresponda.

Asegúrate de revisar también la lista de cambios en el comportamiento que afectan a todas las apps que se ejecutan en Android 17, independientemente de la targetSdkVersion de tu app.

Funcionalidad principal

Android 17 incluye los siguientes cambios que modifican o expanden varias capacidades principales del sistema Android.

Nueva implementación sin bloqueo de MessageQueue

Beginning with Android 17, apps targeting Android 17 (API level 37) or higher receive a new lock-free implementation of android.os.MessageQueue. The new implementation improves performance and reduces missed frames, but may break clients that reflect on MessageQueue private fields and methods.

For more information, including mitigation strategies, see MessageQueue behavior change guidance.

Los campos finales estáticos ahora son inmodificables

Las apps que se ejecutan en Android 17 o versiones posteriores y que se segmentan para Android 17 (nivel de API 37) o versiones posteriores no pueden cambiar los campos de static final. Si una app intenta cambiar un campo static final con la reflexión, se producirá un IllegalAccessException. Si intentas modificar uno de estos campos a través de las APIs de JNI (como SetStaticLongField()), la app fallará.

Accesibilidad

Android 17 incluye los siguientes cambios para mejorar la accesibilidad.

Compatibilidad con la accesibilidad de la escritura compleja con IME en el teclado físico

Esta función presenta nuevas APIs de AccessibilityEvent y TextAttribute para mejorar los comentarios por voz del lector de pantalla para la entrada de idiomas CJKV. Las apps de IME de CJKV ahora pueden indicar si se seleccionó un candidato de conversión de texto durante la composición de texto. Las apps con campos de edición pueden especificar tipos de cambios de texto cuando envían eventos de accesibilidad de texto cambiado. Por ejemplo, las apps pueden especificar que se produjo un cambio de texto durante la composición de texto o que un cambio de texto se produjo a partir de una confirmación. Esto permite que los servicios de accesibilidad, como los lectores de pantalla, proporcionen comentarios más precisos según la naturaleza de la modificación del texto.

Adopción de apps

  • Apps de IME: Cuando se configura la composición de texto en campos de edición, los IME pueden usar TextAttribute.Builder.setTextSuggestionSelected() para indicar si se seleccionó un candidato de conversión específico.

  • Apps con campos de edición: Las apps que mantienen un InputConnection personalizado pueden recuperar datos de selección de candidatos llamando a TextAttribute.isTextSuggestionSelected(). Luego, estas apps deben llamar a AccessibilityEvent.setTextChangeTypes() cuando envíen eventos TYPE_VIEW_TEXT_CHANGED. Las apps que se segmentan para Android 17 (nivel de API 37) y que usan el TextView estándar tendrán esta función habilitada de forma predeterminada. (Es decir, TextView controlará la recuperación de datos del IME y establecerá tipos de cambio de texto cuando envíe eventos a los servicios de accesibilidad).

  • Servicios de accesibilidad: Los servicios de accesibilidad que procesan eventos de TYPE_VIEW_TEXT_CHANGED pueden llamar a AccessibilityEvent.getTextChangeTypes() para identificar la naturaleza de la modificación y ajustar sus estrategias de comentarios en consecuencia.

Privacidad

Android 17 incluye los siguientes cambios para mejorar la privacidad del usuario.

Se habilitó ECH (Encrypted Client Hello) de forma oportunista

Android 17 introduce compatibilidad con la plataforma para Encrypted Client Hello (ECH), una extensión de TLS que mejora la privacidad del usuario encriptando la indicación del nombre del servidor (SNI) en el protocolo de enlace TLS. Este encriptado ayuda a evitar que los observadores de la red identifiquen fácilmente el dominio específico al que se conecta tu app.

En el caso de las apps que se segmentan para Android 17 (nivel de API 37) o versiones posteriores, se usa ECH de forma oportunista para las conexiones TLS. El ECH solo está activo si la biblioteca de redes que usa la app (por ejemplo, HttpEngine, WebView o OkHttp) tiene compatibilidad integrada con ECH y el servidor remoto también admite el protocolo ECH. Si no se puede negociar ECH, la conexión recurre automáticamente a un protocolo de enlace TLS estándar sin encriptación de SNI.

Para permitir que las apps personalicen este comportamiento, Android 17 agrega un nuevo elemento <domainEncryption> al archivo de configuración de seguridad de red. Los desarrolladores pueden usar <domainEncryption> dentro de las etiquetas <base-config> o <domain-config> para seleccionar un modo de ECH (por ejemplo, "opportunistic", "enabled" o "disabled") de forma global o por dominio.

Para obtener más información, consulta la documentación de Encrypted Client Hello.

Se requiere permiso de red local para las apps segmentadas para Android 17

Android 17 introduces the ACCESS_LOCAL_NETWORK runtime permission to protect users from unauthorized local network access. Because this falls under the existing NEARBY_DEVICES permission group, users who have already granted other NEARBY_DEVICES permissions aren't prompted again. This new requirement prevents malicious apps from exploiting unrestricted local network access for covert user tracking and fingerprinting. By declaring and requesting this permission, your app can discover and connect to devices on the local area network (LAN), such as smart home devices or casting receivers.

Apps targeting Android 17 (API level 37) or higher now have two paths to maintain communication with LAN devices: Adopt system-mediated, privacy-preserving device pickers to skip the permission prompt, or explicitly request this new permission at runtime to maintain local network communication.

For more information, see the Local network permission documentation.

Cómo ocultar contraseñas en dispositivos físicos

Si una app se orienta a Android 17 (nivel de API 37) o versiones posteriores, y el usuario usa un dispositivo de entrada físico (por ejemplo, un teclado externo), el sistema operativo Android aplica el nuevo parámetro de configuración show_passwords_physical a todos los caracteres del campo de contraseña. De forma predeterminada, ese parámetro de configuración oculta todos los caracteres de la contraseña.

El sistema Android muestra el último carácter de contraseña escrito para ayudar al usuario a ver si escribió mal la contraseña. Sin embargo, esto es mucho menos necesario con teclados externos más grandes. Además, los dispositivos con teclados externos suelen tener pantallas más grandes, lo que aumenta el peligro de que alguien vea la contraseña escrita.

Si el usuario usa la pantalla táctil del dispositivo, el sistema aplica el nuevo parámetro de configuración show_passwords_touch.

Seguridad

Android 17 incluye las siguientes mejoras en la seguridad de los dispositivos y las apps.

Seguridad de la actividad

In Android 17, the platform continues its shift toward a "secure-by-default" architecture, introducing a suite of enhancements designed to mitigate high-severity exploits such as phishing, interaction hijacking, and confused deputy attacks. This update requires developers to explicitly opt in to new security standards to maintain app compatibility and user protection.

Key impacts for developers include:

  • BAL hardening & improved opt-in: We are refining Background Activity Launch (BAL) restrictions by extending protections to IntentSender. Developers must migrate away from the legacy MODE_BACKGROUND_ACTIVITY_START_ALLOWED constant. Instead, you should adopt granular controls like MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, which restricts activity starts to scenarios where the calling app is visible, significantly reducing the attack surface.
  • Adoption tools: Developers should utilize strict mode and updated lint checks to identify legacy patterns and ensure readiness for future target SDK requirements.

Habilita la CT de forma predeterminada

If an app targets Android 17 (API level 37) or higher, certificate transparency (CT) is enabled by default. (On Android 16, CT is available but apps had to opt in.)

DCL nativa más segura: C

Si tu app está orientada a Android 17 (nivel de API 37) o versiones posteriores, la protección de carga dinámica de códigos (DCL) más segura que se introdujo en Android 14 para archivos DEX y JAR ahora se extiende a las bibliotecas nativas.

Todos los archivos nativos cargados con System.load() se deben marcar como de solo lectura. De lo contrario, el sistema arrojará UnsatisfiedLinkError.

Recomendamos que las apps eviten la carga dinámica de códigos siempre que sea posible, ya que de esta manera aumenta, en gran medida, el riesgo de que una app pueda verse comprometida por la inserción o la manipulación de código.

Restringe los campos de PII en la vista de datos de CP2

Para las apps que segmentan Android 17 (nivel de API Android 17 (nivel de API 37)) y versiones posteriores, Proveedor de contactos 2 (CP2) restringe ciertas columnas que contienen información de identificación personal (PII) de la vista de datos. Cuando se habilita este cambio, estas columnas se quitan de la vista de datos para mejorar la privacidad del usuario. Las columnas restringidas incluyen lo siguiente:

Las apps que usan estas columnas de ContactsContract.Data pueden extraerlas de ContactsContract.RawContacts, uniéndose con RAW_CONTACT_ID.

Aplicar verificaciones estrictas de SQL en CP2

For apps targeting Android 17 (API level Android 17 (API level 37)) and higher, Contacts Provider 2 (CP2) enforces strict SQL query validation when the ContactsContract.Data table is accessed without READ_CONTACTS permission.

With this change, if an app doesn't have READ_CONTACTS permission, StrictColumns and StrictGrammar options are set when querying the ContactsContract.Data table. If a query uses a pattern that isn't compatible with these, it will be rejected and cause an exception to be thrown.

Medios

Android 17 incluye los siguientes cambios en el comportamiento de los medios.

Endurecimiento del audio en segundo plano

A partir de Android 17, el framework de audio aplica restricciones en las interacciones de audio en segundo plano, como la reproducción de audio, las solicitudes de enfoque de audio y las APIs de cambio de volumen, para garantizar que el usuario inicie estos cambios de forma intencional.

Se aplican algunas restricciones de audio a todas las apps. Sin embargo, las restricciones son más estrictas si una app se segmenta para Android 17 (nivel de API 37). Si una de estas apps interactúa con el audio mientras está en segundo plano, debe tener un servicio en primer plano en ejecución. Además, la app debe cumplir con uno o ambos de los siguientes requisitos:

  • El servicio en primer plano debe tener capacidades de permiso durante el uso (WIU).
  • La app debe tener el permiso de alarma exacta y estar interactuando con transmisiones de audio de USAGE_ALARM.

Para obtener más información, incluidas las estrategias de mitigación, consulta Protección de audio en segundo plano.

Factores de forma del dispositivo

Android 17 incluye los siguientes cambios para mejorar la experiencia del usuario en una variedad de tamaños y factores de forma de dispositivos.

Cambios en la API de la plataforma para ignorar las restricciones de orientación, cambio de tamaño y relación de aspecto en pantallas grandes (sw>=600 dp)

Presentamos cambios en la API de la plataforma en Android 16 para ignorar las restricciones de orientación, relación de aspecto y cambio de tamaño en pantallas grandes (sw >= 600 dp) para apps orientadas al nivel de API 36 o versiones posteriores. Los desarrolladores tienen la opción de inhabilitar estos cambios con el SDK 36, pero esta opción ya no estará disponible para las apps orientadas a Android 17 (nivel de API 37) o versiones posteriores.

Para obtener más información, consulta Se ignoran las restricciones de orientación y cambio de tamaño.

Conectividad

Android 17 introduce el siguiente cambio para mejorar la coherencia y alinearse con el comportamiento estándar de InputStream de Java para los sockets RFCOMM de Bluetooth.

Comportamiento coherente de BluetoothSocket read() para RFCOMM

En el caso de las apps segmentadas para Android 17 (nivel de API 37), el método read() del objeto InputStream obtenido de un objeto BluetoothSocket basado en RFCOMM ahora devuelve -1 cuando se cierra el socket o se interrumpe la conexión.

Este cambio hace que el comportamiento del socket RFCOMM sea coherente con los sockets LE CoC y se alinea con la documentación estándar de InputStream.read(), que indica que se devuelve -1 cuando se llega al final de la transmisión.

Las apps que dependen únicamente de detectar una IOException para salir de un bucle de lectura pueden verse afectadas por este cambio y deben actualizar los bucles de lectura de BluetoothSocket para verificar explícitamente un valor de retorno de -1. Esto garantiza que el bucle finalice correctamente cuando se desconecta el dispositivo remoto o se cierra el socket. Para ver un ejemplo de la implementación recomendada, consulta el fragmento de código en la guía Cómo transferir datos por Bluetooth.