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 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

A partir do Android 17, para apps destinados ao Android 17 (nível da API 37) ou mais recente, o sistema aplica um limite de memória estrito (1,5 * largura da tela * altura da tela * 4) ao uso da memória combinado de bitmaps e ícones presentes no pacote RemoteViews. Exceder esses limites gera uma IllegalArgumentException fatal e trava o processo do app.

Para mais informações, consulte 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

A partir do Android 17, os apps destinados ao Android 17 (nível 37 da API) ou mais recente recebem uma nova implementação sem bloqueio de android.os.MessageQueue. A nova implementação melhora o desempenho e reduz os frames perdidos, mas pode causar falhas em clientes que refletem em campos e métodos particulares de MessageQueue.

Para mais informações, incluindo estratégias de mitigação, consulte Orientação sobre a mudança de comportamento do MessageQueue.

Os campos finais estáticos agora são imodificáveis

Os apps executados no Android 17 ou mais recente que segmentam o Android 17 (nível 37 da API) ou mais recente não podem mudar os campos static final. Se um app tentar mudar um campo static final usando reflexão, isso vai causar um IllegalAccessException. Tentar modificar um desses campos usando APIs JNI (como SetStaticLongField()) vai causar falha no app.

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

Esse recurso apresenta novas AccessibilityEvent e TextAttribute APIs para melhorar o feedback falado do leitor de tela para entrada de idiomas CJKV. Os apps de IME CJKV agora podem sinalizar se um candidato de conversão de texto foi selecionado durante a composição de texto. Os apps com campos de edição podem especificar tipos de mudança de texto ao enviar eventos de acessibilidade de texto alterado. Por exemplo, os apps podem especificar que uma mudança de texto ocorreu durante a composição do texto ou que uma mudança de texto resultou de um commit. Isso permite que os serviços de acessibilidade, como leitores de tela, ofereçam feedback mais preciso com base na natureza da modificação de texto.

Adoção de apps

  • Apps de IME:ao definir a composição de texto em campos de edição, os IMEs podem usar TextAttribute.Builder.setTextSuggestionSelected() para indicar se um candidato de conversão específico foi selecionado.

  • Apps com campos de edição:os apps que mantêm um InputConnection personalizado podem recuperar dados de seleção de candidatos chamando TextAttribute.isTextSuggestionSelected(). Esses apps precisam chamar AccessibilityEvent.setTextChangeTypes() ao enviar eventos TYPE_VIEW_TEXT_CHANGED. Os apps destinados ao Android 17 (nível 37 da API) que usam o TextView padrão terão esse recurso ativado por padrão. Ou seja, o TextView vai processar a recuperação de dados do IME e definir tipos de mudança de texto ao enviar eventos para serviços de acessibilidade.

  • Serviços de acessibilidade:os serviços de acessibilidade que processam eventos TYPE_VIEW_TEXT_CHANGED podem chamar AccessibilityEvent.getTextChangeTypes() para identificar a natureza da modificação e ajustar as estratégias de feedback de acordo.

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

Se um app for direcionado ao Android 17 (nível 37 da API) ou versões mais recentes e o usuário estiver usando um dispositivo de entrada físico (por exemplo, um teclado externo), o sistema operacional Android vai aplicar a nova configuração show_passwords_physical a todos os caracteres no campo de senha. Por padrão, essa configuração oculta todos os caracteres da senha.

O sistema Android mostra o último caractere digitado para ajudar o usuário a verificar se ele digitou a senha errada. No entanto, isso é muito menos necessário com teclados externos maiores. Além disso, dispositivos com teclados externos geralmente têm telas maiores, o que aumenta o risco de alguém ver a senha digitada.

Se o usuário estiver usando a tela sensível ao toque do dispositivo, o sistema vai aplicar a nova configuração de show_passwords_touch.

Proteção de OTP para mensagens SMS padrão

A partir do Android 17, o Android vai estender a proteção de OTP por SMS para mensagens SMS padrão (mensagens SMS que contêm um OTP e não usam os formatos WebOTP ou SMS Retriever). Para a maioria dos apps destinados ao Android 17 (nível 37 da API) ou versões mais recentes, essas mensagens SMS não ficam disponíveis até três horas após o recebimento. Esse atraso ajuda a evitar o sequestro de OTPs. Durante esse atraso de três horas, a transmissão SMS_RECEIVED_ACTION é retida e as consultas de banco de dados do provedor de SMS são filtradas. A mensagem SMS fica disponível para esses apps após o atraso.

Alguns apps, como o assistente de SMS padrão, apps complementares de dispositivos conectados etc., são isentos desse atraso. Todos os apps que dependem da leitura de mensagens SMS para extração de senhas únicas precisam migrar para o uso das APIs SMS Retriever ou Consentimento do usuário de SMS para garantir a continuidade da funcionalidade.

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

Se um app for destinado ao Android 17 (nível 37 da API) ou mais recente, a transparência de certificados (CT, na sigla em inglês) será ativada por padrão. No Android 16, a CT está disponível, mas os apps precisam ativar o recurso.

DCL nativo mais seguro: 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 CP2

Para apps destinados ao Android 17 (nível 37 da API) e versões mais recentes, o provedor de contatos 2 (CP2) restringe determinadas colunas que contêm informações de identificação pessoal (PII) da visualização de dados. Quando essa mudança é ativada, essas colunas são removidas da visualização de dados para melhorar a privacidade do usuário. As colunas restritas incluem:

Os apps que usam essas colunas de ContactsContract.Data podem extraí-las de ContactsContract.RawContacts em vez disso, fazendo a junção com RAW_CONTACT_ID.

Aplicar verificações SQL rigorosas no CP2

Em apps destinados ao Android 17 (nível 37 da API) e versões mais recentes, o provedor de contatos 2 (CP2) aplica uma validação rigorosa de consultas SQL quando a tabela ContactsContract.Data é acessada sem a permissão READ_CONTACTS.

Com essa mudança, se um app não tiver a permissão READ_CONTACTS, as opções StrictColumns e StrictGrammar serão definidas ao consultar a tabela ContactsContract.Data. Se uma consulta usar um padrão incompatível com esses, ela será rejeitada e vai gerar uma exceção.

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)

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 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.