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
A partir de Android 17, las apps que se segmentan para Android 17 (nivel de API 37) o versiones posteriores reciben una nueva implementación sin bloqueo de android.os.MessageQueue. La nueva implementación mejora el rendimiento y reduce los fotogramas perdidos, pero puede interrumpir los clientes que reflejan los campos y métodos privados de MessageQueue.
Para obtener más información, incluidas las estrategias de mitigación, consulta la guía sobre el cambio de comportamiento de MessageQueue.
Los campos finales estáticos ahora son inmodificables
Apps running on Android 17 or higher that target
Android 17 (API level 37) or higher cannot change static final fields. If
an app attempts to change a static final field by using reflection, it will
cause an IllegalAccessException. Attempting to modify one of these fields
through JNI APIs (such as SetStaticLongField()) will cause the app to crash.
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
This feature introduces new AccessibilityEvent and TextAttribute
APIs to enhance screen reader spoken feedback for CJKV language input. CJKV IME
apps can now signal whether a text conversion candidate has been selected during
text composition. Apps with edit fields can specify text change types when
sending text changed accessibility events.
For example, apps can specify that a text change occurred during text
composition, or that a text change resulted from a commit.
Doing this enables accessibility
services such as screen readers to deliver more precise feedback based on the
nature of the text modification.
App adoption
IME Apps: When setting composing text in edit fields, IMEs can use
TextAttribute.Builder.setTextSuggestionSelected()to indicate whether a specific conversion candidate was selected.Apps with Edit Fields: Apps that maintain a custom
InputConnectioncan retrieve candidate selection data by callingTextAttribute.isTextSuggestionSelected(). These apps should then callAccessibilityEvent.setTextChangeTypes()when dispatchingTYPE_VIEW_TEXT_CHANGEDevents. Apps targeting Android 17 (API level 37) that use the standardTextViewwill have this feature enabled by default. (That is,TextViewwill handle retrieving data from the IME and setting text change types when sending events to accessibility services).Accessibility Services: Accessibility services that process
TYPE_VIEW_TEXT_CHANGEDevents can callAccessibilityEvent.getTextChangeTypes()to identify the nature of the modification and adjust their feedback strategies accordingly.
Privacidad
Android 17 incluye los siguientes cambios para mejorar la privacidad del usuario.
Se habilitó ECH (Encrypted Client Hello) de forma oportunista
Android 17 introduces platform support for Encrypted Client Hello (ECH), a TLS extension that enhances user privacy by encrypting the Server Name Indication (SNI) in the TLS handshake. This encryption helps prevent network observers from easily identifying the specific domain your app is connecting to.
For apps targeting Android 17 (API level 37) or higher, ECH is opportunistically used for TLS connections. ECH is active only if the networking library used by the app (for example, HttpEngine, WebView, or OkHttp) has integrated ECH support and the remote server also supports the ECH protocol. If ECH cannot be negotiated, the connection automatically falls back to a standard TLS handshake without SNI encryption.
To allow apps to customize this behavior, Android 17 adds a new
<domainEncryption> element to the Network Security Configuration file.
Developers can use <domainEncryption> within <base-config> or
<domain-config> tags to select an ECH mode (for example,
"opportunistic", "enabled", or "disabled") on a global or per-domain
basis.
For more information, see the Encrypted Client Hello documentation.
Se requiere permiso de red local para las apps segmentadas para Android 17
Android 17 presenta el permiso de tiempo de ejecución ACCESS_LOCAL_NETWORK
para proteger a los usuarios del acceso no autorizado a la red local. Como esto se incluye en el grupo de permisos NEARBY_DEVICES existente, no se les vuelve a solicitar a los usuarios que ya otorgaron otros permisos de NEARBY_DEVICES. Este nuevo requisito evita que las apps maliciosas aprovechen el acceso irrestricto a la red local para el seguimiento de usuarios y la creación de huellas digitales encubiertos. Si declaras y solicitas este permiso, tu app puede descubrir dispositivos en la red de área local (LAN) y conectarse a ellos, como dispositivos inteligentes para la casa o receptores de transmisión.
Las apps orientadas a Android 17 (nivel de API 37) o versiones posteriores ahora tienen dos rutas para mantener la comunicación con los dispositivos LAN: adoptar selectores de dispositivos mediados por el sistema que preserven la privacidad para omitir la solicitud de permiso o solicitar explícitamente este nuevo permiso en el tiempo de ejecución para mantener la comunicación de la red local.
Para obtener más información, consulta la documentación sobre el permiso de red local.
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
En Android 17, la plataforma continúa su cambio hacia una arquitectura "segura de forma predeterminada" y presenta un conjunto de mejoras diseñadas para mitigar vulnerabilidades de gravedad alta, como el phishing, el secuestro de interacciones y los ataques de delegado confundido. Esta actualización requiere que los desarrolladores acepten explícitamente los nuevos estándares de seguridad para mantener la compatibilidad de la app y la protección del usuario.
Entre los impactos clave para los desarrolladores, se incluyen los siguientes:
- Endurecimiento de BAL y habilitación mejorada: Estamos mejorando las restricciones de Background Activity
Launch (BAL) mediante la extensión de las protecciones a
IntentSender. Los desarrolladores deben migrar de la constante heredadaMODE_BACKGROUND_ACTIVITY_START_ALLOWED. En cambio, debes adoptar controles detallados comoMODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, que restringe los inicios de actividad a situaciones en las que la app que llama es visible, lo que reduce significativamente la superficie de ataque. - Herramientas de adopción: Los desarrolladores deben usar el modo estricto y las verificaciones de lint actualizadas para identificar patrones heredados y garantizar la preparación para los requisitos futuros del SDK de destino.
Habilita la CT de forma predeterminada
Si una app se orienta a Android 17 (nivel de API 37) o versiones posteriores, la transparencia de certificados (CT) está habilitada de forma predeterminada. (En Android 16, la CT está disponible, pero las apps debían habilitarla).
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
En el caso de las apps orientadas a Android 17 (nivel de API 37) y
versiones posteriores, el proveedor de contactos 2 (CP2) aplica una validación estricta de las consultas en SQL cuando
se accede a la tabla ContactsContract.Data sin el permiso READ_CONTACTS.
Con este cambio, si una app no tiene READ_CONTACTS
permiso, se configuran las opciones StrictColumns y
StrictGrammar cuando se consulta
la tabla ContactsContract.Data. Si una consulta usa un patrón que no es compatible con estas, se rechazará y se generará una excepción.
Medios
Android 17 incluye los siguientes cambios en el comportamiento de los medios.
Endurecimiento del audio en segundo plano
Beginning with Android 17, the audio framework enforces restrictions on background audio interactions including audio playback, audio focus requests, and volume change APIs to ensure that these changes are started intentionally by the user.
Some audio restrictions apply to all apps. However, the restrictions are more stringent if an app targets Android 17 (API level 37). If one of these apps interacts with audio while it is in the background, it must have a foreground service running. In addition, the app must meet one or both of these requirements:
- The foreground service must have while-in-use (WIU) capabilities.
- The app must have the exact alarm permission and be interacting with
USAGE_ALARMaudio streams.
For more information, including mitigation strategies, see Background audio hardening.
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.