Register now for Android Dev Summit 2019!

Otimizar para o Soneca e o App em espera

A partir do Android 6.0 (API de nível 23), o Android apresenta dois recursos de economia de energia que prolongam a duração da bateria para os usuários ao controlar como os apps se comportam quando um dispositivo não está ligado a uma fonte de energia. O recurso Soneca reduz o consumo da bateria, adiando a CPU em segundo plano e a atividade de rede para apps quando o dispositivo não for utilizado por longos períodos de tempo. App em espera adia a atividade de rede em segundo plano para apps com os quais o usuário não tenha interagido recentemente.

Enquanto o dispositivo está no modo Soneca, o acesso de apps a certos recursos que consomem muita bateria é adiado até as janelas de manutenção. Restrições específicas estão listadas em Restrições de gerenciamento de energia.

Os recursos Soneca e App em espera controlam o comportamento de todos os apps em execução no Android 6.0 ou versão posterior, independentemente se são direcionados especificamente para a API de nível 23 ou não. Para garantir a melhor experiência para os usuários, teste seu app nos modos Soneca e App em espera e faça os ajustes necessários no código. As seções abaixo fornecem mais detalhes.

Entender o recurso Soneca

Se um usuário deixa um dispositivo desconectado e parado por um período de tempo, com a tela apagada, o dispositivo entra em modo Soneca. No modo Soneca, o sistema tenta economizar bateria, restringindo o acesso de apps à rede e a serviços de uso intensivo da CPU. Ele também impede que apps acessem a rede e adia trabalhos, sincronizações e alarmes padrão.

Periodicamente, o sistema sai do modo Soneca por um breve período para permitir que os apps executem as atividades adiadas. Durante essa janela de manutenção, o sistema executa todos os trabalhos, sincronizações e alarmes pendentes, e permite que os apps acessem a rede.

Figura 1. O Soneca fornece uma janela de manutenção recorrente para que os apps usem a rede e realizem atividades pendentes.

Na conclusão de cada janela de manutenção, o sistema entra em Soneca novamente, suspendendo o acesso à rede e adiando trabalhos, sincronizações e alarmes. Com o tempo, o sistema programa janelas de manutenção com frequência cada vez menor, ajudando a reduzir o consumo da bateria em casos de inatividade mais longa, quando o dispositivo não está conectado a um carregador.

Assim que o usuário ativa o dispositivo, movendo-o, ligando a tela ou conectando um carregador, o sistema sai do Soneca e todos os apps voltam à atividade normal.

Restrições do recurso Soneca

As seguintes restrições se aplicam aos apps durante o Soneca:

Lista de verificação do Soneca

Adaptar seu app ao recurso Soneca

O Soneca pode afetar apps de forma diferente, dependendo dos recursos que eles oferecem e dos serviços que usam. Muitos apps funcionam normalmente durante os ciclos do Soneca, sem modificação. Em alguns casos, você precisa otimizar a maneira com que seu app controla rede, alarmes, trabalhos e sincronizações. Apps precisam ser capazes de controlar as atividades de modo eficiente durante cada janela de manutenção.

O recurso Soneca é particularmente propenso a afetar atividades que os alarmes AlarmManager e timers controlam, já que alarmes no Android 5.1 (API de nível 22) ou anteriores não são acionados quando o sistema está no modo Soneca.

Para ajudar na programação de alarmes, o Android 6.0 (API de nível 23) apresenta dois novos métodos AlarmManager: setAndAllowWhileIdle() e setExactAndAllowWhileIdle(). Com esses métodos, você pode definir alarmes que disparam mesmo se o dispositivo estiver no modo Soneca.

Observação: nem setAndAllowWhileIdle() nem setExactAndAllowWhileIdle() podem disparar alarmes mais de uma vez a cada 9 minutos por app.

A restrição do Soneca sobre o acesso à rede provavelmente também pode afetar seu app, principalmente se ele depender de mensagens em tempo real, como convites ou notificações. Se seu app requer uma conexão persistente com a rede para receber mensagens, você precisa usar o Firebase Cloud Messaging (FCM), se possível.

Para confirmar que seu app se comporta como esperado no modo Soneca, você pode usar comandos adb para forçar o sistema a entrar e sair do Soneca e observar o comportamento do app. Para mais detalhes, consulte Testes de Soneca e App em espera.

Entender o App em espera

O App em espera permite que o sistema determine se um app está ocioso quando o usuário não o está usando ativamente. O sistema determina isso quando o usuário fica sem tocar no app por determinado período e nenhuma das condições a seguir se aplica:

  • O usuário inicia o app explicitamente.
  • O app tem um processo atualmente em primeiro plano, seja uma atividade ou serviço de primeiro plano ou que esteja em uso por outra atividade ou serviço de primeiro plano.

    Observação: você só precisa usar um serviço de primeiro plano em tarefas que o usuário espera que o sistema execute imediatamente ou sem interrupção. Entre elas estão fazer upload de uma foto para uma rede social ou tocar música, mesmo quando o app player de música não estiver em primeiro plano. Não é recomendado iniciar um serviço no primeiro plano simplesmente para evitar que o sistema determine que seu app está ocioso.

  • O app gera uma notificação que os usuários veem na tela de bloqueio ou na bandeja de notificação.
  • O app é um app de administração ativo do dispositivo, por exemplo, um controlador de política de dispositivo. Embora eles geralmente sejam executados em segundo plano, apps de administração do dispositivo nunca entram em espera porque precisam permanecer disponíveis para receber políticas de um servidor a qualquer momento.

Quando o usuário conecta o dispositivo a uma fonte de alimentação, o sistema libera apps do estado de espera, permitindo-lhes acessar livremente a rede e executar os trabalhos e sincronizações pendentes. Se o dispositivo permanece ocioso por longos períodos, o sistema permite aos apps ociosos acessar a rede aproximadamente uma vez por dia.

Uso do FCM para interagir com o app enquanto o dispositivo está ocioso

O Firebase Cloud Messaging (FCM) é um serviço de nuvem para dispositivos que permite aceitar mensagens downstream em tempo real entre serviços de back-end e apps em dispositivos Android. O FCM fornece uma conexão única e persistente com a nuvem, e todos os apps que precisam de mensagens em tempo real podem compartilhar essa conexão. Essa conexão compartilhada otimiza significativamente o consumo da bateria, tornando desnecessário que vários apps mantenham as próprias conexões persistentes separadas, o que pode esgotar a bateria rapidamente. Por esse motivo, se seu app requer integração de mensagens com um serviço de back-end, é altamente recomendável que você use o FCM, se possível, em vez de manter sua própria conexão de rede persistente.

O FCM é otimizado para trabalhar com os modos ociosos dos recursos Soneca e App em espera por meio de mensagens FCM de alta prioridade. As mensagens FCM de alta prioridade permitem que você desperte seu app de forma confiável para acessar a rede, mesmo se o dispositivo do usuário estiver em Soneca ou se o app estiver no modo App em espera. Nos modos Soneca ou App em espera, o sistema envia a mensagem e dá ao app acesso temporário a serviços de rede e wakelocks parciais, retornando o dispositivo ou app ao estado ocioso logo depois.

Mensagens FCM de alta prioridade não afetam o modo Soneca nem o estado de qualquer outro app. Isso significa que seu app pode usá-las para se comunicar eficientemente, minimizando o impacto a baterias em todo o sistema e dispositivo.

Como prática recomendada geral, se seu app requer mensagens descendentes, ele precisa usar o FCM. Se seu servidor e cliente já utilizam o FCM, certifique-se de que seu serviço usa mensagens de alta prioridade para mensagens críticas, porque isso despertará apps de forma confiável, mesmo se o dispositivo estiver no modo Soneca.

Compatibilidade com outros casos de uso

Quase todos os apps precisam ser compatíveis com o Soneca ao controlar conectividade de rede, alarmes, trabalhos e sincronizações e usar mensagens FCM de alta prioridade. Para um conjunto limitado de casos de uso, isso pode não ser suficiente. Para esses casos, o sistema fornece uma lista de permissões configurável de apps que são parcialmente isentos do modo Soneca e de otimizações do App em espera.

Apps que estejam na lista de permissões podem usar a rede e manter wake locks parciais com o Soneca e o App em espera. No entanto, outras restrições ainda se aplicam ao app colocado na lista de permissões, da mesma forma que ocorre com outros apps. Por exemplo, os trabalhos e sincronizações dos apps da lista de permissões são adiados (na API de nível 23 e anteriores), e os alarmes AlarmManager regulares deles não disparam. Um app pode verificar se está atualmente na lista de permissões de isenção chamando isIgnoringBatteryOptimizations().

Os usuários podem configurar manualmente a lista de permissões em Configurações > Bateria > Otimização da bateria. Alternativamente, o sistema oferece formas para apps solicitarem que os usuários os coloquem na lista de permissões.

Antes de pedir ao usuário para adicionar seu app à lista de permissões, verifique se o app corresponde aos casos de uso aceitáveis para lista de permissões.

Observação: as políticas do Google Play proíbem apps de solicitar isenção direta dos recursos de Gerenciamento de Energia do Android 6.0+ (Soneca e App em espera), a menos que a função principal do app seja afetada negativamente.

Testes com os recursos Soneca e App em espera

Para garantir uma ótima experiência para os usuários, você precisa testar seu app totalmente nos modos Soneca e App em espera.

Testar o app com o Soneca

Você pode testar o modo Soneca, seguindo estes passos:

  1. Configure um dispositivo de hardware ou dispositivo virtual com Android 6.0 (API de nível 23) ou sistema de imagem posterior.
  2. Conecte o dispositivo à máquina de desenvolvimento e instale o app.
  3. Execute o app e deixe-o ativo.
  4. Force o sistema a entrar no modo ocioso executando o seguinte comando:
        $ adb shell dumpsys deviceidle force-idle
        
  5. Quando estiver pronto, saia do modo ocioso executando o seguinte comando:
        $ adb shell dumpsys deviceidle unforce
        
  6. Reative o dispositivo executando o seguinte comando:
        $ adb shell dumpsys battery reset
          
  7. Observe o comportamento do seu app depois de reativar o dispositivo. Certifique-se de que o app se recupera normalmente quando o dispositivo sai do modo Soneca.

Testar o app com o App em espera

Para testar o modo App em espera:

  1. Configure um dispositivo de hardware ou dispositivo virtual com Android 6.0 (API de nível 23) ou sistema de imagem posterior.
  2. Conecte o dispositivo à máquina de desenvolvimento e instale o app.
  3. Execute o app e deixe-o ativo.
  4. Execute os seguintes comandos para forçar o app a entrar no modo App em espera:
    $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
  5. Simule o despertar do seu app usando os seguintes comandos:
    $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
  6. Observe o comportamento do seu app depois de despertá-lo. Certifique-se de que o app se recupera normalmente do modo de espera. É necessário verificar principalmente se as notificações e os trabalhos de segundo plano do app continuam a funcionar como esperado.

Casos de uso aceitáveis para colocar na lista de permissões

A tabela abaixo destaca os casos de uso aceitáveis para solicitar ou ser incluído na lista de permissões de exceção para otimizações de bateria. Em geral, seu app não deve estar na lista de permissões, a menos que os modos Soneca ou App em espera atrapalhem a função principal do app ou se houver uma razão técnica pela qual seu app não pode usar mensagens FCM de alta prioridade.

Para mais informações, consulte Compatibilidade com outros casos de uso.

Tipo Caso de uso Pode usar o FCM? Inclusão na lista de permissões aceitável? Notas
Mensagens instantâneas, bate-papo ou app de chamada. Requer entrega de mensagens em tempo real para usuários enquanto o dispositivo está no modo Soneca ou o app está no modo App em espera. Sim, usando o FCM. Não aceitável É necessário usar mensagens FCM de alta prioridade para despertar o app e acessar a rede.
Sim, mas não está usando mensagens FCM de alta prioridade.
Mensagens instantâneas, bate-papo ou app de chamada; apps empresariais de VOIP. Não, não pode usar FCM devido à dependência técnica de outro serviço de mensagens ou porque os recursos Soneca e App em espera atrapalham a função principal do app. Aceitável
App de automação de tarefas A função principal do app é programar ações automatizadas, como mensagens instantâneas, chamadas de voz, novo gerenciamento de fotos ou ações de localização. Se aplicável. Aceitável
App complementar de dispositivo periférico A função principal do app é manter uma conexão persistente com o dispositivo periférico para que ele tenha acesso à Internet. Se aplicável. Aceitável
O app só precisa se conectar a um dispositivo periférico periodicamente para sincronizar ou precisa se conectar somente a dispositivos como fones de ouvido sem fio, conectados via perfis de Bluetooth padrão. Se aplicável. Não aceitável