A plataforma Android 13 inclui mudanças de comportamento que podem afetar o app. As
mudanças de comportamento abaixo se aplicam a todos os apps quando executados no Android 13,
independente da targetSdkVersion
. Teste o app e o modifique conforme
necessário para que ele ofereça suporte a essas mudanças.
Consulte também a lista de mudanças de comportamento que afetam apenas os apps destinados ao Android 13.
Desempenho e bateria
Gerenciador de tarefas
No Android 13 (nível 33 da API) e versões mais recentes, os usuários podem concluir um fluxo de trabalho na gaveta de notificações para interromper apps que têm serviços em primeiro plano em andamento, conforme mostrado na Figura 1. Essa affordance é conhecida como Gerenciador de tarefas. Os apps precisam ser capazes de lidar com essa interrupção iniciada pelo usuário.
Melhor processamento de jobs de pré-busca usando JobScheduler
Com o JobScheduler, os apps podem marcar jobs específicos como jobs
de "pré-busca" (usando JobInfo.Builder.setPrefetch()
), o que faz com que esses jobs sejam executados
logo antes próxima inicialização do app para melhorar a experiência do usuário.
Antes, o JobScheduler usava somente o indicador para permitir que os jobs de pré-busca
usassem dados livres ou em excesso de maneira oportuna.
No Android 13 (nível 33 da API) e versões mais recentes, o sistema tenta determinar a próxima vez que um app vai ser iniciado e usa essa estimativa para executar jobs de pré-busca. É importante testar o uso de jobs de pré-busca para qualquer trabalho que o app queira executar antes da próxima inicialização do app.
Uso de recursos da bateria
O Android 13 (nível 33 da API) oferece estas maneiras para o sistema gerenciar melhor a duração da bateria do dispositivo:
- Regras atualizadas sobre quando o sistema coloca o app no bucket "restrito" para apps em espera.
- Novas limitações para o trabalho que pode ser realizado quando o usuário coloca o app em estado "restrito" para reduzir o uso da bateria em segundo plano.
Ao testar seu app com essas mudanças, verifique o seguinte: coisas:
Teste como o app responde quando o sistema o coloca na restrição "restrita" Aplicativo Bucket em espera. Use o este comando do Android Debug Bridge (adb) para atribuir seu app a esse bucket:
adb shell am set-standby-bucket PACKAGE_NAME restricted
Teste como o app responde às seguintes restrições que normalmente se aplicam para apps que estão em um "restrito" estado para o uso da bateria em segundo plano:
- Não é possível iniciar serviços em primeiro plano
- Serviços em primeiro plano existentes são removidos
- Alarmes não são acionados
- Jobs não são executados
Use o seguinte comando ADB para colocar seu app nesse estado "restrito" estado:
adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
Cotas de alta prioridade do Firebase Cloud Messaging (FCM)
O Android 13 (nível 33 da API) atualiza as cotas do Firebase Cloud Messaging (FCM) para melhorar a confiabilidade do envio de mensagens FCM de alta prioridade para apps que mostram notificações em resposta a esse tipo de mensagem. Os seguintes comportamentos mudaram no Android 13 (API de nível 33):
- Os buckets do App em espera não determinam mais quantos FCMs de alta prioridade podem ser usados pelo app.
- As cotas de alta prioridade do FCM são ajustadas de acordo com o número de notificações exibidas ao usuário em resposta às mensagens FCM de alta prioridade.
Como nas versões anteriores do Android, as mensagens FCM de alta prioridade que ultrapassam a cota são rebaixadas para prioridade normal. Ao iniciar serviços em primeiro plano em resposta a uma mensagem FCM, é recomendável consultar o resultado de RemoteMessage.getPriority()
para confirmar se ele é PRIORITY_HIGH
ou, então, processar possíveis exceções ForegroundServiceStartNotAllowedException
.
Caso seu aplicativo nem sempre mostre notificações em resposta a mensagens FCM de alta prioridade, recomendamos que você mude a prioridade para normal. Assim, as mensagens que precisarem gerar notificações não vão ser rebaixadas para prioridade normal.
Privacidade
Permissão de execução para notificações
O Android 13 (nível 33 da API) introduz uma nova
permissão de execução para notificações:
POST_NOTIFICATIONS
.
Essa mudança ajuda os usuários a se concentrarem nas notificações que eles consideram mais
importantes.
Recomendamos que você destine o app ao Android 13 o quanto antes para fazer uso do maior controle e da maior flexibilidade proporcionados por esse recurso.
Saiba mais sobre as práticas recomendadas de permissões do app.
Ocultar conteúdo confidencial da área de transferência
Se o app permitir que os usuários copiem conteúdo confidencial, para a área de transferência, como senhas ou dados
de cartões de crédito, adicione uma sinalização à ClipDescription
do
ClipData antes de chamar ClipboardManager#setPrimaryClip()
. Essa
sinalização impede que conteúdo confidencial seja exibido na visualização.
![Visualização do texto copiado sem sinalização de conteúdo confidencial.](https://developer.android.google.cn/static/images/about/versions/13/sensitive-content-before.png?authuser=0000&hl=pt-br)
![Visualização do texto copiado com sinalização de conteúdo confidencial.](https://developer.android.google.cn/static/images/about/versions/13/sensitive-content-after.png?authuser=0000&hl=pt-br)
Para sinalizar a presença de conteúdo confidencial, adicione um booleano extra à ClipDescription
. Isso
precisa ser feito por todos os apps, independentemente do nível desejado da API.
// When your app is compiled with the API level 33 SDK or higher
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
}
}
// If your app is compiled with a lower SDK
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean("android.content.extra.IS_SENSITIVE", true)
}
}
Para saber mais sobre a nova IU da área de transferência, acesse a página do recurso copiar e colar.
Segurança
Migrar do uso de ID de usuário compartilhado
Caso o app use o atributo
android:sharedUserId
, que foi descontinuado,
e não dependa mais da funcionalidade dele, defina o atributo
android:sharedUserMaxSdkVersion
como 32
, conforme mostrado no snippet de código abaixo:
<manifest ...> <!-- To maintain backward compatibility, continue to use "android:sharedUserId" if you already added it to your manifest. --> android:sharedUserId="SHARED_PACKAGE_NAME" android:sharedUserMaxSdkVersion="32" ... </manifest>
Esse novo atributo informa ao sistema que o app não usa mais um ID de usuário
compartilhado. Se o app declarar android:sharedUserMaxSdkVersion
e for instalado
pela primeira vez em dispositivos com o Android 13 ou versões mais recente, ele vai se
comportar como se android:sharedUserId
nunca houvesse sido definido. Os apps atualizados ainda usam
o ID de usuário compartilhado existente.
Os IDs de usuário compartilhados causam um comportamento não determinista no gerenciador de pacotes. Em vez disso, o app precisa usar mecanismos de comunicação adequados, como serviços e provedores de conteúdo, para facilitar a interoperabilidade entre os componentes compartilhados.
Experiência do usuário
Notificações de serviço em primeiro plano dispensáveis
Em dispositivos com o Android 13 ou versões mais recentes, os usuários podem dispensar as notificações associadas a serviços em primeiro plano por padrão.
Principal recurso
Remoção da cópia legada da implementação do serviço de voz
O Android 13 remove a implementação de SpeechService
, incluindo
o IME de voz, RecognitionService
e uma API baseada
em intents do
Google app.
As mudanças abaixo foram implementadas no Android 12:
- As funcionalidades
SpeechService
foram migradas para o app Serviços de voz do Google, que passou a ser o provedorSpeechService
padrão. - A funcionalidade
RecognitionService
foi movida para o app Inteligência do sistema Android, a fim de oferecer suporte para o reconhecimento de fala no dispositivo.
Para ajudar a manter a compatibilidade do app no Android 12, o Google app usa uma atividade em trampolim para desviar o tráfego para os Serviços de voz do Google. Essa atividade foi removida no Android 13.
Os apps precisam usar o provedor padrão do dispositivo para o SpeechService
, em vez de
codificar um app específico.