Mudanças de comportamento: todos os apps

A plataforma Android 14 inclui mudanças de comportamento que podem afetar seu app. As mudanças de comportamento abaixo se aplicam a todos os apps executados no Android 14, independente de targetSdkVersion. Teste seu app e modifique-o conforme necessário para ficar compatível com essas mudanças, quando aplicável.

Consulte também a lista de mudanças de comportamento que afetam apenas os apps destinados ao Android 14.

Principal recurso

Programar alarmes exatos não é permitido por padrão

精确的闹钟适用于用户指定的通知,或是在确切时间需要执行的操作。从 Android 14 开始,系统不再向以 Android 13 及更高版本为目标平台的大多数新安装应用预先授予 SCHEDULE_EXACT_ALARM 权限,该权限默认处于拒绝状态。

详细了解安排精确闹钟的权限变化

As transmissões registradas em contexto são enfileiradas enquanto os apps são armazenados em cache

No Android 14, o sistema pode colocar transmissões registradas em contexto em uma fila enquanto o app está no estado em cache. Esse comportamento é semelhante ao enfileiramento que o Android 12 (nível 31 da API) apresentou para transações de binder assíncronas. As transmissões declaradas no manifesto não são enfileiradas, e os apps são removidos do estado em cache para enviar a transmissão.

Quando o app sai do estado em cache, como ao retornar para o primeiro plano, o sistema envia todas as transmissões enfileiradas. Várias instâncias de determinadas transmissões podem ser mescladas em uma transmissão. Dependendo de outros fatores, como a integridade do sistema, os apps podem ser removidos do estado em cache e qualquer transmissão colocada anteriormente na fila é entregue.

Os apps só podem encerrar os próprios processos em segundo plano

A partir do Android 14, quando o app chamar killBackgroundProcesses(), a API poderá encerrar apenas os processos em segundo plano do próprio app.

Se você transmitir o nome do pacote de outro app, esse método não afetará os processos em segundo plano desse app, e esta mensagem vai aparecer no Logcat:

Invalid packageName: com.example.anotherapp

O app não pode usar a API killBackgroundProcesses() nem tentar influenciar o ciclo de vida do processo de outros apps, mesmo em versões mais antigas do SO. O Android foi projetado para manter apps em cache em segundo plano e encerrá-los automaticamente quando o sistema precisa de memória. Se o app encerrar outros apps desnecessariamente, isso poderá reduzir o desempenho do sistema e aumentar o consumo da bateria exigindo reinicializações completas dos apps mais tarde, o que consome muito mais recursos que retomar um app existente armazenado em cache.

A MTU está definida como 517 para o primeiro cliente GATT que solicita uma MTU

No Android 14 e versões mais recentes, a pilha Bluetooth do Android está de acordo com a versão 5.2 da especificação principal do Bluetooth e solicita a MTU BLE ATT para 517 bytes quando o primeiro cliente GATT solicita uma MTU usando a API BluetoothGatt#requestMtu(int) e desconsidera todas as solicitações de MTU posteriores nessa conexão de ACL.

Para resolver essa mudança e tornar seu app mais robusto, considere as seguintes opções:

  • O dispositivo periférico precisa responder à solicitação de MTU do dispositivo Android com um valor razoável que possa ser acomodado pelo periférico. O valor final negociado será um mínimo do valor solicitado pelo Android e do valor fornecido remotamente (por exemplo, min(517, remoteMtu)).
    • A implementação dessa correção pode exigir uma atualização de firmware para periféricos
  • Como alternativa, limite as gravações de características do GATT com base no mínimo entre o valor compatível conhecido do periférico e a alteração da MTU recebida.
    • Um lembrete de que você precisa reduzir 5 bytes do tamanho permitido para os cabeçalhos
    • Por exemplo: arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5

Novo motivo para um app ser colocado no bucket de espera restrito

O Android 14 apresenta um novo motivo para um app ser colocado no bucket de espera restrito. Os jobs do app acionam erros de ANR várias vezes devido aos tempos limite dos métodos onStartJob, onStopJob ou onBind. Consulte JobScheduler reforça o comportamento do callback e da rede para mudanças em onStartJob e onStopJob.

Para rastrear se o app entrou ou não no bucket de espera restrito, recomendamos a geração de registros com a API UsageStatsManager.getAppStandbyBucket() na execução do job ou UsageStatsManager.queryEventsForSelf() na inicialização do app.

mlock limitado a 64 KB

No Android 14 (nível 34 da API) e versões mais recentes, a plataforma reduz a memória máxima que pode ser bloqueada usando mlock() para 64 KB por processo. Nas versões anteriores, o limite era de 64 MB por processo. Essa restrição promove um melhor gerenciamento de memória entre apps e no sistema. Para oferecer mais consistência em todos os dispositivos, o Android 14 adiciona um novo teste de CTS para o novo limite de mlock() em dispositivos compatíveis.

O sistema impõe o uso de recursos de apps armazenados em cache

Por padrão, o processo de um app fica armazenado em cache quando é movido para o segundo plano e nenhum outro componente do processo do app está em execução. Esse processo do app está sujeito a ser encerrado devido à pressão na memória do sistema. Qualquer trabalho realizado pelas instâncias Activity nesse estado após o método onStop() ter sido chamado e retornado não é confiável nem recomendado.

O Android 14 apresenta consistência e requisitos nesse design. Logo após o processo de um app entrar em um estado armazenado em cache, o trabalho em segundo plano deixa de ser permitido até que um componente do processo volte a um estado ativo do ciclo de vida.

Apps que usam APIs de ciclo de vida com suporte ao framework, como Services, JobScheduler e Jetpack WorkManager, não são afetados por essas mudanças.

Experiência do usuário

Mudanças na experiência dos usuários com notificações não dispensáveis

Caso seu app mostre notificações não dispensáveis em primeiro plano para os usuários, saiba que o Android 14 mudou o comportamento para permitir que os usuários dispensem essas notificações.

Essa mudança se aplica a apps que impedem os usuários de dispensar as notificações em primeiro plano ao definir Notification.FLAG_ONGOING_EVENT usando Notification.Builder#setOngoing(true) ou NotificationCompat.Builder#setOngoing(true). O comportamento de FLAG_ONGOING_EVENT mudou para que essas notificações possam ser dispensadas pelo usuário.

Esses tipos de notificação ainda não podem ser dispensados nas seguintes condições:

  • Quando o smartphone está bloqueado.
  • Quando o usuário seleciona uma ação de notificação Limpar tudo, que pode dispensar notificações acidentalmente.

Além disso, esse novo comportamento não se aplica a notificações nos seguintes casos de uso:

  • Notificações do CallStyle
  • Controlador de política de dispositivo (DPC) e pacotes de suporte para empresas.
  • Notificações de mídia
  • O pacote padrão do seletor de pesquisa

As informações de segurança dos dados estão mais visíveis

Para melhorar a privacidade do usuário, o Android 14 aumenta o número de lugares em que o sistema mostra as informações declaradas no formulário do Play Console. Atualmente, os usuários podem ver essas informações na seção Segurança dos dados da página de detalhes do app no Google Play.

Recomendamos revisar as políticas de compartilhamento de dados de local do app e atualizar a seção "Segurança dos dados" no Google Play.

Saiba mais no guia sobre como as informações de segurança dos dados estão mais visíveis no Android 14.

Acessibilidade

Dimensionamento de fonte não linear para 200%

No Android 14 e mais recentes, o sistema oferece suporte ao dimensionamento de fontes de até 200%, dando aos usuários com baixa visão outras opções de acessibilidade alinhadas às Diretrizes de Acessibilidade para Conteúdo Web (WCAG, na sigla em inglês).

Se você já usa unidades de pixels dimensionados (sp) para definir o tamanho do texto, essa mudança provavelmente não terá um impacto alto no seu app. No entanto, faça testes de interface com o tamanho máximo de fonte ativado (200%) para garantir que o app possa acomodar tamanhos de fonte maiores sem afetar a usabilidade.

Segurança

Nível mínimo desejado para a instalação da API

从 Android 14 开始,targetSdkVersion 低于 23 的应用无法安装。要求应用满足这些最低目标 API 级别要求有助于提高用户的安全性和隐私性。

恶意软件通常会以较旧的 API 级别为目标平台,以绕过在较新版本 Android 中引入的安全和隐私保护机制。例如,有些恶意软件应用使用 targetSdkVersion 22,以避免受到 Android 6.0 Marshmallow(API 级别 23)在 2015 年引入的运行时权限模型的约束。这项 Android 14 变更使恶意软件更难以规避安全和隐私权方面的改进限制。尝试安装以较低 API 级别为目标平台的应用将导致安装失败,并且 Logcat 中会显示以下消息:

INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7

在升级到 Android 14 的设备上,targetSdkVersion 低于 23 的所有应用都将继续保持安装状态。

如果您需要测试以旧版 API 级别为目标平台的应用,请使用以下 ADB 命令:

adb install --bypass-low-target-sdk-block FILENAME.apk

Os nomes dos pacotes de proprietários de mídia podem ser editados

媒体库支持查询 OWNER_PACKAGE_NAME 列,该列表示存储特定媒体文件的应用。从 Android 14 开始,除非满足以下条件之一,否则系统会隐去此值:

  • 存储媒体文件的应用有一个软件包名称始终对其他应用可见。
  • 查询媒体库的应用会请求 QUERY_ALL_PACKAGES 权限。

详细了解 Android 如何出于隐私保护目的而过滤软件包可见性