Gerenciamento de energia

O Android 9 (API nível 28) introduz novos recursos para melhorar o gerenciamento de energia dos dispositivos. Essas mudanças, juntamente com os recursos já presentes nas versões anteriores, ajudam a garantir que os recursos do sistema sejam fornecidos aos aplicativos que mais precisam deles.

Os recursos de gerenciamento de energia se encaixam em duas categorias:

Intervalos de aplicativos em espera
O sistema limita o acesso dos aplicativos aos recursos do dispositivo, como a CPU ou a bateria, com base nos padrões de uso do usuário. Esse é um novo recurso do Android 9.
Melhorias de economia de bateria
Quando a economia de bateria é ativada, o sistema aplica restrições a todos os aplicativos. Esse é um recurso que já existia, mas que foi aprimorado no Android 9.

Observação: Essas mudanças se aplicam a todos os aplicativos, sejam eles direcionados ao Android 9 ou não.

Intervalos de aplicativos em espera

O Android 9 introduz um novo recurso de gerenciamento de bateria, os Intervalos de aplicativos em espera Os Intervalos de aplicativos em espera ajudam o sistema a priorizar as solicitações de recursos dos aplicativos com base na frequência de uso dos aplicativos e em quando eles foram usados pela última vez. De acordo com seus padrões de uso, cada aplicativo é inserido em um de cinco intervalos de prioridade. O sistema limita os recursos do dispositivo disponíveis para cada aplicativo dependendo do intervalo em que ele se encontra.

Os cinco intervalos priorizam aplicativos em grupos com base nas seguintes características:

Ativos

Um aplicativo é inserido no intervalo de ativos se o usuário o estiver utilizando no momento, por exemplo:

  • O aplicativo iniciou uma atividade
  • O aplicativo está executando um serviço em primeiro plano
  • O aplicativo tem um adaptador de sincronização associado a um provedor de conteúdo usado por um aplicativo de primeiro plano
  • O usuário clica em uma notificação do aplicativo

Se um aplicativo estiver no intervalo de ativos, o sistema não restringe seus jobs, alarmes ou mensagens FCM.

Conjunto de trabalho

Um aplicativo é inserido no intervalo de conjunto de trabalho se ele for executado com frequência, mas se não estiver ativo no momento. Por exemplo, um aplicativo de mídia social que o usuário inicia quase todos os dias provavelmente estará no conjunto de trabalho. Aplicativos também são promovidos para o intervalo de conjunto de trabalho se forem usados indiretamente.

Se um aplicativo estiver no conjunto de trabalho, o sistema impõe restrições leves em sua capacidade de executar jobs e acionar alarmes. Para obter detalhes, consulte Restrições de gerenciamento de energia.

Frequentes

Um aplicativo é inserido no intervalo de frequentes se for usado com regularidade, mas não necessariamente todos os dias. Por exemplo, um aplicativo de rastreamento de exercícios físicos que o usuário executa na academia pode estar no intervalo de frequentes.

Se um aplicativo estiver no intervalo de frequentes, o sistema impõe restrições mais rígidas em sua capacidade de executar jobs e acionar alarmes e também limita suas mensagens FCM de alta prioridade. Para obter detalhes, consulte Restrições de gerenciamento de energia.

Raros

Um aplicativo é inserido no intervalo de raros se não for usado com frequência. Por exemplo, um aplicativo de hotel que o usuário executa somente quando se hospeda nesse hotel pode estar no intervalo de raros.

Se um aplicativo estiver no intervalo de dados, o sistema impõe restrições rígidas em sua capacidade de executar jobs, acionar alarmes e receber mensagens FCM de alta prioridade. O sistema também limita a capacidade desse aplicativo de se conectar à Internet. Para obter detalhes, consulte Restrições de gerenciamento de energia.

Nunca

Aplicativos que foram instalados mas nunca executados são inseridos no intervalo de nunca. O sistema impõe restrições bastante severas a esses aplicativos.

O sistema atribui cada aplicativo a um intervalo de prioridade de forma dinâmica e os reatribui conforme a necessidade. O sistema pode usar um aplicativo pré-carregado que utiliza o aprendizado de máquina para determinar a probabilidade de cada aplicativo ser usado, e então atribui esses aplicativos aos intervalos apropriados. Se o aplicativo do sistema não estiver presente em um dispositivo, ele utiliza aplicativos de classificação que se baseiam em quando os aplicativos foram usados pela última vez. Aplicativos mais ativos são inseridos em intervalos que lhes concedem mais prioridade, disponibilizando a eles mais recursos do sistema. Especificamente, o intervalo determina a frequência da execução dos jobs do aplicativo, do acionamento de alarmes e do recebimento de mensagens Firebase Cloud Messaging (FCM) de alta prioridade. Essas restrições se aplicam somente quando o dispositivo está utilizando a bateria; o sistema não impõe essas restrições a aplicativos enquanto o dispositivo está sendo carregado.

Cada fabricante pode definir seus próprios critérios para como aplicativos não ativos são atribuídos a intervalos. Você não deve tentar influenciar em que intervalo seu aplicativo é inserido. Em vez disso, concentre-se em garantir que seu aplicativo se comporte de forma adequada, qualquer que seja seu intervalo. Seu aplicativo pode descobrir em que intervalo ele se encontra chamando o novo método UsageStatsManager.getAppStandbyBucket().

Observação: Aplicativos que se encontram na lista de permissões do modo Soneca estão isentos das restrições baseadas nos Intervalos de aplicativos em espera.

Práticas recomendadas

Se seu aplicativo já segue as práticas recomendadas para modo Soneca e aplicativo em espera, você não terá dificuldades para lidar com os novos recursos de gerenciamento de energia. Entretanto, alguns comportamentos de aplicativos que antes funcionavam corretamente agora podem causar problemas.

  • Não tente manipular o sistema para inserir seu aplicativo em um intervalo específico. Os métodos de inserção em intervalos do sistema podem mudar e cada fabricante de dispositivo pode optar por criar seu próprio aplicativo de inserção em intervalos, com seu próprio algoritmo. Em vez disso, certifique-se de que seu aplicativo se comporte de forma adequada, qualquer que seja seu intervalo.
  • Se um aplicativo não tiver uma atividade de inicialização, é possível que ele nunca seja promovido para o intervalo de ativos. Pode ser interessante reprojetar seu aplicativo para que ele tenha essa atividade.
  • Se as notificações do aplicativo não forem acionáveis, os usuários não poderão causar a promoção do aplicativo para o intervalo de ativos ao interagir com as notificações. Nesse caso, pode ser recomendável reprojetar algumas notificações apropriadas para que elas permitam uma resposta do usuário. Para obter algumas diretrizes, consulte os Padrões de design de notificações do Material Design.
  • Da mesma forma, se o aplicativo não mostrar uma notificação ao receber uma mensagem FCM de alta prioridade, ele não dará ao usuário a chance de interagir com o aplicativo e promovê-lo ao intervalo de ativos. Na verdade, o único uso pretendido para mensagens FCM de alta prioridade é enviar uma notificação para o usuário, portanto, essa situação nunca deve ocorrer. Se você marcar uma mensagem FCM incorretamente como alta prioridade quando ela não aciona uma interação com o usuário, isso pode ter outras consequências negativas; por exemplo, isso pode fazer com que seu aplicativo consuma toda a sua cota, resultando em mensagens FCM realmente urgentes tratadas como prioridade normal.

    Observação: se o usuário dispensar uma notificação repetidas vezes, o sistema oferecerá a ele a opção de bloquear essa notificação no futuro. Não envie notificações excessivas ao usuário apenas para tentar manter seu aplicativo no intervalo de ativos!

  • Se aplicativos estiverem divididos entre vários pacotes, esses pacotes podem ser atribuídos a diferentes intervalos e, dessa forma, ter diferentes níveis de acesso. Você deve testar esses aplicativos com os pacotes atribuídos a vários intervalos para garantir que o aplicativo se comporte corretamente.

Melhorias de economia de bateria

O Android 9 apresenta diversas melhorias no modo de economia de bateria. O fabricante do dispositivo determina as restrições precisas impostas. Por exemplo, em compilações AOSP, o sistema aplica as seguintes restrições:

  • O sistema coloca aplicativos em modo de espera de forma mais agressiva em vez de esperar que eles fiquem ociosos.
  • Os limites de execução em segundo plano se aplicam a todos os aplicativos, independentemente do nível de API a que eles se destinam.
  • Serviços de localização podem ser desativados quando a tela é desligada.
  • Aplicativos em segundo plano não têm acesso à rede.

Além disso, há outras otimizações de energia específicas a dispositivos. Para obter todas as informações, consulte Apêndice: Restrições do gerenciamento de energia.

Como sempre, é recomendável testar seu aplicativo com a economia de energia ativada. Você pode ativá-la manualmente na tela Settings > Battery Saver do dispositivo.

Teste e solução de problemas

Os novos recursos de gerenciamento de energia afetam todos os aplicativos executados em dispositivos com Android 9, mesmo que esses aplicativos sejam direcionados ao Android 9. É importante garantir que seu aplicativo se comporte de forma correta nesses dispositivos.

Não deixe de testar os principais casos de uso do seu aplicativo em diversas condições para verificar como os recursos de gerenciamento de energia interagem entre si. Você pode usar comandos do Android Debug Bridge para ativar e desativar alguns dos recursos.

Comandos do Android Debug Bridge

Você pode usar comandos shell do Android Debug Bridge para testar vários dos recursos de gerenciamento de energia.

Para obter informações sobre como usar o ADB para inserir seu dispositivo no modo Soneca, consulte Testes de Soneca e Aplicativo em espera.

Intervalos de aplicativos em espera

Você pode usar o ADB para manualmente atribuir seu aplicativo a um Intervalo de aplicativos em espera. Para alterar o intervalo de um aplicativo, use o seguinte comando:

$ adb shell am set-standby-bucket packagename active|working_set|frequent|rare

Você também pode usar esse comando para definir vários pacotes de uma vez:

$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...

Para verificar em qual intervalo seu aplicativo se encontra, execute

$ adb shell am get-standby-bucket [packagename]

Se você não passar um parâmetro packagename, o comando listará os intervalos de todos os aplicativos. Um aplicativo também pode descobrir seu intervalo no tempo de execução ao chamar o novo método UsageStatsManager.getAppStandbyBucket().

Economia de bateria

Há vários comandos para testar como seu aplicativo se comporta em condições de pouca bateria.

Observação: Você também pode usar a tela Settings > Battery saver do dispositivo para colocá-lo no modo de economia de bateria.

Para simular um dispositivo desconectado da tomada, use o comando

$ adb shell dumpsys battery unplug

Para testar como o dispositivo se comporta em condições de pouca bateria, use este comando:

$ adb shell settings put global low_power 1

Quando terminar de testar, você pode desfazer suas configurações manuais de dispositivo com este comando:

$ adb shell dumpsys battery reset
“Apêndice: Restrições do gerenciamento de energia”