Mudanças de comportamento: apps destinados ao Android 17 ou versões mais recentes

Como nas versões anteriores, o Android 17 inclui mudanças de comportamento que podem afetar seu app. As mudanças de comportamento a seguir se aplicam exclusivamente a apps destinados ao Android 17 ou versões mais recentes. Se o app for 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 seu app.

Principal recurso

O Android 17 inclui as seguintes mudanças que modificam ou ampliam vários recursos principais do sistema Android.

Nova implementação sem bloqueio de MessageQueue

从 Android 17 开始,以 Android 17(API 级别 37) 或更高版本为目标平台的应用会收到 android.os.MessageQueue 的新无锁实现。新实现可提升性能并减少丢帧,但可能会破坏反映 MessageQueue 私有字段和方法的客户端。

如需了解详情(包括缓解措施),请参阅 MessageQueue 行为变更指南

Os campos finais estáticos não podem mais ser modificados

在以 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 no teclado físico do 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() 来识别修改的性质,并相应地调整其反馈策略。

Privacidade

O Android 17 inclui as seguintes mudanças para melhorar a privacidade do usuário.

ECH (Encrypted Client Hello) ativado

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")。

如需了解详情,请参阅加密客户端问候文档。

Permissão de rede local necessária para apps destinados ao Android 17

Android 17 introduces the ACCESS_LOCAL_NETWORK runtime permission to protect users from unauthorized local network access. Because this falls under the existing NEARBY_DEVICES permission group, users who have already granted other NEARBY_DEVICES permissions aren't prompted again. This new requirement prevents malicious apps from exploiting unrestricted local network access for covert user tracking and fingerprinting. By declaring and requesting this permission, your app can discover and connect to devices on the local area network (LAN), such as smart home devices or casting receivers.

Apps targeting Android 17 (API level 37) or higher now have two paths to maintain communication with LAN devices: Adopt system-mediated, privacy-preserving device pickers to skip the permission prompt, or explicitly request this new permission at runtime to maintain local network communication.

For more information, see the Local network permission documentation.

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 RetrieverSMS User Consent API,以确保功能持续可用。

Segurança

O Android 17 faz as seguintes melhorias na segurança de dispositivos e apps.

Segurança de atividade

No Android 17, a plataforma continua a transição para uma arquitetura "segura por padrão", introduzindo um conjunto de melhorias projetadas para mitigar exploits de alta gravidade, como phishing, sequestro de interação e ataques de vice-delegado. Essa atualização exige que os desenvolvedores ativem explicitamente os novos padrões de segurança para manter a compatibilidade do app e a proteção do usuário.

Os principais impactos para os desenvolvedores incluem:

  • Reforço da proteção do BAL e ativação aprimorada: estamos aprimorando as restrições de inicialização de atividades em segundo plano (BAL, na sigla em inglês) estendendo as proteções ao IntentSender. Os desenvolvedores precisam migrar da constante legada MODE_BACKGROUND_ACTIVITY_START_ALLOWED. Em vez disso, adote controles granulares, como MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, que restringe os inícios de atividades a cenários em que o app de chamada está visível, reduzindo significativamente a superfície de ataque.
  • Ferramentas de adoção:os desenvolvedores precisam usar o modo estrito e as verificações de lint atualizadas para identificar padrões legados e garantir a preparação para os requisitos futuros do SDK de destino.

Ativar a CT por padrão

如果应用以 Android 17(API 级别 37)或更高版本为目标平台,则默认启用证书透明度 (CT)。(在 Android 16 上,CT 可用,但应用必须选择启用。)

DCL nativa mais segura: C

Se o app for direcionado ao Android 17 (nível 37 da API) ou versões mais recentes, a proteção de carregamento dinâmico de código (DCL) mais seguro introduzida no Android 14 para arquivos DEX e JAR agora será estendida a bibliotecas nativas.

Todos os arquivos nativos carregados usando System.load() precisam ser marcados como somente leitura. Caso contrário, o sistema vai gerar UnsatisfiedLinkError.

Recomendamos que os apps evitem carregar código dinamicamente sempre que possível, porque isso aumenta muito o risco de comprometimento do app por injeção ou adulteração de código.

Restringir campos de PII na visualização de dados do CP2

对于以 Android 17(API 级别 Android 17(API 级别 37))及更高版本为目标平台的应用,联系人提供程序 2 (CP2) 会限制数据视图中包含某些个人身份信息 (PII) 的列。启用此变更后,这些列将从数据视图中移除,以增强用户隐私保护。 受限列包括:

如果应用正在使用 ContactsContract.Data 中的这些列,则可以通过与 RAW_CONTACT_ID 联接,改为从 ContactsContract.RawContacts 中提取这些列。

Aplicar verificações rigorosas de SQL no CP2

For apps targeting Android 17 (API level Android 17 (API level 37)) and higher, Contacts Provider 2 (CP2) enforces strict SQL query validation when the ContactsContract.Data table is accessed without READ_CONTACTS permission.

With this change, if an app doesn't have READ_CONTACTS permission, StrictColumns and StrictGrammar options are set when querying the ContactsContract.Data table. If a query uses a pattern that isn't compatible with these, it will be rejected and cause an exception to be thrown.

Mídia

O Android 17 inclui as seguintes mudanças no comportamento de 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 vários tamanhos de dispositivos e formatos.

Mudanças na API Platform para ignorar restrições de orientação, redimensionamento e proporção em telas grandes (sw>=600 dp)

Introduzimos mudanças na API Platform no Android 16 para ignorar restrições de orientação, proporção e redimensionamento em telas grandes (sw >= 600 dp) para apps destinados ao nível 36 da API ou mais recente. Os desenvolvedores têm a opção de desativar essas mudanças com o SDK 36, mas essa opção não estará mais disponível para apps destinados ao Android 17 (nível da API 37) ou mais recente.

Para mais informações, consulte Restrições de orientação e redimensionamento são ignoradas.

Conectividade

O Android 17 introduz a seguinte mudança para melhorar a consistência e alinhar com o comportamento padrão do Java InputStream para soquetes RFCOMM Bluetooth.

Comportamento consistente de BluetoothSocket read() 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.