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

Beginning with Android 17, apps targeting Android 17 (API level 37) or higher receive a new lock-free implementation of android.os.MessageQueue. The new implementation improves performance and reduces missed frames, but may break clients that reflect on MessageQueue private fields and methods.

For more information, including mitigation strategies, see MessageQueue behavior change guidance.

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

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 InputConnection can retrieve candidate selection data by calling TextAttribute.isTextSuggestionSelected(). These apps should then call AccessibilityEvent.setTextChangeTypes() when dispatching TYPE_VIEW_TEXT_CHANGED events. Apps targeting Android 17 (API level 37) that use the standard TextView will have this feature enabled by default. (That is, TextView will 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_CHANGED events can call AccessibilityEvent.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

Android 17 introduces platform support for Encrypted Client Hello (ECH), a TLS extension that enhances user privacy by encrypting the Server Name Indication (SNI) in the TLS handshake. This encryption helps prevent network observers from easily identifying the specific domain your app is connecting to.

For apps targeting Android 17 (API level 37) or higher, ECH is used for TLS connections. ECH is active only if the networking library used by the app (for example, HttpEngine, WebView, or OkHttp) has integrated ECH support and the remote server also supports the ECH protocol. If ECH cannot be negotiated, the client sends an ECH extension with randomized contents (a mechanism called ECH GREASE). See RFC 9849 for more details on how ECH GREASE works.

To allow apps to customize this behavior, Android 17 adds a new <domainEncryption> element to the Network Security Configuration file. Developers can use <domainEncryption> within <base-config> or <domain-config> tags to select an ECH mode (for example, "enabled" or "disabled") on a global or per-domain basis.

For more information, see the Encrypted Client Hello documentation.

Permissão de rede local necessária para apps segmentados para o 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 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 legada MODE_BACKGROUND_ACTIVITY_START_ALLOWED. Em vez disso, adote controles granulares, como MODE_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

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

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

For apps targeting Android 17 (API level 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.

Suspensão de uso de setContentCaptureEnabled

A Captura de conteúdo é ativada por padrão em alguns dispositivos para permitir que recursos de IA no dispositivo analisem o conteúdo da tela para experiências inteligentes.

A partir do Android 17, o método da API ContentCaptureManager.setContentCaptureEnabled(boolean) foi descontinuado. Para apps direcionados ao Android 17 (nível 37 da API) ou mais recente, 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 de 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 sua 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 documentação de referência do WindowManager.LayoutParams.FLAG_SECURE.

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

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

Para apps destinados ao Android 17 (nível 37 da API), o método read() do InputStream obtido de um BluetoothSocket baseado em RFCOMM agora retorna -1 quando o soquete é fechado ou a conexão é descartada.

Essa mudança torna o comportamento do soquete RFCOMM consistente com os soquetes LE CoC e se alinha à 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 um loop de leitura podem ser afetados por essa mudança e precisam atualizar os loops 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 for desconectado ou o soquete for fechado. Para um exemplo da implementação recomendada, consulte o snippet de código no guia Transferir dados por Bluetooth.