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 destinado 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.
Experiência do usuário e interface do sistema
O Android 17 inclui as seguintes mudanças para criar uma experiência do usuário mais consistente e intuitiva.
Widget de limite de memória
Beginning with Android 17, for apps targeting
Android 17 (API level 37) or higher, the system enforces a strict memory
limit (1.5 * screen width * screen height * 4) against the combined memory usage
of both Bitmaps and Icons present in the RemoteViews parcel. Exceeding these
limits throws a fatal IllegalArgumentException and crashes the app's process.
For more information, see UpdateAppWidget.
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
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 não podem mais 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 no teclado físico do IME
Esse recurso introduz novas APIs AccessibilityEvent e TextAttribute
para melhorar o feedback falado do leitor de tela para entrada de texto em idiomas CJKV. Os apps de IME CJKV
agora podem sinalizar se um candidato à 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
de texto ou que uma mudança de texto resultou de um commit.
Isso permite que serviços de acessibilidade, como leitores de tela, ofereçam feedback mais preciso com base na natureza da modificação do 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 a conversão específico foi selecionado.Apps com "Editar campos":os apps que mantêm um
InputConnectionpersonalizado podem recuperar dados de seleção de candidatos chamandoTextAttribute.isTextSuggestionSelected(). Esses apps precisam chamarAccessibilityEvent.setTextChangeTypes()ao despachar 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,TextViewvai 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
O Android 17 introduz 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 ECH 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 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 segmentados para o Android 17
O Android 17 apresenta a permissão de execução ACCESS_LOCAL_NETWORK
para proteger os usuários contra acesso não autorizado à rede local. Como isso se enquadra no grupo de permissões NEARBY_DEVICES atual, os usuários que já concederam outras permissões NEARBY_DEVICES não vão receber outra solicitação. 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 ocultos. 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 versões mais recentes agora têm dois caminhos para manter a comunicação com dispositivos de LAN: adotar seletores de dispositivos mediados pelo sistema que preservam a privacidade para pular a solicitação de permissão ou pedir explicitamente essa nova permissão durante a execução para manter a comunicação de rede local.
Para mais informações, consulte a documentação sobre permissão de rede local.
Ocultar senhas de dispositivos físicos
If an app targets Android 17 (API level 37) or higher and the user is using
a physical input device (for example, an external keyboard), the Android
operating system applies the new show_passwords_physical setting to all
characters in the password field. By default, that setting hides all password
characters.
The Android system shows the last-typed password character to help the user see if they mistyped the password. However, this is much less necessary with larger external keyboards. In addition, devices with external keyboards often have larger displays, which increases the danger of someone seeing the typed password.
If the user is using the device's touchscreen, the system applies the new
show_passwords_touch setting.
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 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 confusão de representantes. 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 melhoria da ativação:estamos aprimorando as restrições de inicialização de atividades em segundo plano (BAL, na sigla em inglês) ao estender as proteções para
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 as iniciações 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 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
If an app targets Android 17 (API level 37) or higher, certificate transparency (CT) is enabled by default. (On Android 16, CT is available but apps had to opt in.)
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
Para apps direcionados ao Android 17 (nível da API 37) 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
ao fazer a junção com RAW_CONTACT_ID.
Aplicar verificações rigorosas de SQL 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 estrita 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
Content Capture is enabled by default on certain devices to allow on-device AI features to analyze screen contents for intelligent experiences.
Starting in Android 17, the
ContentCaptureManager.setContentCaptureEnabled(boolean)
API method is deprecated. For apps that target Android 17 (API level 37) or
higher, calling setContentCaptureEnabled(false) no longer disables Content
Capture.
If your app needs to continue disabling Content Capture or restrict screen
contents from being captured by the system, you must transition to using the
FLAG_SECURE window layout parameter.
To disable Content Capture, set the FLAG_SECURE flag on your window as shown
in the following example:
Kotlin
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
Java
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
);
For more details, see the
WindowManager.LayoutParams.FLAG_SECURE reference
documentation.
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 uma variedade de 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 desativação não estará mais disponível para apps destinados ao Android 17 (nível 37 da API) 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.