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
从 Android 17 开始,以 Android 17(API 级别 37)
或更高版本为目标平台的应用会收到
android.os.MessageQueue 的新无锁实现。新实现可提升性能并减少丢帧,但可能会破坏反映 MessageQueue 私有字段和方法的客户端。
如需了解详情(包括缓解措施),请参阅 MessageQueue 行为变更指南。
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 teclados físicos
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
InputConnectionpersonalizado pueden recuperar datos de selección de candidatos llamando aTextAttribute.isTextSuggestionSelected(). Luego, estas apps deben llamar aAccessibilityEvent.setTextChangeTypes()cuando envíen eventosTYPE_VIEW_TEXT_CHANGED. Las apps que se segmentan para Android 17 (nivel de API 37) y que usan elTextViewestándar tendrán esta función habilitada de forma predeterminada. (Es decir,TextViewcontrolará 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_CHANGEDpueden llamar aAccessibilityEvent.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.
ECH (Encrypted Client Hello) habilitado
Android 17 引入了对加密客户端问候 (ECH) 的平台支持。ECH 是一种 TLS 扩展,可通过加密 TLS 握手中的服务器名称指示 (SNI) 来增强用户隐私保护。这种加密有助于防止网络观察者轻松识别您的应用所连接的特定网域。
对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,ECH 用于 TLS 连接。只有当应用使用的网络库(例如 HttpEngine、WebView 或 OkHttp)已集成 ECH 支持,并且远程服务器也支持 ECH 协议时,ECH 才会处于活跃状态。如果无法协商 ECH,客户端会发送一个包含随机内容的 ECH 扩展(一种称为 ECH GREASE 的机制)。如需详细了解 ECH GREASE 的工作原理,请参阅 RFC 9849。
为了让应用能够自定义此行为,Android 17 向网络安全配置文件添加了一个新的
<domainEncryption> 元素。
开发者可以在 <base-config> 或
<domain-config> 标记中使用 <domainEncryption>,以全局或按网域的方式选择 ECH 模式(例如
"enabled" 或 "disabled")。
如需了解详情,请参阅加密客户端问候文档。
Se requiere permiso de red local para las apps segmentadas para Android 17
Android 17 引入了 ACCESS_LOCAL_NETWORK 运行时权限,以保护用户免遭未经授权的本地网络访问。由于此权限属于现有的 NEARBY_DEVICES 权限组,因此系统不会再次提示已授予其他 NEARBY_DEVICES 权限的用户。这项新要求可防止恶意应用利用不受限制的本地网络访问权限进行隐秘的用户跟踪和指纹识别。通过声明和请求此权限,您的应用可以发现并连接到局域网 (LAN) 中的设备,例如智能家居设备或投屏接收器。
以 Android 17(API 级别 37)或更高版本为目标平台的应用现在可以通过两种方式与 LAN 设备保持通信:采用系统介导的、可保护隐私的设备选择器来跳过权限提示,或者在运行时明确请求此新权限以保持本地网络通信。
如需了解详情,请参阅本地网络权限文档。
Cómo ocultar contraseñas en dispositivos físicos
如果应用以 Android 17(API 级别 37)或更高版本为目标平台,并且用户使用的是实体输入设备(例如外接键盘),Android
操作系统会对密码字段中的所有字符应用新的 show_passwords_physical 设置。默认情况下,该设置会隐藏所有密码字符。
Android 系统会显示用户最后输入的密码字符,以帮助用户查看是否输错了密码。不过,对于较大的外接键盘,此功能就没那么必要了。此外,配备外接键盘的设备通常具有较大的显示屏,这会增加他人看到输入密码的风险。
如果用户使用的是设备触摸屏,系统会应用新的 show_passwords_touch 设置。
Protección de OTP para mensajes SMS estándar
A partir de Android 17, Android extiende su protección de OTP por SMS para aplicarla a los mensajes SMS estándar (mensajes SMS que contienen una OTP que no usa los formatos WebOTP o SMS Retriever). En el caso de la mayoría de las apps orientadas a Android 17 (nivel de API 37) o versiones posteriores, estos mensajes SMS no están disponibles hasta tres horas después de recibirlos. El objetivo de esta demora es evitar el secuestro de OTP. Durante esta demora de tres horas, se retiene la transmisión
SMS_RECEIVED_ACTION y se filtran las consultas de la base de datos del
proveedor de SMS. El mensaje SMS está disponible para estas apps después de la demora.
Ciertas apps, como la app de asistente de SMS predeterminada, las apps complementarias de dispositivos conectados, etc., están exentas de esta demora. Todas las apps que dependen de la lectura de mensajes SMS para la extracción de OTP deben hacer la transición al uso de las APIs de SMS Retriever o SMS User Consent para garantizar la continuidad de la funcionalidad.
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
如果应用以 Android 17(API 级别 37)或更高版本为目标平台,则默认启用证书透明度 (CT)。(在 Android 16 上,CT 可用,但应用必须选择启用。)
Safer Native DCL—C
如果您的应用以 Android 17(API 级别 37)或更高版本为目标平台,则 Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护功能现在也适用于原生库。
使用 System.load() 加载的所有原生文件都必须标记为只读。否则,系统会抛出 UnsatisfiedLinkError。
我们建议应用尽可能避免动态加载代码,因为这样做会大大增加应用因代码注入或代码篡改而遭到入侵的风险。
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
对于以 Android 17(API 级别 37)及更高版本为目标平台的应用,当在没有 READ_CONTACTS 权限的情况下访问 ContactsContract.Data 表时,联系人提供程序 2 (CP2) 会强制执行严格的 SQL 查询验证。
在此项更改生效后,如果应用没有 READ_CONTACTS 权限,则在查询 ContactsContract.Data 表时会设置 StrictColumns 和 StrictGrammar 选项。如果查询使用的模式与这些模式不兼容,则会被拒绝并导致抛出异常。
Medios
Android 17 incluye los siguientes cambios en el comportamiento de los medios.
Endurecimiento del audio en segundo plano
从 Android 17 开始,音频框架对后台音频互动(包括音频播放、音频焦点请求和音量更改 API)强制执行限制,以确保这些更改是由用户有意启动的。
部分音频限制适用于所有应用。不过,如果应用以 Android 17(API 级别 37)为目标平台,则限制会更加严格。如果这些应用在后台运行时与音频互动,则必须有前台服务正在运行。此外,应用还必须满足以下一项或两项要求:
- 前台服务必须具有仅在使用时授予的权限 (WIU)。
- 应用必须具有精确闹钟权限,并且正在与
USAGE_ALARM音频流互动。
如需了解详情(包括缓解措施),请参阅后台音频安全加固。
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)
我们在 Android 16 中引入了平台 API 变更,以 忽略屏幕方向、 宽高比和尺寸调整能力限制(针对大型屏幕,sw >= 600dp),适用于面向 API 级别 36 或更高级别的应用。开发者可以选择使用 SDK 36 退出这些变更,但对于面向 Android 17(API 级别 37)或更高级别的应用,此退出选项将不再可用。
如需了解详情,请参阅忽略屏幕方向和尺寸调整能力限制。
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 read() de BluetoothSocket para RFCOMM
For apps targeting Android 17 (API level 37), the
read() method of the InputStream obtained from an
RFCOMM-based BluetoothSocket now returns -1 when the
socket is closed or the connection is dropped.
This change makes RFCOMM socket behavior consistent with LE CoC sockets and
aligns with the standard InputStream.read()
documentation, which states that -1 is returned when the end of the stream is
reached.
Apps that rely solely on catching an IOException to break out of a read loop may
be impacted by this change and should update the BluetoothSocket read loops to
explicitly check for a return value of -1. This ensures the loop terminates
correctly when the remote device disconnects or the socket is closed. For an
example of the recommended implementation, see the
code snippet in the Transfer Bluetooth data
guide.