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.
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 não podem ser modificados
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
InputConnectionpersonalizado podem recuperar dados de seleção de candidatos chamandoTextAttribute.isTextSuggestionSelected(). Esses apps precisam chamarAccessibilityEvent.setTextChangeTypes()ao enviar eventosTYPE_VIEW_TEXT_CHANGED. Os apps destinados ao Android 17 (nível 37 da API) que usam oTextViewpadrão terão esse recurso ativado por padrão. Ou seja, oTextViewvai 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_CHANGEDpodem chamarAccessibilityEvent.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 de forma oportunista
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 recente, o ECH é usado de forma oportunista 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 ao ECH e o servidor remoto também seja compatível com o protocolo. Se não for possível negociar o ECH, a conexão vai voltar automaticamente para um handshake TLS padrão sem criptografia SNI.
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, "opportunistic", "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
O Android 17 apresenta a ACCESS_LOCAL_NETWORK permissão de execução
para proteger os usuários contra acesso não autorizado à rede local. Como ela se enquadra no grupo de permissões NEARBY_DEVICES, os usuários que já concederam outras permissões NEARBY_DEVICES não recebem a solicitação novamente. Esse novo requisito impede que apps mal-intencionados explorem o acesso irrestrito à rede local para rastreamento de usuários e técnicas de impressão digital. Ao declarar e solicitar essa permissão, seu app pode descobrir e se conectar a dispositivos na rede local (LAN), como dispositivos de casa inteligente ou receptores de transmissão.
Os apps direcionados ao Android 17 (nível 37 da API) ou mais recente agora têm dois caminhos para manter a comunicação com dispositivos LAN: adotar seletores de dispositivos mediados pelo sistema e que preservam a privacidade para ignorar a solicitação de permissão ou solicitar explicitamente essa nova permissão no tempo de execução para manter a comunicação da rede local.
Para mais informações, consulte a documentação da permissão de rede local.
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.
Segurança
O Android 17 faz as seguintes melhorias na segurança de dispositivos e apps.
Segurança de atividades
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 legadaMODE_BACKGROUND_ACTIVITY_START_ALLOWED. Em vez disso, adote controles granulares, comoMODE_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 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.
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 BluetoothSocket read() 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.