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 faz parte do 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.

ALWAYS_SANDBOX_DISPLAY_APIS

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

Força os pacotes em que é aplicada a sempre ter o sandbox da API Display aplicado, independentemente do modo de janelamento. As APIs Display sempre fornecerão os limites do app.

Para saber mais sobre essa mudança, consulte Display#getRealSize e getRealMetrics: descontinuação e sandbox.

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 mais recente.

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 mais recente.

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 mais recente.

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: 162547999
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.

CHANGE_ID_AUTH_STATE_DENIED

ID da mudança: 181350407
Estado padrão: ativada para apps destinados ao Android 12 ou mais recente.

Para apps clientes direcionados ao Android 12 e versões mais recentes, uma SecurityException é gerada quando eles estão no estado de autorização negada e tentam enviar uma mensagem para um nanoapp.

CHANGE_ID_SAMPLING_RATE_SENSORS_PERMISSION

ID da mudança: 136069189
Estado padrão: ativada para apps destinados ao Android 12 ou mais recente.

Para apps direcionados ao Android 12 e versões mais recentes, uma SecurityException é gerada quando eles não têm a permissão HIGH_SAMPLING_RATE_SENSORS, são executados no modo de depuração e solicitam taxas de amostragem mais rápidas que 200 Hz.

DELIVER_HISTORICAL_LOCATIONS

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

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.

DOWNSCALED

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

Essa mudança é a responsável por todas as alterações de redução de escalonamento por buffer em cada app. Desativar essa mudança impede o funcionamento dos fatores de escalonamento a seguir:

Quando essa mudança estiver ativada para um pacote de apps, o app será forçado a ser redimensionado para o fator de escalonamento mais alto ativado. Por exemplo, 80% será usado se 80% e 70% estiverem ativados.

DOWNSCALE_50

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

Quando DOWNSCALED também estiver ativado, ativar essa mudança para um pacote forçará o app a presumir que ele será executado em uma tela com 50% de resolução vertical e horizontal da tela real.

DOWNSCALE_60

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

Quando DOWNSCALED também estiver ativado, ativar essa mudança para um pacote forçará o app a presumir que ele será executado em uma tela com 60% de resolução vertical e horizontal da tela real.

DOWNSCALE_70

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

Quando DOWNSCALED também estiver ativado, ativar essa mudança para um pacote forçará o app a presumir que ele será executado em uma tela com 70% de resolução vertical e horizontal da tela real.

DOWNSCALE_80

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

Quando DOWNSCALED também estiver ativado, ativar essa mudança para um pacote forçará o app a presumir que ele será executado em uma tela com 80% de resolução vertical e horizontal da tela real.

DOWNSCALE_90

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

Quando DOWNSCALED também estiver ativado, ativar essa mudança para um pacote forçará o app a presumir que ele será executado em uma tela com 90% de resolução vertical e horizontal da tela real.

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.

ENABLE_CHECKS_FOR_PRIVATE_FILES

ID da mudança: 172100307
Estado padrão: ativada para apps destinados ao Android 12 ou mais recente.

Apps direcionados ao Android 12 e versões mais recentes não podem inserir ou atualizar arquivos particulares usando um provedor de mídia.

ENABLE_DEFERRED_SCAN

ID da mudança: 180326732
Estado padrão: ativada para apps destinados ao Android 12 ou mais recente.

Ative esta opção para adiar a verificação que é acionada como parte de MediaProvider#update().

ENABLE_INCLUDE_ALL_VOLUMES

ID da mudança: 182734110
Estado padrão: ativada para apps destinados ao Android 12 ou mais recente.

Ative esta opção para incluir linhas de bancos de dados de um volume desconectado recentemente no MediaProvider#query.

ENABLE_RAW_MANAGE_EXTERNAL_STORAGE_ACCESS

ID da mudança: 178209446
Estado padrão: ativada para apps destinados ao Android 12 ou mais recente.

Ative esta opção para autorizar que os apps com a permissão Manifest.permission.MANAGE_EXTERNAL_STORAGE solicitem acesso ao armazenamento externo bruto.

ID da mudança: 183372781
Estado padrão: ativada para apps destinados ao Android 11 (nível 30 da API) ou mais recente.

Ative essa opção para autorizar que os apps com o papel android.app.role#SYSTEM_GALLERY solicitem acesso ao armazenamento externo bruto.

ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES

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

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 mais recente.

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: 174227820
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_NON_RESIZE_APP

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

Força os pacotes em que é aplicada a não serem redimensionáveis.

FORCE_RESIZE_APP

ID da mudança: 174042936
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 mais recente.

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 mais recente.

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 mais recente.

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: 168936375
Estado padrão: ativada para apps destinados ao Android 12 ou mais recente.

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 mais recente.

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_HEAP_ZERO_INIT

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

Ative a inicialização em zero automática para alocações de memória de heap nativas.

NATIVE_MEMTAG_ASYNC

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

Ative a verificação assíncrona (ASYNC) 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).

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.

NEVER_SANDBOX_DISPLAY_APIS

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

Força os pacotes aos quais ela é aplicada a nunca aplicar o sandbox da API Display para uma atividade com efeito letterbox ou SCM. As APIs Display continuarão a fornecer limites DisplayArea.

Para saber mais sobre essa mudança, consulte Display#getRealSize e getRealMetrics: descontinuação e sandbox.

NOTIFICATION_CANCELLATION_REASONS

ID da mudança: 175319604
Estado padrão: ativada para apps destinados ao Android 12 ou mais recente.

Possibilita que listeners de notificação entendam motivos novos mais específicos de cancelamento.

NOTIFICATION_TRAMPOLINE_BLOCK

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

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.

NULL_TELEPHONY_THROW_NO_CB

ID da mudança: 182185642
Estado padrão: ativada para apps destinados ao Android 12 ou mais recente.

Usada para conferir se a versão do SDK de destino do processo atual é o Android 12 ou mais recente.

Ela se aplica aos métodos a seguir:

OVERRIDE_MIN_ASPECT_RATIO

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

Essa mudança é a responsável por todas as mudanças que forçam uma determinada proporção mínima. A ativação dela possibilita que as proporções mínimas a seguir sejam aplicadas:

Quando essa mudança é ativada para um pacote de apps, a proporção mínima fornecida no manifesto do app é substituída pela maior proporção ativada, a menos que o valor do manifesto seja maior.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

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

Quando OVERRIDE_MIN_ASPECT_RATIO também estiver ativado, ativar essa mudança para um pacote definirá a proporção mínima da atividade como um valor alto, conforme definido por OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE.

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

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

Quando OVERRIDE_MIN_ASPECT_RATIO também estiver ativado, ativar essa mudança para um pacote definirá a proporção mínima da atividade como um valor médio, conforme definido por OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE.

PENDING_INTENT_EXPLICIT_MUTABILITY_REQUIRED

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

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.

REQUIRE_EXACT_ALARM_PERMISSION

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

Os apps direcionados ao Android 12 e versões mais recentes precisam ter a nova permissão Manifest.permission.SCHEDULE_EXACT_ALARM para usar setExactAndAllowWhileIdle(int, long, PendingIntent) e setAlarmClock(AlarmClockInfo, PendingIntent).

SECURITY_EXCEPTION_ON_INVALID_ATTRIBUTION_TAG_CHANGE

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

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: 143539591
Estado padrão: ativada para apps destinados ao Android 12 ou mais recente.

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.

SELINUX_R_CHANGES

ID da mudança: 168782947
Estado padrão: ativada para apps destinados ao Android 11 (nível 30 da API) ou mais recente.

Essa mudança bloqueia o acesso de um app ao domínio SELinux untrusted_app_R-targetSDk. Essa é uma das mudanças fundamentais no framework de compatibilidade que possibilita que os apps alternem outras mudanças controladas por targetSdkVersion sem modificar as targetSDKVersion do app. Por esse motivo, não desative essa mudança para um app direcionado ao Android 11, porque o app não funcionará.

Essa mudança não tem efeito para apps que usam um ID do usuário compartilhado.

SETTINGS_API_V2

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

A nova API de preferência de usuário para verificar domínios marcados como android:autoVerify="true" nos filtros de intent AndroidManifest.xml ainda não foi implementada na visualização da plataforma atual. Por enquanto, é possível visualizar as novas mudanças de preferência do usuário ao ativar essa mudança usando adb shell pm set-app-links-user-selection e comandos parecidos.

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 (nível 30 da API) ou mais recente.

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.