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 mudanças a seguir, que têm como objetivo 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 versões mais recentes, 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 um IllegalArgumentException fatal e causa uma falha no processo do app.

Para mais informações, consulte UpdateAppWidget.

Principal recurso

O Android 17 inclui as mudanças abaixo, 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 as orientações sobre mudanças de comportamento da MessageQueue.

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

Os apps executados no Android 17 ou versões mais recentes que segmentam o Android 17 (nível 37 da API) ou versões mais recentes 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. A tentativa de modificar um desses campos com APIs JNI (como SetStaticLongField()) vai causar uma falha no app.

Acessibilidade

O Android 17 faz as mudanças abaixo para melhorar a acessibilidade.

Suporte de acessibilidade para digitação complexa em teclado físico com IME

Esse recurso apresenta novas APIs AccessibilityEvent e TextAttribute para melhorar a resposta falada do leitor de tela para entrada de idiomas CJKV. Os apps de IME CJKV agora podem sinalizar se um candidato à conversão de texto foi selecionado durante a composição do texto. Os apps com campos de edição podem especificar tipos de mudança de texto ao enviar eventos de acessibilidade de mudança de texto. 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 uma confirmação. Isso permite que serviços de acessibilidade, como leitores de tela, forneçam feedback mais preciso com base na natureza da modificação do texto.

Adoção de apps

  • Apps de IME:ao definir o texto de composição 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: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 os 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 mudanças abaixo 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 melhora a privacidade do usuário criptografando a indicação de nome do servidor (SNI, na sigla em inglês) no handshake de TLS. Essa criptografia ajuda a impedir que observadores de rede identifiquem facilmente o domínio específico ao qual o 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 ao ECH e o servidor remoto também for compatível com o protocolo ECH. Se o ECH não puder ser negociado, o cliente vai enviar uma extensão de ECH com conteúdo aleatório (um mecanismo chamado ECH GREASE). Consulte a RFC 9849 para mais detalhes sobre como o GREASE do ECH 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> em 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 sobre o Encrypted Client Hello.

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

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 está estendendo a proteção de OTP por SMS para mensagens SMS padrão (mensagens SMS que contêm uma OTP e não usam os formatos WebOTP ou SMS Retriever). Para a maioria dos apps direcionados ao Android 17 (nível 37 da API) ou versões mais recentes, essas mensagens SMS só ficam disponíveis 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 de SMS_RECEIVED_ACTION é retida e as consultas ao 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 app assistivo de SMS padrão, apps complementares de dispositivos conectados etc., estão isentos desse atraso. Todos os apps que dependem da leitura de mensagens SMS para extração de OTP precisam usar as APIs SMS Retriever ou SMS User Consent para garantir a funcionalidade contínua.

Segurança

O Android 17 traz as seguintes melhorias para a 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 deputado confuso. Essa atualização exige que os desenvolvedores aceitem 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 BAL e melhoria da ativação:estamos refinando 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 legada MODE_BACKGROUND_ACTIVITY_START_ALLOWED. Em vez disso, adote controles granulares, como MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, que restringe as inicializações de atividades a cenários em que o app de ligação 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 prontidão para os requisitos futuros do SDK de destino.

Ativar 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, na sigla em inglês) mais seguro, introduzida no Android 14 para arquivos DEX e JAR, agora se estende às 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 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, unindo-as a RAW_CONTACT_ID.

Aplicar verificações rigorosas de SQL no CP2

For apps targeting 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.

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.

Proteção de áudio em segundo plano

Beginning with Android 17, the audio framework enforces restrictions on background audio interactions including audio playback, audio focus requests, and volume change APIs to ensure that these changes are started intentionally by the user.

Some audio restrictions apply to all apps. However, the restrictions are more stringent if an app targets Android 17 (API level 37). If one of these apps interacts with audio while it is in the background, it must have a foreground service running. In addition, the app must meet one or both of these requirements:

  • The foreground service must have while-in-use (WIU) capabilities.
  • The app must have the exact alarm permission and be interacting with USAGE_ALARM audio streams.

For more information, including mitigation strategies, see Background audio hardening.

Formatos de dispositivo

O Android 17 inclui as mudanças a seguir para melhorar a experiência do usuário em vários 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, redimensionamento e proporção em telas grandes (sw >= 600 dp) para apps destinados ao nível 36 ou mais recente da API. Os desenvolvedores têm a opção de desativar essas mudanças com o SDK 36, mas essa desativação não vai estar mais disponível para apps destinados ao Android 17 (nível 37 da API) ou mais recente.

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

Conectividade

O Android 17 apresenta a mudança abaixo para melhorar a consistência e se alinhar ao comportamento padrão do Java InputStream para soquetes RFCOMM Bluetooth.

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