A plataforma Android 17 inclui mudanças de comportamento que podem afetar seu app.
As mudanças a seguir se aplicam a todos os apps quando executados no Android 17,
independente da targetSdkVersion. Teste o app e modifique-o conforme necessário para oferecer suporte a essas mudanças, se necessário.
Consulte também a lista de mudanças de comportamento que afetam apenas os apps destinados ao Android 17.
Principal recurso
O Android 17 (nível da API 37) inclui as seguintes mudanças que modificam ou expandem vários recursos principais do sistema Android.
Limites de memória para apps
O Android 17 traz limites de memória para os apps com base na RAM total do dispositivo para criar um ambiente mais estável e determinista para seus apps e usuários do Android. Esses limites se concentram em vazamentos de memória e outros outliers antes que eles causem instabilidade em todo o sistema, resultando em renderização lenta da interface, consumo elevado da bateria e encerramento de apps. Embora prevemos um impacto mínimo na grande maioria das sessões de apps, recomendamos as práticas recomendadas de memória a seguir, incluindo o estabelecimento de um valor de referência para a memória.
Para determinar se a sessão do app foi afetada, chame
getDescription em ApplicationExitInfo. Se o app foi
afetado, o motivo da saída será REASON_OTHER e
a descrição vai conter a string "MemoryLimiter:AnonSwap", além de
outras informações. Também é possível usar o criação de perfil com base em acionadores com
TRIGGER_TYPE_ANOMALY para receber despejos de heap coletados quando o
limite de memória é atingido.
A documentação Gerenciar a memória do seu app fornece informações para ajudar você a diagnosticar problemas de memória do app e otimizar o consumo de recursos.
Testar o comportamento do app sob restrições de memória
Use o Android Debug Bridge (adb) para ajustar ou desativar os limites de memória em qualquer dispositivo que os imponha. O comando do shell am
fornece três subcomandos para ajustar os limites de memória. Esses comandos não têm efeito em um dispositivo que não impõe limites de memória.
am memory-limiter ignore <uid>|none|allam memory-limiter manual <pid> <limit>|max|noneam memory-limiter status
ignoreInstrui o limitador de memória a ignorar alguns ou todos os processos. Ao transmitir um UID (ID de usuário do Android), você instrui o limitador de memória a ignorar a aplicação em todos os processos associados a esse UID. Você também pode transmitir
all(ignorar todos os apps) ounone(não ignorar nenhum app). A transmissão denonesubstitui todas as chamadas anteriores paraam memory-limiter ignore.Se você instruir o limitador de memória a ignorar um UID, ainda poderá aplicar um limite de memória manual a um processo no app chamando
am memory-limiter manual.manualInstrui o sistema a impor uma restrição de memória ao processo com o PID (ID do processo) especificado. A restrição de memória é especificada como um número inteiro de MB. Por exemplo, transmitir
30especifica que o processo está limitado a 30 MB de memória. Transmitirmaxremove todos os limites de memória nesse processo. Transmitirnoneremove todos os limites manuais definidos no processo, restaurando o limite padrão do sistema (se houver).statusInforma o status atual do limitador de memória. O status inclui os limites de memória impostos a processos visíveis e não visíveis.
Privacidade
O Android 17 inclui as seguintes mudanças para melhorar a privacidade do usuário.
Proteção de OTP por SMS
A partir do Android 17, o sistema operacional vai ampliar a proteção para mensagens SMS que contêm senhas únicas (OTP).
Em versões anteriores do Android, essa proteção se concentrava principalmente no formato do SMS Retriever. A entrega de mensagens com um hash do SMS Retriever foi atrasada por três horas para a maioria dos apps. No entanto, alguns apps (como o processador de SMS padrão) foram isentos do atraso, e o app proprietário do hash também foi isento.
A partir do Android 17, a proteção também é aplicada a mensagens no formato WebOTP. Se um app tiver permissão para ler mensagens SMS, mas não for o destinatário pretendido de uma mensagem WebOTP (conforme determinado pela verificação de domínio), a mensagem não ficará acessível ao app até três horas após o recebimento. O objetivo dessa mudança é melhorar a segurança do usuário, garantindo que apenas apps associados ao domínio mencionado na mensagem possam ler o código de verificação de forma programática.
Durante esse atraso de três horas, a transmissão SMS_RECEIVED_ACTION é
retida e as consultas do banco de dados do provedor de SMS são filtradas. A mensagem
SMS fica disponível para esses apps após o atraso. Essa mudança se aplica a
todos os apps, independentemente do nível desejado da API.
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 inclui as seguintes melhorias na segurança de dispositivos e apps.
Plano de descontinuação de usesClearTraffic
Em uma versão futura, planejamos descontinuar o elemento usesCleartextTraffic.
Os apps que precisam fazer conexões não criptografadas (HTTP) devem migrar para
usar um arquivo de configuração de segurança de rede, que permite
especificar a quais domínios o app precisa fazer conexões de texto não criptografado.
Os arquivos de configuração de segurança de rede só são compatíveis com níveis de API 24 e mais recentes. Se o nível mínimo da API do seu app for inferior a 24, faça ambos os procedimentos a seguir:
- Defina o atributo
usesCleartextTrafficcomotrue. - Usar um arquivo de configuração de rede
Se o nível mínimo da API do app for 24 ou mais recente, você poderá usar um arquivo de configuração de rede e não precisará definir usesCleartextTraffic.
Restrição das concessões implícitas de URI
Atualmente, se um app iniciar uma intent com um URI que tenha a ação
ACTION_SEND, ACTION_SEND_MULTIPLE ou
ACTION_IMAGE_CAPTURE, o sistema concederá automaticamente as permissões de leitura e
gravação de URI ao app de destino. A partir do Android 18, o sistema
não vai mais conceder essas permissões automaticamente. Por isso, recomendamos que os apps concedam explicitamente as permissões de URI relevantes em vez de depender do sistema para isso.
Para detectar o uso dessas intents no seu app, use StrictMode com
detectImplicitUriPermissionGrant() para acionar uma violação:
Kotlin
val policy = StrictMode.VmPolicy.Builder() .detectImplicitUriPermissionGrant() .penaltyLog() .build() StrictMode.setVmPolicy(policy)
Java
StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder() .detectImplicitUriPermissionGrant() .penaltyLog() .build(); StrictMode.setVmPolicy(policy);
Como alternativa, monitore exceções registradas que contenham a mensagem
Please set the grant explicitly in the app, que aparece quando o sistema define implicitamente
a concessão. É possível monitorar esses registros
usando o seguinte comando adb:
adb logcat | grep "Please set the grant explicitly in the app"
Para conceder explicitamente as permissões necessárias, adicione a flag
FLAG_GRANT_READ_URI_PERMISSION às intents ACTION_SEND e
ACTION_SEND_MULTIPLE:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Inclua as flags FLAG_GRANT_READ_URI_PERMISSION e FLAG_GRANT_WRITE_URI_PERMISSION para intents ACTION_IMAGE_CAPTURE:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Limites de keystore por app
Apps should avoid creating excessive numbers of keys in Android Keystore, because it is a shared resource for all apps on the device. Beginning with Android 17, the system enforces a limit on the number of keys an app can own. The limit is 50,000 keys for non-system apps targeting Android 17 (API level 37) or higher, and 200,000 keys for all other apps. System apps have a limit of 200,000 keys, regardless of which API level they target.
If an app attempts to create keys beyond the limit, the creation fails with a
KeyStoreException. The exception's message string contains information
about the key limit. If the app calls getNumericErrorCode() on the
exception, the return value depends on what API level the app targets:
- Apps targeting Android 17 (API level 37) or higher:
getNumericErrorCode()returns the newERROR_TOO_MANY_KEYSvalue. - All other apps:
getNumericErrorCode()returnsERROR_INCORRECT_USAGE.
Bloquear o tráfego de loopback entre perfis unificados
A partir do Android 17, o tráfego de loopback entre perfis não é mais permitido por padrão. O tráfego de loopback no mesmo perfil não é afetado. Essa mudança se aplica a todos os apps executados no Android 17 ou versões mais recentes, independente do nível da API a que o app é destinado.
Experiência do usuário e interface do sistema
O Android 17 inclui as seguintes mudanças que visam criar uma experiência do usuário mais consistente e intuitiva.
Restauração da visibilidade padrão do IME após a rotação
Beginning with Android 17, when the device's configuration changes (for example, through rotation), and this is not handled by the app itself, the previous IME visibility is not restored.
If your app undergoes a configuration change that it does not handle, and the app needs the keyboard to be visible after the change, you must explicitly request this. You can make this request in one of the following ways:
- Set the
android:windowSoftInputModeattribute tostateAlwaysVisible. - Programmatically request the soft keyboard in your activity's
onCreate()method, or add theonConfigurationChanged()method.
Entrada humana
O Android 17 inclui as seguintes mudanças que afetam a forma como os apps interagem com dispositivos de entrada humana, como teclados e touchpads.
Os touchpads oferecem eventos relativos por padrão durante a captura de ponteiro
Beginning with Android 17, if an app requests pointer capture using
View.requestPointerCapture() and the user uses a touchpad, the system
recognizes pointer movement and scrolling gestures from the user's touches and
reports them to the app in the same way as pointer and scroll wheel movements
from a captured mouse. In most cases, this removes the need for apps that
support captured mice to add special handling logic for touchpads. For more
details, see the documentation for View.POINTER_CAPTURE_MODE_RELATIVE.
Previously, the system did not attempt to recognize gestures from the touchpad,
and instead delivered the raw, absolute finger locations to the app in a similar
format to touchscreen touches. If an app still requires this absolute data, it
should call the new View.requestPointerCapture(int) method with
View.POINTER_CAPTURE_MODE_ABSOLUTE instead.
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.
If the app tries to call audio APIs while the app is not in a valid lifecycle,
the audio playback and volume change APIs fail silently without throwing an
exception or providing a failure message. The audio focus API fails with the
result code AUDIOFOCUS_REQUEST_FAILED.
For more information, including mitigation strategies, see Background audio hardening.
Conectividade
O Android 17 inclui as seguintes mudanças para melhorar a conectividade do dispositivo.
Novo pareamento autônomo para perdas de vinculação Bluetooth
O Android 17 apresenta o pareamento autônomo, uma melhoria no nível do sistema projetada para resolver automaticamente a perda de pareamento do Bluetooth.
Antes, se uma conexão fosse perdida, os usuários precisavam acessar manualmente as configurações para desparear e parear novamente o periférico. Esse recurso se baseia na melhoria de segurança do Android 16, permitindo que o sistema restabeleça conexões em segundo plano sem exigir que os usuários naveguem manualmente até as configurações para desconectar e reconectar os periféricos.
Embora a maioria dos apps não exija mudanças de código, os desenvolvedores precisam estar cientes das seguintes mudanças de comportamento na pilha Bluetooth:
- Novo contexto de pareamento:o
ACTION_PAIRING_REQUESTagora inclui o extraEXTRA_PAIRING_CONTEXT, que permite que os apps distingam entre um pedido de pareamento padrão e uma tentativa de repareamento autônoma iniciada pelo sistema. - Atualizações condicionais de chaves:as chaves de segurança atuais só serão substituídas se o novo pareamento for bem-sucedido e a nova conexão atender ou exceder o nível de segurança da conexão anterior.
- Mudança no tempo de intenção:a intenção
ACTION_KEY_MISSINGagora é transmitida apenas se a tentativa de pareamento autônomo falhar. Isso reduz o tratamento de erros desnecessário no app se o sistema recuperar a vinculação em segundo plano. - Notificação do usuário:o sistema gerencia o pareamento novamente por novas notificações e caixas de diálogo da interface. Os usuários vão precisar confirmar a tentativa de pareamento para garantir que eles estejam cientes da reconexão.
Os fabricantes de dispositivos periféricos e os desenvolvedores de apps complementares precisam verificar se o hardware e o app processam as transições de vinculação corretamente. Para testar esse comportamento, simule uma perda de conexão remota usando um dos seguintes métodos:
- Remova manualmente as informações de vinculação do dispositivo periférico.
- Desvincule manualmente o dispositivo em: Configurações > Dispositivos conectados