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 de comportamiento que afectan a todas las apps
que se ejecutan en Android 17, independientemente de targetSdkVersion de tu app.
Experiencia del usuario y la IU del sistema
Android 17 incluye los siguientes cambios que tienen como objetivo crear una experiencia del usuario más coherente e intuitiva.
Widget de límite de memoria
A partir de Android 17, para las apps orientadas a Android 17 (nivel de API 37) o versiones posteriores, el sistema aplica un límite de memoria estricto (1.5 * ancho de pantalla * alto de pantalla * 4) en el uso combinado de memoria de los mapas de bits y los íconos presentes en el paquete RemoteViews. Si superas estos límites, se arroja una IllegalArgumentException fatal y se bloquea el proceso de la app.
Para obtener más información, consulta UpdateAppWidget.
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
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 realiza los siguientes cambios para mejorar la accesibilidad.
Compatibilidad de accesibilidad con la escritura compleja del teclado físico del IME
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 orientadas a 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.
Ocultar contraseñas de 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.
Protección de OTP para mensajes SMS estándar
从 Android 17 开始,Android 将扩展其短信验证码保护功能,以适用于标准短信(包含验证码但不使用 WebOTP 或 SMS Retriever 格式的短信)。对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,这些短信在收到后三小时内不会提供。此延迟旨在帮助防止动态密码劫持。在这三小时的延迟期间,系统会保留
SMS_RECEIVED_ACTION广播,并过滤
短信提供商数据库查询。延迟结束后,这些应用即可使用短信。
某些应用(例如默认短信助理应用、已连接的设备配套应用等)不受此延迟限制。所有依赖于读取短信 来提取动态密码的应用都应改用 SMS Retriever 或 SMS User Consent API,以确保功能持续可用。
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
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.
Restringir los campos de IIP 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 选项。如果查询使用的模式与这些模式不兼容,则会被拒绝并导致抛出异常。
Inteligencia
Android 17 incluye los siguientes cambios en la inteligencia del sistema.
Baja de setContentCaptureEnabled
La captura de contenido está habilitada de forma predeterminada en ciertos dispositivos para permitir que las funciones de IA integradas en el dispositivo analicen el contenido de la pantalla para brindar experiencias inteligentes.
A partir de Android 17, el
ContentCaptureManager.setContentCaptureEnabled(boolean)
método de la API dejó de estar disponible. En el caso de las apps orientadas a Android 17 (nivel de API 37) o versiones posteriores, llamar a setContentCaptureEnabled(false) ya no inhabilita la captura de contenido.
Si tu app necesita seguir inhabilitando la captura de contenido o restringir que el sistema capture el contenido de la pantalla, debes hacer la transición para usar el parámetro de diseño de ventana
FLAG_SECURE.
Para inhabilitar la captura de contenido, establece la marca FLAG_SECURE en tu ventana, como se muestra en el siguiente ejemplo:
Kotlin
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
Java
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
);
Para obtener más detalles, consulta la
WindowManager.LayoutParams.FLAG_SECURE documentación
de referencia.
Medios
Android 17 incluye los siguientes cambios en el comportamiento de los medios.
Protección de 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>=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 presenta 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.