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 a seguir se aplicam a todos os apps executados no Android 14, independente da 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

Alarmes exatos são destinados a notificações pretendidas pelo usuário ou ações que precisam acontecer em um momento preciso. A partir do Android 14, a permissão SCHEDULE_EXACT_ALARM não é mais concedida previamente à maioria dos apps recém-instalados destinados ao Android 13 e mais recentes. Em vez disso, ela é negada por padrão.

Saiba mais sobre as mudanças na permissão de programação de alarmes exatos.

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 o sistema os aplicativos podem ser removidos do estado em cache e todos os itens na fila e as transmissões são entregues.

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

A partir do Android 14, a pilha do Bluetooth do Android adere mais estritamente à versão 5.2 da especificação de núcleo do Bluetooth e solicita a MTU ATT BLE para 517 bytes quando o primeiro cliente GATT solicita uma MTU usando a API BluetoothGatt#requestMtu(int) e ignora todas as solicitações de MTU posteriores nessa conexão ACL.

Para lidar com 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á o 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 do periférico.
  • Como alternativa, limite as gravações de características GATT com base no mínimo entre o valor compatível conhecido do seu periférico e a mudança de MTU recebida
    • Um lembrete de que você precisa reduzir 5 bytes do tamanho compatível 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 a tempos limite de método onStartJob, onStopJob ou onBind. Consulte O JobScheduler reforça o callback e o comportamento de rede para ver as mudanças em onStartJob e onStopJob.

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

mlock limitado a 64 KB

在 Android 14(API 级别 34)及更高版本中,平台将可使用 mlock() 锁定的最大内存量减少到每个进程 64 KB。在之前的版本中,每个进程的上限为 64 MB。此限制有助于更好地管理应用和系统的内存。为了在各种设备上提供更一致的体验,Android 14 针对兼容设备上的新 mlock() 限制添加了一项新的 CTS 测试

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

从设计上讲,当应用的进程移至后台且没有任何其他应用进程组件在运行时,应用进程将处于缓存状态。此类应用进程可能会因系统内存压力而终止。在此状态下,Activity 实例在调用并返回 onStop() 方法后执行的任何工作均不可靠,强烈建议不要这样做。

Android 14 对此设计引入了一致性和强制执行要求。在应用进程进入缓存状态后不久,系统会禁止后台工作,直到进程组件重新进入生命周期的活跃状态。

使用框架支持的典型生命周期 API(例如服务JobSchedulerJetpack WorkManager)的应用应该不受这些变化的影响。

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 aos 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 às notificações na os seguintes casos de uso:

  • CallStyle notificações
  • Controlador de política de dispositivo (DPC) e pacotes de suporte para empresas.
  • Notificações de mídia
  • O pacote padrão de 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%

从 Android 14 开始,系统支持字体放大高达 200%,为弱视用户提供了符合网络内容无障碍指南 (WCAG) 的其他无障碍功能选项。

如果您已使用放大像素 (sp) 单位来定义文本大小,这项更改可能不会对您的应用产生太大影响。不过,您应在启用最大字号 (200%) 的情况下执行界面测试,确保应用能够在不影响易用性的情况下适应较大的字号。

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 如何出于隐私保护目的而过滤软件包可见性