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:
- Aplicação do armazenamento com escopo: o acesso a diretórios de armazenamento externo é limitado a um diretório específico do app e a tipos específicos de mídia que o app criou.
- Redefinição automática de permissões: se os usuários não interagirem com um app por alguns meses, o sistema redefinirá automaticamente as permissões confidenciais do app.
- Acesso à localização em segundo plano: os usuários serão direcionados para as configurações do sistema para conceder a permissão de localização em segundo plano aos apps.
- Visibilidade do pacote: quando um app consulta a lista de apps instalados no dispositivo, a lista retornada é filtrada.
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 saber mais sobre o framework de compatibilidade e a ativação e desativação de mudanças, consulte Testar e depurar mudanças de comportamento da plataforma no seu 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:
- O método
getView()
retornanull
. - Os valores de retorno dos métodos abaixo não refletem os valores reais. Por isso, não confie neles no seu app:
- Os métodos a seguir não são operacionais, então o app não pode usá-los:
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 saber mais sobre o framework de compatibilidade e a ativação e desativação de mudanças, consulte Testar e depurar mudanças de comportamento da plataforma no seu 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 saber mais sobre o framework de compatibilidade e a ativação e desativação de mudanças, consulte Testar e depurar mudanças de comportamento da plataforma no seu 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:
android.media.action.VIDEO_CAPTURE
android.media.action.IMAGE_CAPTURE
android.media.action.IMAGE_CAPTURE_SECURE
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 saber mais sobre o framework de compatibilidade e a ativação e desativação de mudanças, consulte Testar e depurar mudanças de comportamento da plataforma no seu 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 muito o uso de RAM no dispositivo.
Se você estava usando um arquivo resources.arsc
compactado, tente estratégias
alternativas, como a redução de 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 e que interagem com um serviço de reconhecimento de fala 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 saber mais sobre o framework de compatibilidade e a ativação e desativação de mudanças, consulte Testar e depurar mudanças de comportamento da plataforma no seu 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. Se você não encontrar 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.