Bem-vindo à Visualização do desenvolvedor do Android 12. Envie seu feedback com antecedência e frequência e ajude a deixar o Android 12 ainda melhor.

Mudanças no framework de compatibilidade (Android 12)

Figura 1. Tela "Mudanças na compatibilidade do app" nas opções do desenvolvedor listando as mudanças que podem ser ativadas ou desativadas.

Esta página descreve cada mudança de comportamento que foi adicionada ao framework de compatibilidade no Android 12. Use esta lista em conjunto com as opções do desenvolvedor e os comandos ADB para testar e depurar seu app enquanto você se prepara para oferecer compatibilidade e direcionar para o Android 12.

Veja alguns exemplos do que você pode fazer usando as ferramentas do framework de compatibilidade:

  • Teste as mudanças esperadas sem realmente mudar a targetSdkVersion do app. Você pode usar as alternâncias para forçar a ativação de mudanças específicas de comportamento esperado e avaliar o impacto no app existente.
  • Concentre seus testes somente em mudanças específicas. Em vez de ter que resolver todas as mudanças esperadas de uma só vez, as alternâncias permitem desativá-las, exceto as que você quer testar.
  • Gerencie alternâncias por meio do adb. Você pode usar comandos adb para ativar e desativar as mudanças alternáveis no seu ambiente de teste automatizado.
  • Depure mais rapidamente usando códigos de mudança padrão. Cada uma delas tem um código e um nome exclusivos que podem ser usados para depurar rapidamente a causa raiz na saída do registro.

Para ver informações completas sobre o uso das ferramentas em cada um desses casos, consulte Ferramentas do framework de compatibilidade.

Mudanças de comportamento incluídas no framework de compatibilidade

A lista nesta seção descreve cada mudança de comportamento incluída no framework de compatibilidade no build mais recente da Visualização do desenvolvedor do Android 12.

É possível filtrar a lista de mudanças por Estado padrão.

Mudanças de comportamento adicionadas ao framework de compatibilidade no Android 12

ALLOW_TEST_API_ACCESS

ID da mudança: 166236554
Estado padrão: desativada para todos os apps.

Permite que os apps acessem as APIs @TestApi.

Observação: essa mudança está desativada por padrão e só deve ser usada pelo código de teste da plataforma.

BLOCK_FLAG_SLIPPERY

ID da mudança: 157929241
Estado padrão: ativada para todos os apps.

Em apps executados no Android 12, verifica se FLAG_SLIPPERY está sendo usada em alguma janela no app. Esperamos que essa sinalização seja usada apenas pelos componentes do sistema, já que é um campo incompatível. Caso usada, ela será restrita.

BLOCK_GPS_STATUS_USAGE

ID da mudança: 144027538
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Em apps destinados ao Android 12 e versões mais recentes, todos os usos da API GpsStatus precisam ser substituídos pelas APIs GnssStatus.

BLOCK_IMMUTABLE_PENDING_INTENTS

ID da mudança: 171317480
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Em apps destinados ao Android 12 e versões mais recentes, os objetos imutáveis PendingIntent transmitidos às APIs de localização gerarão uma IllegalArgumentException.

BLOCK_PENDING_INTENT_SYSTEM_API_USAGE

ID da mudança: 169887240
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Em apps destinados ao Android 12 e versões mais recentes, as APIs LocationRequest do sistema não podem ser usadas com solicitações de localização PendingIntent.

BLOCK_UNTRUSTED_TOUCHES

ID da mudança: 158002302
Estado padrão: ativada para todos os apps.

Para preservar a segurança do sistema e uma boa experiência do usuário, o Android 12 impede que os apps consumam eventos de toque em que uma sobreposição oculte o app de forma não segura.

Para saber mais sobre essa mudança, consulte Eventos de toque não confiáveis estão bloqueados.

CAMERA_MIC_INDICATORS_NOT_PRESENT

ID da mudança: 107547999
Estado padrão: desativada para todos os apps.

Indica que o dispositivo é compatível com indicadores de câmera e microfone. Se presente, será false, porque o método CompatChanges#isChangeEnabled retornará true se o ID da mudança não estiver presente.

DELIVER_HISTORICAL_LOCATIONS

ID da mudança: 73144566
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Em apps destinados ao Android 12 e versões mais recentes, os clientes de local podem receber localizações anteriores ao momento atual, em algumas circunstâncias.

DROP_CLOSE_SYSTEM_DIALOGS

ID da mudança: 174664120
Estado padrão: ativada para todos os apps.

Para melhorar o controle do usuário ao interagir com apps e com o sistema, a ação da intent ACTION_CLOSE_SYSTEM_DIALOGS foi suspensa a partir do Android 12.

Para saber mais sobre essa mudança, consulte Apps não podem fechar caixas de diálogo do sistema.

ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES

ID da mudança: 142191088
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Os apps destinados ao Android 12 e versões mais recentes precisam declarar dependências para as bibliotecas compartilhadas nativas públicas definidas pelo fabricante do dispositivo, usando a tag uses-native-library no AndroidManifest.xml. Se alguma das dependências não for atendida (por exemplo, se uma delas não existir), o gerenciador de pacotes não instalará o app. A dependência pode ser especificada como opcional, usando o atributo android:required na tag. Nesse caso, deixar de atender a dependência não interromperá a instalação.

Depois de instalado, o app recebe apenas as bibliotecas compartilhadas nativas especificadas no manifesto dele. Chamar dlopen em uma biblioteca compartilhada nativa que não aparece no manifesto do app causará uma falha mesmo que a biblioteca exista no dispositivo.

ENFORCE_STRICT_QUERY_BUILDER

ID da mudança: 143231523
Estado padrão: ativado para apps destinados ao Android 12 ou versões mais recentes.

Em apps direcionados ao Android 12 e versões mais recentes, o SQLiteQueryBuilder agora verifica todas as seleções de consulta CalendarProvider2 para ver se há argumentos maliciosos.

FGS_BG_START_USE_EXEMPTION_LIST_CHANGE_ID

ID da mudança: 175801883
Estado padrão: ativada para todos os apps.

Se definida como false para um pacote, o sistema não a isentará de FGS-BG-start, mesmo que esteja em ActiveServices.sFgsBgStartExemptedPackages.

FORCE_DISABLE_HEVC_SUPPORT

ID da mudança: 717432520
Estado padrão: desativada para todos os apps.

Força um app a deixar de ser compatível com o recurso de mídia HEVC. Os apps precisam declarar os recursos de mídia compatíveis no manifesto, mas essa sinalização pode ser usada para forçar um app a não ser compatível com HEVC, forçando a transcodificação ao acessar mídias codificadas em HEVC. Definir essa sinalização modificará todos os padrões no nível do SO do app. Esse recurso fica desativado por padrão, o que significa que os padrões do SO têm prioridade. Definir essa sinalização e FORCE_ENABLE_HEVC_SUPPORT indica um estado indefinido e fará com que o SO ignore as duas sinalizações.

FORCE_ENABLE_HEVC_SUPPORT

ID da mudança: 174228127
Estado padrão: desativada para todos os apps.

Força o app a ser compatível com o recurso de mídia HEVC. Os apps precisam declarar os recursos de mídia compatíveis no manifesto. mas essa sinalização pode ser usada para forçar um app a ser compatível com HEVC, evitando a transcodificação ao acessar mídias codificadas em HEVC. Definir essa sinalização modificará todos os padrões no nível do SO do app. Esse recurso fica desativado por padrão, o que significa que os padrões do SO têm prioridade. Definir essa sinalização e FORCE_DISABLE_HEVC_SUPPORT indica um estado indefinido e fará com que o SO ignore as duas sinalizações.

FORCE_RESIZE_APP

ID da mudança: 440042936
Estado padrão: desativada para todos os apps.

Força os pacotes em que é aplicada a serem redimensionáveis. Só é permitido redimensionar janelas no modo de tela cheia. Não é possível forçar o app a entrar no modo de várias janelas redimensionáveis.

HIDE_PROP_ICUBINARY_DATA_PATH

ID da mudança: 171979766
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Para apps direcionados ao Android 12 e versões mais recentes, remove o acesso à propriedade android.icu.impl.ICUBinary.dataPath.

IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE

ID da mudança: 158482162
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Em apps destinados ao Android 12 e versões mais recentes, a permissão BACKUP necessária para isBackupServiceActive() é aplicada no lado do serviço, e não no lado do cliente no BackupManager.

KEYSTORE_OPERATION_CREATION_MAY_FAIL

ID da mudança: 169897160
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Em apps destinados ao Android 12 e versões mais recentes, agora a criação da operação de keystore pode falhar. O keystore funcionava com base no pressuposto de que a criação de operações criptográficas sempre ocorria corretamente. No entanto, o back-end KeyMint tem um número limitado de slots de operação.

Para que o número de slots de operação parecessem ser "infinitos", o daemon do Keystore removia as operações menos usadas recentemente caso não houvesse um slot de operação disponível. Como resultado, boas operações podiam ser encerradas de forma prematura. Isso abriu o AndroidKeystore para negação de serviço (DoS) e livelocks indesejados. Por exemplo, caso vários apps fossem ativados ao mesmo tempo devido a otimizações de gerenciamento de energia e tentassem executar operações de criptografia, eles passariam a encerrar as operações uns dos outros, sem fazer nenhum progresso.

Para eliminar os livelocks e desestimular as tentativas de DoS, mudamos a estratégia de remoção, de forma que os clientes que usam poucos slots de operação de forma breve têm preferência. Consequentemente, operações únicas que não ficam inativas por mais de cinco segundos quase sempre são concluídas sem interrupções pela estratégia de remoção. Ainda existem algumas operações relacionadas à criptografia do sistema de arquivos que podem remover até mesmo essas operações, mas esses casos são extremamente raros. Como efeito colateral dessa nova estratégia de remoção, a criação poderá apresentar falha se o cliente tiver um poder de remoção menor do que todas as operações existentes.

Estratégia de remoção: para encontrar um candidato adequado, computamos o malus do autor da chamada e de cada operação existente. O malus é o inverso do poder de remoção (autor da chamada) ou da resistência à remoção (operação atual). Para que o autor da chamada possa remover uma operação, ele precisa encontrar uma operação com malus maior do que o seu. Para ver mais detalhes sobre a estratégia de remoção, consulte a implementação de operation.rs. No Android 11 (API de nível 30) e versões anteriores, o KeyStore2 procura um slot de operação livre no daemon do Keystore. Para apps direcionados ao Android 11 (API de nível 30) e versões anteriores, ainda parecerá que a inicialização de objetos de criptografia e assinatura sempre funciona. No entanto, pode levar mais tempo para realizar a operação. Todas as versões do Android se beneficiam da programação de slots mais justa e de ter uma chance melhor de concluir uma operação.

LOW_POWER_EXCEPTIONS

ID da mudança: 1916836375
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Em apps direcionados ao Android 12 e versões mais recentes, todos os objetos LocationRequest marcados como baixo poder de remoção geram exceções caso o autor da chamada não tenha a permissão LOCATION_HARDWARE, em vez de descartar a parte que tem baixo poder de remoção da solicitação.

MISSING_EXPORTED_FLAG

ID da mudança: 150232615
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Em apps destinados ao Android 12 e versões mais recentes, é necessário especificar um valor explícito para o atributo android:exported sempre que um filtro de intent é definido.

Para saber mais sobre essa mudança, consulte Exportação mais segura de componentes.

NATIVE_MEMTAG_ASYNC

ID da mudança: 57732972
Estado padrão: desativada para todos os apps.

Ativa as verificações de tags de memória em apps que não são do sistema. Essa sinalização afeta apenas o hardware compatível com a extensão ARM Memory Tagging Extension (MTE).

NATIVE_MEMTAG_SYNC

ID da mudança: 177438394
Estado padrão: desativada para todos os apps.

Ativa a verificação síncrona (SYNC) de tags de memória nesse processo. Essa sinalização afeta apenas o hardware compatível com a extensão ARM Memory Tagging Extension (MTE). Se NATIVE_MEMTAG_ASYNC e essa opção estiverem ativadas, essa opção terá preferência e a MTE será ativada no modo SYNC.

NOTIFICATION_TRAMPOLINE_BLOCK

ID da mudança: 167676448
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Para melhorar o desempenho e a UX do app, os apps direcionados ao Android 12 não podem usar serviços nem broadcast receivers como notificações em trampolim.

Para saber mais sobre essa mudança, consulte Notificações em trampolim não podem ser criadas em serviços ou broadcast receivers.

PENDING_INTENT_EXPLICIT_MUTABILITY_REQUIRED

ID da mudança: 160794467
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Para apps direcionados ao Android 12 e versões mais recentes, é necessário especificar a mutabilidade de cada objeto PendingIntent criado pelo app. Esse novo requisito melhora a segurança do app.

Para saber mais sobre essa mudança, consulte Intents pendentes precisam declarar mutabilidade.

RATE_LIMIT_TOASTS

ID da mudança: 174840628
Estado padrão: essa mudança não pode ser alternada. Ela só é registrada pelo framework de compatibilidade.

Ativa a limitação de taxa para o número de chamadas Toast.show(), a fim de evitar sobrecarregar o usuário com muitos avisos em um período limitado. Qualquer tentativa de mostrar mais avisos do que o permitido em um período determinado fará com que o aviso seja descartado.

RETURN_NULL_HARDWARE_ADDRESS

ID da mudança: 170188668
Estado padrão: ativada para apps direcionados ao Android 11 (API de nível 30) ou versões mais recentes.

Em apps direcionados ao Android 11 (API de nível 30) ou versões mais recentes, getHardwareAddress() retorna null quando o endereço do hardware é inacessível. Se a mudança estiver desativada, o endereço MAC padrão (02:00:00:00:00:00) será retornado.

Para saber mais sobre essa mudança, consulte Restrições do endereço MAC do Netlink.

SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE

ID da mudança: 151105954
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Em apps destinados ao Android 12 e versões mais recentes, impõe que todas as attributionTags enviadas para noteOp(String, int, String), noteProxyOp(String, String), e startOp(String, int, String), sejam definidas no manifesto do pacote que é especificado como parâmetro dos métodos.

Para que essa mudança funcione, é necessário ativá-la tanto no pacote que chama noteOp(String, int, String) quanto no pacote especificado como parâmetro do método.

SELINUX_LATEST_CHANGES

ID da mudança: 14353991
Estado padrão: ativada para apps destinados ao Android 12 ou versões mais recentes.

Em apps destinados ao Android 12 e versões mais recentes, ativa as mudanças mais recentes do SELinux. A desativação dessa mudança para apps destinados ao Android 12 ou versões mais recentes é automática e não tem efeito nenhum para apps que usam um ID de usuário compartilhado.

THROW_EXCEPTION_ON_REQUIRE_INSTALL_PACKAGES_TO_ADD_INSTALLER_PACKAGE

ID da mudança: 150857253
Estado padrão: ativada para apps destinados ao Android 11 (API de nível 30) ou versões mais recentes

Em apps destinados ao Android 11 (API de nível 30) e versões mais recentes, adicionar um nome do pacote do instalador a um pacote sem nome definido agora exige a permissão INSTALL_PACKAGES. Se o autor da chamada for direcionado ao Android 11 (API de nível 30), uma SecurityException será gerada. Caso contrário, a solicitação falhará silenciosamente. Em ambos os casos, e independentemente da ativação ou não da mudança, o pacote do instalador permanecerá inalterado.