Um usuário médio do Android instala mais de 50 apps nos dispositivos (o número aumenta à medida que a RAM dos dispositivos aumenta). No entanto, um número significativo desses apps não é usado pelo usuário por um longo período de tempo.
A hibernação de apps faz com que os apps que o usuário não usa há alguns meses entrem em hibernação, de forma semelhante à revogação automática de permissões. Isso força a interrupção do app e o coloca em um estado em que otimizamos o armazenamento em vez da performance. A revogação automática de permissão também é agrupada com esse estado e eles compartilham a mesma configuração de isenção em Configurações. Um app de fechamento forçado não executa jobs ou alertas em segundo plano nem envia notificações push. Quando o usuário usa o app novamente, ele sai da hibernação e os jobs/alertas/notificações são executados novamente como de costume. Todos os jobs/alertas/notificações agendados antes de o app entrar em hibernação precisam ser reagendados.
OEMs que modificam a plataforma podem entrar em conflito com a implementação de hibernação do app. Por exemplo
- Modificar a definição de uso do app ou introduzir maneiras de ativar um app que não está no AOSP pode interromper a precisão do modo de suspensão do app.
- O mecanismo de restrição reservado de um OEM semelhante à hibernação de apps pode ter uma finalidade semelhante. Embora ambos possam existir, pode haver alguma sobreposição.
O CDD descreve um novo conjunto de requisitos para mudanças com base no uso do app, semelhante ao requisito 3.5.1 existente. A hibernação do app segue estes requisitos.
O código do framework fica em:
- repositório: platform/frameworks/base
- diretório: services/core/java/com/android/server/apphibernation
A lógica da política reside em:
- repo: platform/packages/modules/Permission
- diretório: PermissionController/src/com/android/permissioncontroller/hibernation
Arquitetura de alto nível
O serviço do sistema de hibernação de apps otimiza o armazenamento de apps usados com pouca frequência por um usuário e impede que eles sejam executados em segundo plano. Para alcançar esses resultados, quando hibernamos um app, fazemos o seguinte:
- Revogar permissões automaticamente
- Forçar o fechamento do app
- Excluir os arquivos ODEX e VDEX
- Excluir o cache do app
Nosso objetivo é implementar a hibernação como uma ação reversível para que o app ainda esteja disponível para o usuário pelo Iniciador e outras plataformas com os dados do app intactos. Ao iniciar o app, ele será restaurado do estado de parada forçada e continuará com a criação de arquivos ODEX e VDEX normalmente.
O design planejado tem duas partes principais:
- Como determinar quando um pacote precisa hibernar
- Como otimizar o pacote de hibernação
Um novo serviço do sistema,
AppHibernationService
, e um serviço de job, AppHibernationJobService,
em PermissionController
, são a cola que controla a tomada de decisão
geral e a lógica.
A determinação de quando um pacote deve entrar em hibernação é alimentada principalmente por
UsageStatsService
e gerenciada por AppHibernationJobService
em
PermissionController
. Essa lógica de política está presente em PermissionController
para
permitir que atualizemos dinamicamente pelo Mainline. Além disso, planejamos adicionar
um novo indicador, o uso de componentes, para capturar o uso dos componentes do pacote
(por exemplo, serviços, provedores de conteúdo) como uma nova
métrica em UsageStatsService
.
A otimização de um pacote é onde todas as economias e otimizações
reais acontecem. O AppHibernationService
se comunica com várias partes do sistema
para interromper o pacote, excluir dados de cache, excluir artefatos do ART e assim por diante.
A revogação de permissão é iniciada diretamente em AppHibernationJobService
para manter a funcionalidade de revogação automática em dispositivos com o Android 11 e versões anteriores.
Experiência do usuário
O usuário recebe informações e controles sobre quais apps podem ser hibernados.
Assim como na revogação automática, o usuário recebe uma notificação sobre quais apps estão em hibernação e tem a opção de acessar as configurações diretamente na notificação para abrir o app e sair da hibernação ou excluir o app não usado, se necessário.
Continuamos a oferecer suporte à intenção do desenvolvedor de pedir ao usuário uma isenção de hibernação com as permissões atuais que revogam automaticamente a intent de isenção.
Compatibilidade com versões anteriores
Os recursos específicos da hibernação estão disponíveis a partir do Android 12. Esse recurso não funciona em versões anteriores, porque os componentes da plataforma (como o novo serviço do sistema) não estão presentes. A revogação automática continua funcionando conforme implementado nas versões anteriores do SO.
No Android 12 e versões mais recentes, para garantir a compatibilidade com versões anteriores, um botão de hibernação é adicionado à página do app, em Apps e notificações, em Configurações, mantendo o botão de revogação automática original no submenu Permissões. Essa alternância controla a isenção geral do sistema de hibernação do app para o app.
Personalização
Parte da implementação faz parte do componente modular do sistema. Por isso, não recomendamos que os parceiros modifiquem o recurso. Os parceiros podem implementar recursos ou funcionalidades semelhantes, desde que sigam os requisitos do CDD.
A hibernação do app precisa ser ativada por padrão para todos os apps destinados ao Android 11 ou versões mais recentes. Isso é o mesmo que a revogação automática de permissões. Embora a configuração possa estar ativada, a implementação da hibernação do app pode ser diferente entre apps com segmentação para o Android 11 e o Android 12. Mais especificamente, a hibernação de apps só funciona para apps destinados ao Android 11, e é essencialmente apenas a revogação automática para apps destinados ao Android 12.
Além disso, os OEMs podem estar implementando um recurso semelhante. No entanto, esses recursos são direcionados em um cronograma muito mais curto para otimizações de bateria, que podem ser específicas do OEM. Todos os recursos de restrição de apps semelhantes desenvolvidos por OEMs podem coexistir com o sistema de hibernação do app, desde que atendam aos critérios definidos no CDD.
Teste
A hibernação do app tem CTS e testes de unidade para garantir que ele esteja funcionando corretamente.
AutoRevokeTest
AppHibernationIntegrationTest