Mudanças de comportamento: apps direcionados ao Android 11

Como nas versões anteriores, o Android 11 inclui mudanças de comportamento que podem afetar seu app. As seguintes mudanças de comportamento se aplicam exclusivamente a apps direcionados ao Android 11 ou versão mais recente. Caso seu app defina targetSdkVersion como 30, modifique o app para que ele seja compatível com esses comportamentos de forma adequada, quando for relevante.

Veja também a lista de mudanças de comportamento que afetam todos os apps executados no Android 11.

Privacidade

O Android 11 introduz mudanças e restrições para melhorar a privacidade do usuário, incluindo:

Para saber mais, consulte a página Privacidade.

Segurança

Inclusão de tag de ponteiro de heap

Detalhes da mudança

Nome da mudança: NATIVE_HEAP_POINTER_TAGGING

ID da mudança: 135754954

Como ativar

Ao testar a compatibilidade do app com o Android 11, é possível ativar ou desativar essa mudança usando os seguintes comandos ADB:

adb shell am compat enable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
adb shell am compat disable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME

Para mais informações sobre o framework de compatibilidade e a ativação ou desativação de mudanças, consulte Testar e depurar mudanças de comportamento da plataforma no app.

Os ponteiros de heap agora têm uma tag diferente de zero no byte mais significativo (MSB, na sigla em inglês). Aplicativos que usam ponteiros incorretamente, incluindo os que modificam o MSB, podem falhar ou ter outros problemas. Essa mudança é necessária para oferecer compatibilidade a hardwares futuros com a extensão ARM Memory Tagging Extension (MTE) ativada. Para saber mais, consulte Ponteiros com tag.

Para desativar esse recurso, consulte a documentação do manifesto allowNativeHeapPointerTagging.

Atualizações dos avisos

Os avisos personalizados em segundo plano estão bloqueados

Por motivos de segurança e para manter uma boa experiência do usuário, o sistema bloqueará avisos que contenham visualizações personalizadas se esses avisos forem enviados do segundo plano por um app direcionado ao Android 11 ou a versões mais recentes. Os avisos de texto ainda são permitidos. Eles são criados usando Toast.makeText() sem chamar setView().

Se o app tentar postar um aviso contendo uma visualização personalizada a partir do segundo plano mesmo assim, o sistema não mostrará a mensagem para o usuário. Em vez disso, o sistema registra a seguinte mensagem no logcat:

W/NotificationService: Blocking custom toast from package \
  <package> due to package not in the foreground

Callbacks de avisos

Caso queira receber uma notificação quando um aviso (de texto ou personalizado) aparecer ou desaparecer, use o método addCallback() adicionado no Android 11.

Mudanças na API de avisos de texto

Apps direcionados ao Android 11 ou a versões mais recentes veem os seguintes efeitos colaterais para avisos de texto:

Conectividade

Acesso de leitura restrito ao banco de dados do APN

Detalhes da mudança

Nome da mudança: APN_READING_PERMISSION_CHANGE_ID

ID da mudança: 124107808

Como ativar

Ao testar a compatibilidade do app com o Android 11, é possível ativar ou desativar essa mudança usando os seguintes comandos ADB:

adb shell am compat enable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME
adb shell am compat disable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME

Para mais informações sobre o framework de compatibilidade e a ativação ou desativação de mudanças, consulte Testar e depurar mudanças de comportamento da plataforma no app.

Apps direcionados ao Android 11 agora exigem a permissão privilegiada Manifest.permission.WRITE_APN_SETTINGS para ler ou acessar o banco de dados APN do provedor de Telefonia. A tentativa de acessar o banco de dados APN sem essa permissão gera uma exceção de segurança.

Acessibilidade

Declarar a interação com mecanismos TTS no arquivo de manifesto

Devido a mudanças na visibilidade do pacote, os apps direcionados ao Android 11 que interagem com um mecanismo de conversão de texto em voz (TTS, na sigla em inglês) precisam adicionar o seguinte elemento <queries> aos arquivos de manifesto:

<queries>
  <intent>
    <action
       android:name="android.intent.action.TTS_SERVICE" />
  </intent>
</queries>

Declarar o uso do botão de acessibilidade no arquivo de metadados

Detalhes da mudança

Nome da mudança: REQUEST_ACCESSIBILITY_BUTTON_CHANGE

ID da mudança: 136293963

Como ativar

Ao testar a compatibilidade do app com o Android 11, é possível ativar ou desativar essa mudança usando os seguintes comandos ADB:

adb shell am compat enable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME
adb shell am compat disable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME

Para mais informações sobre o framework de compatibilidade e a ativação ou desativação de mudanças, consulte Testar e depurar mudanças de comportamento da plataforma no app.

A partir do Android 11, o serviço de acessibilidade não pode declarar uma associação com o botão de acessibilidade do sistema no ambiente de execução. Se AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON for anexado à propriedade flags de um objeto AccessibilityServiceInfo, o framework não transmitirá eventos de callback do botão de acessibilidade ao serviço.

Para receber eventos de callback de acessibilidade no serviço de acessibilidade, use o arquivo de metadados do serviço de acessibilidade para declarar a associação do serviço com o botão de acessibilidade. Inclua o valor flagRequestAccessibilityButton na sua definição do atributo accessibilityFlags. Um local comum para o arquivo de metadados do serviço de acessibilidade é res/raw/accessibilityservice.xml.

Câmera

Ações da intent de mídia exigem a câmera padrão do sistema

A partir do Android 11, apenas apps pré-instalados de câmera do sistema podem responder às seguintes ações de intent:

Se mais de um app pré-instalado de câmera do sistema estiver disponível, o sistema apresentará uma caixa de diálogo para o usuário selecionar um app. Se você quiser que seu app use um app específico de câmera de terceiros para capturar imagens ou vídeos, defina um nome ou componente de pacote para a intent.

Instalação e empacotamento de apps

Arquivos de recursos compactados

Detalhes da mudança

Nome da mudança: RESOURCES_ARSC_COMPRESSED

ID da mudança: 132742131

Como ativar

Ao testar a compatibilidade do app com o Android 11, é possível ativar ou desativar essa mudança usando os seguintes comandos ADB:

adb shell am compat enable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME
adb shell am compat disable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME

Para mais informações sobre o framework de compatibilidade e a ativação ou desativação de mudanças, consulte Testar e depurar mudanças de comportamento da plataforma no app.

Apps direcionados ao Android 11 (API de nível 30) ou versões mais recentes não poderão ser instalados se contiverem um arquivo compactado resources.arsc ou se esse arquivo não estiver alinhado em um limite de 4 bytes. Esse arquivo não pode ser mapeado na memória pelo sistema se uma dessas condições estiver presente. As tabelas de recursos que não podem ser mapeadas na memória precisam ser lidas em um buffer na RAM, resultando em pressão de memória desnecessária no sistema e aumentando significativamente o uso de RAM no dispositivo.

Se você usava um arquivo resources.arsc compactado, tente estratégias alternativas, como reduzir os recursos do app ou outros métodos para reduzir, ofuscar e otimizar o app.

Esquema de assinatura do APK v2 obrigatório

Os apps destinados ao Android 11 (API de nível 30) que atualmente são assinados apenas com o Esquema de assinatura do APK v1 também precisam ser assinados com o Esquema de assinatura do APK v2 ou mais recente. Os usuários não podem instalar ou atualizar apps assinados apenas com o Esquema de assinatura do APK v1 em dispositivos que executam o Android 11.

Para verificar se o app está sendo assinado com o Esquema de assinatura do APK v2 ou mais recente, use o Android Studio ou a ferramenta apksigner na linha de comando.

Firebase

Firebase JobDispatcher e GCMNetworkManager

Se o app for direcionado à API de nível 30 ou mais recente, as chamadas de API Firebase JobDispatcher e GcmNetworkManager serão desativadas em dispositivos com o Android 6.0 (API de nível 23) ou mais recentes. Para ver informações sobre migração, consulte Migrar do Firebase JobDispatcher para o WorkManager e Migrar do GCMNetworkManager para o WorkManager.

Reconhecimento de fala

Devido a mudanças na visibilidade do pacote, os apps direcionados ao Android 11 que interagem com um serviço de reconhecimento de voz precisam adicionar o seguinte elemento <queries> aos arquivos de manifesto:

<queries>
  <intent>
    <action
       android:name="android.speech.RecognitionService" />
  </intent>
</queries>

Mudanças do callback para OnSharedPreferenceChangeListener

Detalhes da mudança

Nome da mudança: CALLBACK_ON_CLEAR_CHANGE

ID da mudança: 119147584

Como ativar

Ao testar a compatibilidade do app com o Android 11, é possível ativar ou desativar essa mudança usando os seguintes comandos ADB:

adb shell am compat enable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME
adb shell am compat disable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME

Para mais informações sobre o framework de compatibilidade e a ativação ou desativação de mudanças, consulte Testar e depurar mudanças de comportamento da plataforma no app.

Para apps direcionados ao Android 11 (nível da API 30), sempre que Editor.clear for chamado, um callback agora será feito para OnSharedPreferenceChangeListener.onSharedPreferenceChanged com uma chave null.

Restrições da interface não SDK

O Android 11 inclui listas atualizadas de interfaces não SDK restritas baseadas na colaboração com desenvolvedores do Android e nos testes internos mais recentes. Antes de restringirmos interfaces não SDK, sempre que possível, garantimos que haja alternativas públicas disponíveis.

Caso seu app não seja voltado para o Android 11, talvez algumas dessas mudanças não afetem você imediatamente. No entanto, embora atualmente seja possível usar algumas interfaces não SDK (dependendo do nível da API de destino do app), o uso de qualquer método ou campo não SDK sempre apresenta um alto risco de corromper o app.

Se você não sabe se o app usa interfaces não SDK, é possível testá-lo para descobrir. Se ele depende de interfaces não SDK, planeje uma migração para alternativas SDK. No entanto, entendemos que alguns apps têm casos de uso válidos para interfaces não SDK. Caso você não encontre uma alternativa para deixar de usar uma interface não SDK em um recurso no app, solicite uma nova API pública.

Para saber mais sobre as mudanças dessa versão do Android, consulte Atualizações para restrições para interfaces não SDK no Android 11. Para saber mais sobre interfaces não SDK em geral, consulte Restrições para interfaces não SDK.