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
精确的闹钟适用于用户指定的通知,或是在确切时间需要执行的操作。从 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 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.
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
在 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(例如服务、JobScheduler
和 Jetpack WorkManager)的应用应该不受这些变化的影响。
Experiência do usuário
Mudanças na experiência dos usuários com notificações não dispensáveis
If your app shows non-dismissable foreground notifications to users, Android 14 has changed the behavior to allow users to dismiss such notifications.
This change applies to apps that prevent users from dismissing foreground
notifications by setting Notification.FLAG_ONGOING_EVENT
through
Notification.Builder#setOngoing(true)
or
NotificationCompat.Builder#setOngoing(true)
. The behavior of
FLAG_ONGOING_EVENT
has changed to make such notifications actually
dismissable by the user.
These kinds of notifications are still non-dismissable in the following conditions:
- When the phone is locked
- If the user selects a Clear all notification action (which helps with accidental dismissals)
Also, this new behavior doesn't apply to notifications in the following use cases:
CallStyle
notifications- Device policy controller (DPC) and supporting packages for enterprise
- Media notifications
- The default Search Selector package
As informações de segurança dos dados estão mais visíveis
为了加强用户隐私保护,Android 14 增加了系统显示您在 Play 管理中心表单中声明的信息的位置数量。目前,用户可以在 Google Play 中的应用详情的数据安全部分查看此信息。
我们建议您查看应用的位置数据分享政策,并花一点时间对应用的 Google Play“数据安全”部分进行任何适用的更新。
如需了解详情,请参阅有关如何在 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
Starting with Android 14, apps with a
targetSdkVersion
lower than 23
can't be installed. Requiring apps to meet these minimum target API level
requirements improves security and privacy for users.
Malware often targets older API levels in order to bypass security and privacy
protections that have been introduced in newer Android versions. For example,
some malware apps use a targetSdkVersion
of 22 to avoid being subjected to the
runtime permission model introduced in 2015 by Android 6.0 Marshmallow (API
level 23). This Android 14 change makes it harder for malware to avoid security
and privacy improvements.
Attempting to install an app targeting a lower API level will result in an
installation failure, with the following message appearing in Logcat:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7
On devices upgrading to Android 14, any apps with a targetSdkVersion
lower
than 23 will remain installed.
If you need to test an app targeting an older API level, use the following ADB command:
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.