Como nas versões anteriores, o Android 17 inclui mudanças de comportamento que podem afetar seu app. As mudanças de comportamento abaixo se aplicam exclusivamente a apps destinados ao Android 17 ou versões mais recentes. Caso seu app seja direcionado ao Android 17 ou a versões mais recentes, faça modificações para oferecer suporte a esses comportamentos, quando aplicável.
Consulte também a lista de mudanças de comportamento que afetam todos os apps
executados no Android 17, independente da targetSdkVersion do app.
Experiência do usuário e interface do sistema
O Android 17 inclui as seguintes mudanças que visam criar uma experiência do usuário mais consistente e intuitiva.
Widget de limite de memória
从 Android 17 开始,对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,系统会对 RemoteViews
软件包中存在的位图和图标的组合内存使用量强制执行严格的内存限制 (1.5 * 屏幕宽度 * 屏幕高度 * 4)。超出这些限制会抛出致命的
IllegalArgumentException 并导致应用进程崩溃。
如需了解详情,请参阅 UpdateAppWidget。
Funcionalidade principal
O Android 17 inclui as seguintes mudanças que modificam ou expandem vários recursos principais do sistema Android.
Nova implementação sem bloqueio do MessageQueue
从 Android 17 开始,以 Android 17(API 级别 37)
或更高版本为目标平台的应用会收到
android.os.MessageQueue 的新无锁实现。新实现可提升性能并减少丢帧,但可能会破坏反映 MessageQueue 私有字段和方法的客户端。
如需了解详情(包括缓解措施),请参阅 MessageQueue 行为变更指南。
Os campos finais estáticos agora são imodificáveis
在以 Android 17(API 级别 37)或更高版本为目标平台的 Android 17 或更高版本上运行的应用无法更改 static final 字段。如果应用尝试使用反射更改 static final 字段,则会导致 IllegalAccessException。尝试通过 JNI API(例如 SetStaticLongField())修改其中一个字段会导致应用崩溃。
Acessibilidade
O Android 17 faz as seguintes mudanças para melhorar a acessibilidade.
Suporte de acessibilidade para digitação complexa de teclado físico IME
此功能引入了新的 AccessibilityEvent 和 TextAttribute 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()来识别修改的性质,并相应地调整其反馈策略。
Privacidade
O Android 17 inclui as seguintes mudanças para melhorar a privacidade do usuário.
ECH (Encrypted Client Hello) ativado
O Android 17 apresenta suporte da plataforma para o Encrypted Client Hello (ECH), uma extensão do TLS que aumenta a privacidade do usuário criptografando a indicação de nome do servidor (SNI) no handshake de TLS. Essa criptografia ajuda a impedir que observadores da rede identifiquem facilmente o domínio específico a que seu app está se conectando.
Para apps direcionados ao Android 17 (nível 37 da API) ou mais recentes, o ECH é usado para conexões TLS. O ECH só fica ativo se a biblioteca de rede usada pelo app (por exemplo, HttpEngine, WebView ou OkHttp) tiver suporte integrado para ECH e o servidor remoto também for compatível com o protocolo ECH. Se não for possível negociar o ECH, o cliente enviará uma extensão com conteúdo aleatório (um mecanismo chamado ECH GREASE). Consulte a RFC 9849 para mais detalhes sobre como o ECH GREASE funciona.
Para permitir que os apps personalizem esse comportamento, o Android 17 adiciona um novo
elemento <domainEncryption> ao arquivo de configuração de segurança de rede.
Os desenvolvedores podem usar <domainEncryption> nas tags <base-config> ou <domain-config> para selecionar um modo de ECH (por exemplo, "enabled" ou "disabled") de forma global ou por domínio.
Para mais informações, consulte a documentação do Encrypted Client Hello (em inglês).
Permissão de rede local necessária para apps destinados ao Android 17
Android 17 引入了 ACCESS_LOCAL_NETWORK 运行时权限,以保护用户免遭未经授权的本地网络访问。由于此权限属于现有的 NEARBY_DEVICES 权限组,因此系统不会再次提示已授予其他 NEARBY_DEVICES 权限的用户。这项新要求可防止恶意应用利用不受限制的本地网络访问权限进行隐秘的用户跟踪和指纹识别。通过声明和请求此权限,您的应用可以发现并连接到局域网 (LAN) 中的设备,例如智能家居设备或投屏接收器。
以 Android 17(API 级别 37)或更高版本为目标平台的应用现在可以通过两种方式与 LAN 设备保持通信:采用系统介导的、可保护隐私的设备选择器来跳过权限提示,或者在运行时明确请求此新权限以保持本地网络通信。
如需了解详情,请参阅本地网络权限文档。
Ocultar senhas de dispositivos físicos
如果应用以 Android 17(API 级别 37)或更高版本为目标平台,并且用户使用的是实体输入设备(例如外接键盘),Android
操作系统会对密码字段中的所有字符应用新的 show_passwords_physical 设置。默认情况下,该设置会隐藏所有密码字符。
Android 系统会显示用户最后输入的密码字符,以帮助用户查看是否输错了密码。不过,对于较大的外接键盘,此功能就没那么必要了。此外,配备外接键盘的设备通常具有较大的显示屏,这会增加他人看到输入密码的风险。
如果用户使用的是设备触摸屏,系统会应用新的 show_passwords_touch 设置。
Proteção de OTP para mensagens SMS padrão
从 Android 17 开始,Android 将扩展其短信验证码保护功能,以适用于标准短信(包含验证码但不使用 WebOTP 或 SMS Retriever 格式的短信)。对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,这些短信在收到后三小时内不会提供。此延迟旨在帮助防止动态密码劫持。在这三小时的延迟期间,系统会保留
SMS_RECEIVED_ACTION广播,并过滤
短信提供商数据库查询。延迟结束后,这些应用即可使用短信。
某些应用(例如默认短信助理应用、已连接的设备配套应用等)不受此延迟限制。所有依赖于读取短信 来提取动态密码的应用都应改用 SMS Retriever 或 SMS User Consent API,以确保功能持续可用。
Segurança
O Android 17 faz as seguintes melhorias na segurança de dispositivos e apps.
Segurança de atividades
在 Android 17 中,平台继续向“默认安全”架构转变,引入了一系列旨在缓解网络钓鱼、互动劫持和混淆代理攻击等高严重性漏洞的增强功能。此更新要求开发者明确选择启用新的安全标准,以保持应用兼容性和用户保护。
对开发者的主要影响包括:
- BAL 安全加固和改进的选择启用: 我们正在优化后台活动启动 (BAL) 限制,方法是将保护范围扩展到
IntentSender。开发者必须从旧版MODE_BACKGROUND_ACTIVITY_START_ALLOWED常量迁移。相反,您应 采用精细控制,例如MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,它将 活动启动限制为调用应用可见的场景,从而显著 缩小攻击面。 - 采用工具: 开发者应利用严格模式和更新后的 lint 检查来识别旧版模式,并确保为未来的目标 SDK 要求做好准备。
Ativar CT por padrão
如果应用以 Android 17(API 级别 37)或更高版本为目标平台,则默认启用证书透明度 (CT)。(在 Android 16 上,CT 可用,但应用必须选择启用。)
DCL nativo mais seguro: C
如果您的应用以 Android 17(API 级别 37)或更高版本为目标平台,则 Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护功能现在也适用于原生库。
使用 System.load() 加载的所有原生文件都必须标记为只读。否则,系统会抛出 UnsatisfiedLinkError。
我们建议应用尽可能避免动态加载代码,因为这样做会大大增加应用因代码注入或代码篡改而遭到入侵的风险。
Restringir campos de PII na visualização de dados CP2
对于以 Android 17(API 级别 Android 17(API 级别 37))及更高版本为目标平台的应用,联系人提供程序 2 (CP2) 会限制数据视图中包含某些个人身份信息 (PII) 的列。启用此变更后,这些列将从数据视图中移除,以增强用户隐私保护。 受限列包括:
如果应用正在使用 ContactsContract.Data
中的这些列,则可以通过与 RAW_CONTACT_ID 联接,改为从 ContactsContract.RawContacts
中提取这些列。
Aplicar verificações SQL rigorosas no CP2
对于以 Android 17(API 级别 37)及更高版本为目标平台的应用,当在没有 READ_CONTACTS 权限的情况下访问 ContactsContract.Data 表时,联系人提供程序 2 (CP2) 会强制执行严格的 SQL 查询验证。
在此项更改生效后,如果应用没有 READ_CONTACTS 权限,则在查询 ContactsContract.Data 表时会设置 StrictColumns 和 StrictGrammar 选项。如果查询使用的模式与这些模式不兼容,则会被拒绝并导致抛出异常。
Inteligência
O Android 17 inclui as seguintes mudanças na inteligência do sistema.
Suspensão de uso de setContentCaptureEnabled
A captura de conteúdo é ativada por padrão em alguns dispositivos para permitir que os recursos de IA no dispositivo analisem o conteúdo da tela para experiências inteligentes.
A partir do Android 17, o
ContentCaptureManager.setContentCaptureEnabled(boolean)
método de API foi descontinuado. Para apps direcionados ao Android 17 (nível 37 da API) ou mais recentes, chamar setContentCaptureEnabled(false) não desativa mais a captura de conteúdo.
Se o app precisar continuar desativando a captura de conteúdo ou restringir a captura do conteúdo da tela pelo sistema, faça a transição para o uso do parâmetro de layout da janela FLAG_SECURE.
Para desativar a captura de conteúdo, defina a flag FLAG_SECURE na janela, conforme mostrado no exemplo a seguir:
Kotlin
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
Java
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
);
Para mais detalhes, consulte a
WindowManager.LayoutParams.FLAG_SECURE documentação
de referência.
Mídia
O Android 17 inclui as seguintes mudanças no comportamento da mídia.
Reforço da proteção de áudio em segundo plano
A partir do Android 17, o framework de áudio impõe restrições às interações de áudio em segundo plano, incluindo reprodução de áudio, solicitações de foco de áudio e APIs de mudança de volume, para garantir que essas mudanças sejam iniciadas intencionalmente pelo usuário.
Algumas restrições de áudio se aplicam a todos os apps. No entanto, as restrições são mais rigorosas se um app for destinado ao Android 17 (nível da API 37). Se um desses apps interagir com áudio enquanto estiver em segundo plano, ele precisará ter um serviço em primeiro plano em execução. Além disso, o app precisa atender a um ou ambos os requisitos a seguir:
- O serviço em primeiro plano precisa ter recursos de uso durante o uso (WIU, na sigla em inglês).
- O app precisa ter a permissão de alarme exato e estar interagindo com fluxos de áudio
USAGE_ALARM.
Para mais informações, incluindo estratégias de mitigação, consulte Reforço da proteção de áudio em segundo plano.
Formatos de dispositivos
O Android 17 inclui as seguintes mudanças para melhorar a experiência do usuário em uma variedade de tamanhos e formatos de dispositivos.
Mudanças na API Platform para ignorar restrições de orientação, redimensionamento e proporção em telas grandes (sw>=600 dp)
我们在 Android 16 中引入了平台 API 变更,以 忽略屏幕方向、 宽高比和尺寸调整能力限制(针对大型屏幕,sw >= 600dp),适用于面向 API 级别 36 或更高级别的应用。开发者可以选择使用 SDK 36 退出这些变更,但对于面向 Android 17(API 级别 37)或更高级别的应用,此退出选项将不再可用。
如需了解详情,请参阅忽略屏幕方向和尺寸调整能力限制。
Conectividade
O Android 17 apresenta a seguinte mudança para melhorar a consistência e se alinhar ao comportamento padrão do InputStream Java para soquetes RFCOMM Bluetooth.
Comportamento consistente de read() do BluetoothSocket para RFCOMM
Para apps direcionados ao Android 17 (nível da API 37), o
read() método do InputStream recebido de um
BluetoothSocket baseado em RFCOMM agora retorna -1 quando o
soquete é fechado ou a conexão é interrompida.
Essa mudança torna o comportamento do soquete RFCOMM consistente com os soquetes LE CoC e
está alinhada com a documentação padrão InputStream.read(), que afirma que -1 é retornado quando o fim do fluxo é
atingido.
Os apps que dependem apenas da captura de uma IOException para sair de uma repetição de leitura podem ser afetados por essa mudança e precisam atualizar as repetições de leitura do BluetoothSocket para verificar explicitamente um valor de retorno de -1. Isso garante que o loop seja encerrado corretamente quando o dispositivo remoto se desconectar ou o soquete for fechado. Para um
exemplo da implementação recomendada, consulte o
snippet de código no guia Transferir dados Bluetooth.