Hibernação do app

Um usuário médio do Android instala mais de 50 apps nos dispositivos. Esse número aumenta à medida que o nível de RAM dos dispositivos aumenta. No entanto, um número significativo desses apps fica sem uso por um longo período.

A hibernação de apps hiberna apps que o usuário não usa há alguns meses, de forma parecida com a revogação automática de permissões. Isso interrompe o app e o coloca em um estado em que otimizamos o armazenamento em vez do desempenho. O revogação automática de permissões também está incluído nesse estado e compartilha a mesma configuração de isenção em Configurações. Um app forçado a parar não executa tarefas ou alertas em segundo plano e não pode enviar notificações push. Quando o usuário usar o app novamente, ele sairá da hibernação e jobs/alertas/notificações serão executados normalmente. Todos os jobs, alertas e notificações que foram programados antes da hibernação do app precisam ser reprogramados.

Os OEMs que modificam a plataforma podem entrar em conflito com a implementação da hibernação de apps. Por exemplo

  • Modificar a definição de uso do app ou introduzir maneiras de ativar um app que não estão no AOSP pode interromper a acurácia da hibernação de apps.
  • Um mecanismo de restrição proprietário de um OEM semelhante à hibernação de apps pode ter uma finalidade semelhante. Embora ambas 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 de apps segue estes requisitos.

O código do framework está em:

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

  • repo: platform/packages/modules/Permission
  • directory: 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 pouco usados por um usuário e impede que eles sejam executados em segundo plano. Para alcançar esses resultados, quando hibernamos um app, nós especificamente:

  • 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 no Launcher e em outras plataformas com dados intactos. Ao iniciar o app, vamos restaurá-lo do estado de parada forçada e continuar com a criação de arquivos ODEX e VDEX normalmente.

O design planejado se concentra em duas partes principais:

  • Determinar quando um pacote deve hibernar
  • Otimizar o pacote de hibernação

Um novo serviço de sistema, AppHibernationService, e um serviço de job, AppHibernationJobService,, em PermissionController são o que controla a tomada de decisões e a lógica gerais.

A determinação de quando um pacote deve hibernar é feita principalmente por UsageStatsService e gerenciada por AppHibernationJobServiceem PermissionController. Essa lógica de política está em PermissionControllerpara permitir que façamos atualizações dinâmicas 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 no UsageStatsService.

A otimização de um pacote é onde todas as economias e otimizações reais acontecem. AppHibernationService se comunica com várias partes do sistema para interromper o pacote, excluir dados de cache, excluir artefatos 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 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 tirar ele da hibernação ou excluir o app não usado, se necessário.

Continuamos apoiando a intenção do desenvolvedor de pedir ao usuário uma exceção à hibernação com a intenção de exceção de revogação automática de permissões atual.

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 funcionava em versões anteriores porque os componentes da plataforma (como o novo serviço do sistema) não estavam presentes. A revogação automática continua funcionando como implementada para as versões anteriores do SO.

A partir do Android 12, para garantir a compatibilidade com versões anteriores, um botão de ativação/desativação de hibernação é adicionado na página do app em Apps e notificações nas Configurações, mantendo o botão de ativação/desativação de revogação automática original no submenu Permissões. Essa chave controla a isenção geral do sistema de hibernação de apps para o app.

Personalização

Parte da implementação faz parte do componente modular do sistema. Por isso, não é recomendável que os parceiros modifiquem o recurso. Em vez disso, os parceiros podem implementar recursos ou funcionalidades semelhantes, desde que sigam os requisitos do CDD.

A hibernação de apps deve ser ativada por padrão para todos os apps destinados ao Android 11 ou versões mais recentes. Isso é o mesmo que revogação automática de permissões. Embora a configuração em si possa estar ATIVADA, a implementação da hibernação de apps pode variar entre apps para Android 11 e Android 12. Mais especificamente, a hibernação de apps só funciona para apps destinados ao Android 11, enquanto é 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 uma escala de tempo muito menor para otimizações de bateria, que podem ser específicas do OEM. Recursos semelhantes de restrição de apps desenvolvidos por OEMs podem coexistir com o sistema de hibernação de apps desde que atendam aos critérios definidos no CDD.

Teste

A hibernação de apps tem testes de unidade e CTS para garantir que ela esteja funcionando corretamente.