Hibernação do app

Um usuário médio do Android instala mais de 50 apps nos dispositivos (o número aumenta à medida que o nível de 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 hiberna apps que o usuário não usa há alguns meses, 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 compartilha a mesma configuração de isenção nas Configurações. Um app forçado a parar não executa tarefas nem alertas em segundo plano e não pode enviar 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 que foram programados antes da hibernação do app precisam ser reprogramados.

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 hibernação do app.
  • Um mecanismo de restrição exclusivo de 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 atual. A hibernação do app segue estes requisitos.

O código do framework está em:

A lógica da política está em:

  • repositório: 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:

  • Revogação automática de permissões
  • 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 precisa hibernar é fornecida 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 da 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 solicitar ao usuário uma isenção da hibernação com a intenção de isenção de revogação automática de permissões.

Compatibilidade com versões anteriores

Os recursos específicos de 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 como implementado para as versões anteriores do SO.

No Android 12 e versões mais recentes, para garantir a compatibilidade anterior, um botão de hibernação foi 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 de apps precisa estar ativada por padrão para todos os apps destinados ao Android 11 ou mais recente. 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 do app só funciona para apps destinados ao Android 11, enquanto a revogação automática é apenas para apps destinados ao Android 12.

Além disso, os OEMs podem estar implementando um recurso semelhante. No entanto, esses recursos são direcionados a um período muito mais curto para otimizações de bateria, que podem ser específicas do OEM. Qualquer recurso de restrição de app semelhante desenvolvido por OEMs pode coexistir com o sistema de hibernação de apps desde que atenda aos critérios atuais definidos no CDD.

Teste

A hibernação do app tem CTS e testes de unidade para garantir que ele esteja funcionando corretamente.