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 orientadas a 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 targetSdkVersion de la 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 no se pueden modificar

在以 Android 17(API 级别 37)或更高版本为目标平台的 Android 17 或更高版本上运行的应用无法更改 static final 字段。如果应用尝试使用反射更改 static final 字段,则会导致 IllegalAccessException。尝试通过 JNI API(例如 SetStaticLongField())修改其中一个字段会导致应用崩溃。

Accesibilidad

Android 17 realiza los siguientes cambios para mejorar la accesibilidad.

Compatibilidad de accesibilidad para la escritura compleja del teclado físico del IME

此功能引入了新的 AccessibilityEventTextAttribute API,以增强屏幕阅读器针对 CJKV 语言输入的语音反馈。CJKV IME 应用现在可以指示在文本撰写期间是否已选择文本转换候选内容。具有编辑字段的应用可以在发送文本更改无障碍事件时指定文本更改类型。例如,应用可以指定在文本撰写期间发生了文本更改,或者文本更改是由提交导致的。这样做可让屏幕阅读器等无障碍服务根据文本修改的性质提供更精确的反馈。

应用采用量

  • IME 应用:在编辑字段中设置正在撰写的文本时,IME 可以使用 TextAttribute.Builder.setTextSuggestionSelected() 来指明是否选择了特定的转换候选对象。

  • 具有“编辑字段”权限的应用:维护自定义 InputConnection 的应用可以通过调用 TextAttribute.isTextSuggestionSelected() 来检索候选选择数据。然后,这些应用在调度 TYPE_VIEW_TEXT_CHANGED 事件时应调用 AccessibilityEvent.setTextChangeTypes()。如果应用以 Android 17(API 级别 37)为目标平台,并使用标准 TextView,则默认启用此功能。(也就是说,TextView 将负责从 IME 检索数据,并在向无障碍服务发送事件时设置文本更改类型)。

  • 无障碍服务:处理 TYPE_VIEW_TEXT_CHANGED 事件的无障碍服务可以调用 AccessibilityEvent.getTextChangeTypes() 来识别修改的性质,并相应地调整其反馈策略。

Privacidad

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

ECH (Encrypted Client Hello) habilitado

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 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 el ECH y el servidor remoto también admite el protocolo ECH. Si no se puede negociar ECH, el cliente envía una extensión de ECH con contenido aleatorio (un mecanismo llamado ECH GREASE). Consulta RFC 9849 para obtener más detalles sobre cómo funciona ECH GREASE.

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, "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 orientadas a Android 17

Android 17 引入了 ACCESS_LOCAL_NETWORK 运行时权限,以保护用户免遭未经授权的本地网络访问。由于此权限属于现有的 NEARBY_DEVICES 权限组,因此系统不会再次提示已授予其他 NEARBY_DEVICES 权限的用户。这项新要求可防止恶意应用利用不受限制的本地网络访问权限进行隐秘的用户跟踪和指纹识别。通过声明和请求此权限,您的应用可以发现并连接到局域网 (LAN) 中的设备,例如智能家居设备或投屏接收器。

以 Android 17(API 级别 37)或更高版本为目标平台的应用现在可以通过两种方式与 LAN 设备保持通信:采用系统介导的、可保护隐私的设备选择器来跳过权限提示,或者在运行时明确请求此新权限以保持本地网络通信。

如需了解详情,请参阅本地网络权限文档。

Ocultar contraseñas de 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 realiza las siguientes mejoras en la seguridad de los dispositivos y las apps.

Seguridad de la actividad

在 Android 17 中,平台继续向“默认安全”架构转变,引入了一系列旨在缓解网络钓鱼、互动劫持和混淆代理攻击等高严重性漏洞的增强功能。此更新要求开发者明确选择启用新的安全标准,以保持应用兼容性和用户保护。

对开发者的主要影响包括:

  • BAL 安全加固和改进的选择启用: 我们正在优化后台活动启动 (BAL) 限制,方法是将保护范围扩展到 IntentSender。开发者必须从旧版 MODE_BACKGROUND_ACTIVITY_START_ALLOWED 常量迁移。相反,您应 采用精细控制,例如 MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,它将 活动启动限制为调用应用可见的场景,从而显著 缩小攻击面。
  • 采用工具: 开发者应利用严格模式和更新后的 lint 检查来识别旧版模式,并确保为未来的目标 SDK 要求做好准备。

Habilitar 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-C nativo más seguro

如果您的应用以 Android 17(API 级别 37)或更高版本为目标平台,则 Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护功能现在也适用于原生库。

使用 System.load() 加载的所有原生文件都必须标记为只读。否则,系统会抛出 UnsatisfiedLinkError

我们建议应用尽可能避免动态加载代码,因为这样做会大大增加应用因代码注入或代码篡改而遭到入侵的风险。

Restringir 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 表时会设置 StrictColumnsStrictGrammar 选项。如果查询使用的模式与这些模式不兼容,则会被拒绝并导致抛出异常。

Medios

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

Protección de 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>=600dp)

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

对于以 Android 17(API 级别 37)为目标平台的应用, read() 方法从InputStream 获取的 基于 RFCOMM 的 BluetoothSocket 现在会在 套接字关闭或连接断开时返回 -1

此更改使 RFCOMM 套接字行为与 LE CoC 套接字保持一致,并与标准 InputStream.read() 文档保持一致,该文档指出,当到达流的末尾时,系统会返回 -1

仅依赖于捕获 IOException 以跳出读取循环的应用可能会受到此更改的影响,并且应更新 BluetoothSocket 读取循环以明确检查返回值 -1。这可确保在远程设备断开连接或套接字关闭时,循环正确终止。如需查看推荐的实现示例,请参阅传输蓝牙数据指南中的代码段。