Assim 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 para 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 impõe um limite de memória estrito (1,5 * largura da tela * altura da tela * 4) em relação ao uso da memória combinado de bitmaps e ícones presentes no pacote RemoteViews. Exceder esses limites gera um IllegalArgumentException fatal e falha no processo do app.
Para mais informações, consulte 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 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 a performance e reduz os frames perdidos, mas pode interromper 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 imutá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 no teclado físico do IME
This feature introduces new AccessibilityEvent and TextAttribute
APIs to enhance screen reader spoken feedback for CJKV language input. CJKV IME
apps can now signal whether a text conversion candidate has been selected during
text composition. Apps with edit fields can specify text change types when
sending text changed accessibility events.
For example, apps can specify that a text change occurred during text
composition, or that a text change resulted from a commit.
Doing this enables accessibility
services such as screen readers to deliver more precise feedback based on the
nature of the text modification.
App adoption
IME Apps: When setting composing text in edit fields, IMEs can use
TextAttribute.Builder.setTextSuggestionSelected()to indicate whether a specific conversion candidate was selected.Apps with Edit Fields: Apps that maintain a custom
InputConnectioncan retrieve candidate selection data by callingTextAttribute.isTextSuggestionSelected(). These apps should then callAccessibilityEvent.setTextChangeTypes()when dispatchingTYPE_VIEW_TEXT_CHANGEDevents. Apps targeting Android 17 (API level 37) that use the standardTextViewwill have this feature enabled by default. (That is,TextViewwill handle retrieving data from the IME and setting text change types when sending events to accessibility services).Accessibility Services: Accessibility services that process
TYPE_VIEW_TEXT_CHANGEDevents can callAccessibilityEvent.getTextChangeTypes()to identify the nature of the modification and adjust their feedback strategies accordingly.
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 obrigatória para apps destinados ao 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
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
Beginning with Android 17, Android is extending its SMS OTP protection
to apply to standard SMS messages (SMS messages containing an OTP that do not
use the WebOTP or SMS Retriever formats). For most apps targeting
Android 17 (API level 37) or higher, these SMS messages do not become
available until three hours after receipt. This delay is intended to help
prevent OTP hijacking. During this three hour delay, the
SMS_RECEIVED_ACTION broadcast is withheld and
SMS provider database queries are filtered. The SMS message is
available to these apps after the delay.
Certain apps such as the default SMS assistant app, connected device companion apps, etc., are exempted from this delay. All apps that rely on reading SMS messages for OTP extraction should transition to using SMS Retriever or SMS User Consent APIs to ensure continued functionality.
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
For apps targeting Android 17 (API level 37) and higher, Contacts Provider 2 (CP2) restricts certain columns containing Personally Identifiable Information (PII) from the data view. When this change is enabled, these columns are removed from the data view to enhance user privacy. The restricted columns include:
Apps that are using these columns from ContactsContract.Data
can extract them from ContactsContract.RawContacts
instead, by joining with 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 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.
Descontinuação 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 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, redimensionamento e proporção em telas grandes (sw >= 600 dp) para apps destinados ao nível desejado da API 36 ou mais recente. Os desenvolvedores podem 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 versões mais recentes.
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 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.