A plataforma Android 14 inclui mudanças de comportamento que podem afetar seu app.
As mudanças 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 é definida como 517 para o primeiro cliente GATT que solicita uma MTU.
从 Android 14 开始,Android 蓝牙堆栈会更严格地遵循 蓝牙核心规范 5.2 版,并在第一个 GATT 客户端使用 BluetoothGatt#requestMtu(int) API 请求 MTU 时将 BLE ATT MTU 请求设为 517 字节,并忽略该 ACL 连接上的所有后续 MTU 请求。
如需解决此更改并使您的应用更为稳健,请考虑以下选项:
- 您的外围设备应使用外围设备可以容纳的合理值来响应 Android 设备的 MTU 请求。最终协商的值将是 Android 请求的值和远程提供的值(例如
min(517, remoteMtu))的较小值- 实现此修复程序可能需要更新外围设备的固件
- 或者,您也可以根据外围设备的已知支持值与收到的 MTU 更改值之间的最小值来限制 GATT 特征写入
- 提醒您,应将标头的支持大小减小 5 个字节
- 例如:
arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5
Novo motivo para um app ser colocado no bucket restrito para apps em espera
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
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 os apps e o sistema. Para oferecer mais
consistência entre 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 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 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:
CallStylenotificaçõ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%,为用户提供更多无障碍选项。
如果您已使用可缩放像素 (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
O armazenamento de mídia oferece suporte a consultas para a coluna OWNER_PACKAGE_NAME, que
indica o app que armazenou um arquivo de mídia específico. A partir do Android
14, esse valor é suprimido, a menos que no mínimo uma das condições abaixo seja
verdadeira:
- O app que armazenou o arquivo de mídia tem um nome de pacote que fica sempre visível para outros apps.
O app que consulta o armazenamento de mídia solicita a permissão
QUERY_ALL_PACKAGES.
Saiba mais sobre como o Android filtra a visibilidade do pacote para fins de privacidade.