Medir a potência do componente

É possível determinar o consumo de energia de componentes individuais comparando a corrente consumida pelo dispositivo quando o componente está no estado desejado (como ligado, ativo, digitalização) e quando ele está desligado. Meça a corrente instantânea média consumida no dispositivo em uma tensão nominal usando um monitor de energia externo, como uma fonte de alimentação de bancada ou ferramentas especializadas de monitoramento de bateria (como o software Power Monitor e Power Tool da Monsoon Solution Inc.).

Os fabricantes geralmente fornecem informações sobre a corrente consumida por um componente individual. Use essas informações se elas representam com precisão a corrente extraída da bateria do dispositivo na prática. No entanto, valide os valores fornecidos pelo fabricante antes de usá-los no perfil de energia do dispositivo.

Controlar o consumo de energia

Ao medir, verifique se o dispositivo não tem uma conexão com uma fonte de carga externa, como uma conexão USB com um host de desenvolvimento usado ao executar o Android Debug Bridge (adb). O dispositivo em teste pode consumir corrente do host, reduzindo as medições na bateria. Evite conexões USB On-The-Go (OTG), porque o dispositivo OTG pode consumir a corrente do dispositivo em teste.

Exclua o componente que está sendo medido. O sistema precisa ser executado em um nível constante de consumo de energia para evitar medições imprecisas causadas por mudanças em outros componentes. As atividades do sistema que podem causar mudanças indesejadas nas medições de energia incluem:

  • Atividade de recebimento, transmissão ou busca de celular, Wi-Fi e Bluetooth. Quando não estiver medindo a potência do rádio celular, defina o dispositivo para o modo avião e ative o Wi-Fi ou o Bluetooth, conforme necessário.
  • Tela ligada/desligada. As cores exibidas enquanto a tela está ligada podem afetar o consumo de energia em algumas tecnologias de tela. Desligue a tela ao medir valores de componentes que não estão na tela.
  • Suspensão/retomada do sistema. Um estado de tela desligada pode acionar uma suspensão do sistema, colocando partes do dispositivo em um estado de energia reduzida ou desligado. Isso pode afetar o consumo de energia do componente que está sendo medido e introduzir grandes variações nas leituras de energia, já que o sistema retorna periodicamente para enviar alarmes etc. Para mais detalhes, consulte Controlar a suspensão do sistema.
  • CPUs que mudam de velocidade e entram/saem do estado inativo do programador de baixo consumo de energia. Durante a operação normal, o sistema faz ajustes frequentes nas velocidades da CPU, no número de núcleos de CPU on-line e em outros estados do núcleo do sistema, como velocidade do barramento de memória e tensões de trilhos de energia associados a CPUs e memória. Durante o teste, esses ajustes afetam as medições de energia:
    • As operações de escalonamento de velocidade da CPU podem reduzir a quantidade de escalonamento de clock e tensão dos barramentos de memória e de outros componentes principais do sistema.
    • A programação de atividades pode afetar a porcentagem do tempo que as CPUs passam em estados ociosos de baixo consumo de energia. Para saber como impedir que esses ajustes ocorram durante o teste, consulte Como controlar as velocidades da CPU.

Por exemplo, Joe Droid quer calcular o valor de screen.on para um dispositivo. Ele ativa o modo avião no dispositivo, executa o dispositivo em um estado de corrente estável, mantém a velocidade da CPU constante e usa um wakelock parcial para evitar a suspensão do sistema. Em seguida, ele desliga a tela do dispositivo e faz uma medição (200 mA). Em seguida, ele liga a tela do dispositivo no brilho mínimo e faz outra medição (300 mA). O valor de screen.on é 100 mA (300 - 200).

Observação: para componentes que não têm uma forma de onda plana de consumo de corrente quando ativos (como rádio celular ou Wi-Fi), meça a corrente média ao longo do tempo usando uma ferramenta de monitoramento de energia.

Ao usar uma fonte de energia externa no lugar da bateria do dispositivo, o sistema pode apresentar problemas devido a um termistor de bateria desconectado ou pinos integrados do indicador de combustível. Por exemplo, uma leitura inválida da temperatura da bateria ou da capacidade restante pode encerrar o kernel ou o sistema Android. Baterias falsas podem fornecer sinais em pinos de termistor ou de medidor de combustível que imitam leituras de temperatura e estado de carga de um sistema normal, além de fornecer fios convenientes para conexão a fontes de alimentação externas. Como alternativa, você pode modificar o sistema para ignorar os dados inválidos da bateria ausente.

Suspensão do sistema de controle

Esta seção descreve como evitar o estado de suspensão do sistema quando você não quer que ele interfira em outras medições e como medir o consumo de energia do estado de suspensão do sistema quando você quer medir.

Impedir a suspensão do sistema

A suspensão do sistema pode introduzir variações indesejadas nas medições de energia e colocar componentes do sistema em estados de baixo consumo de energia inadequados para medir o uso de energia ativo. Para evitar que o sistema seja suspenso enquanto a tela está desligada, use um wakelock parcial temporário. Usando um cabo USB, conecte o dispositivo a um host de desenvolvimento e emita o seguinte comando:

adb shell "echo temporary > /sys/power/wake_lock"

Enquanto estiver em wake_lock, o estado de tela desligada não aciona uma suspensão do sistema. Desconecte o cabo USB do dispositivo antes de medir o consumo de energia.

Para remover o wakelock:

adb shell "echo temporary > /sys/power/wake_unlock"

Medição de suspensão do sistema

Para medir o consumo de energia durante o estado de suspensão do sistema, meça o valor de cpu.idle no perfil de energia. Antes de medir:

  • Remova os wakelocks existentes (conforme descrito acima).
  • Coloque o dispositivo no modo avião para evitar atividades simultâneas pela rede celular, que podem ser executadas em um processador separado das partes do SoC controladas pela suspensão do sistema.
  • Para verificar se o sistema está suspenso, faça o seguinte:
    • Confirmar se as leituras atuais se estabilizam em um valor constante. As leituras precisam estar dentro do intervalo esperado para o consumo de energia do estado de suspensão do SoC, além do consumo de energia dos componentes do sistema que permanecem com energia (como o USB PHY).
    • Verificação da saída do console do sistema.
    • Observar indicações externas do status do sistema (como um LED que se apaga quando não está em suspensão).

Controlar as velocidades da CPU

As CPUs ativas podem ser ativadas ou desativadas, ter as velocidades do relógio e as tensões associadas alteradas (possivelmente afetando também as velocidades do barramento de memória e outros estados de energia do núcleo do sistema) e podem entrar em estados de inatividade de energia mais baixos enquanto estão no loop de inatividade do kernel. Ao medir diferentes estados de energia da CPU para o perfil de energia, evite a variação de consumo de energia ao medir outros parâmetros. O perfil de energia presume que todas as CPUs têm as mesmas velocidades e características de energia disponíveis.

Ao medir a potência da CPU ou mantê-la constante para fazer outras medições, mantenha o número de CPUs on-line constante, como ter uma CPU on-line e o restante off-line/desconectado. Manter todas as CPUs, exceto uma, em programação ociosa pode produzir resultados aceitáveis. A interrupção do framework do Android com adb shell stop pode reduzir a atividade de programação do sistema.

Especifique as velocidades de CPU disponíveis para o dispositivo na entrada cpu.speeds do perfil de energia. Para conferir uma lista das velocidades de CPU disponíveis, execute:

adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state

Essas velocidades correspondem às medições de energia correspondentes no valor cpu.active.

Para plataformas em que o número de núcleos conectados afeta significativamente o consumo de energia, talvez seja necessário modificar o driver ou o governador de cpufreq da plataforma. A maioria das plataformas oferece suporte ao controle da velocidade da CPU usando o governor cpufreq do espaço do usuário e usando interfaces sysfs para definir a velocidade. Por exemplo, para definir a velocidade de 200 MHz em um sistema com apenas uma CPU ou todas as CPUs que compartilham uma política cpufreq comum, use o console do sistema ou o adb shell para executar os seguintes comandos:

echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

Observação: os comandos exatos variam de acordo com a implementação de cpufreq da plataforma.

Esses comandos garantem que a nova velocidade não esteja fora dos limites permitidos, definem a nova velocidade e, em seguida, imprimem a velocidade em que a CPU está realmente em execução (para verificação). Se a velocidade mínima atual antes da execução for maior que 200000, talvez seja necessário inverter a ordem das duas primeiras linhas ou executar a primeira linha novamente para reduzir a velocidade mínima antes de definir a velocidade máxima.

Para medir a corrente consumida por uma CPU que está executando em várias velocidades, use o console do sistema para colocar a CPU em um loop de CPU usando o comando:

# while true; do true; done

Faça a medição enquanto o loop é executado.

Alguns dispositivos podem limitar a velocidade máxima da CPU ao realizar a limitação térmica devido a uma alta medição de temperatura (ou seja, após executar CPUs em altas velocidades por períodos prolongados). Observe essa limitação usando a saída do console do sistema ao fazer medições ou verificando o registro do kernel após a medição.

Para o valor cpu.awake, meça a energia consumida quando o sistema não está em suspensão e não está executando tarefas. A CPU precisa estar em um ciclo de inatividade de um programador de baixo consumo de energia, possivelmente executando uma instrução ARM Wait For Event ou em um estado de baixo consumo de energia específico do SoC com uma latência de saída rápida adequada para uso inativo.

Para o valor cpu.active, meça a energia quando o sistema não estiver no modo de suspensão e não estiver executando tarefas. Uma CPU (geralmente a principal) precisa executar a tarefa enquanto todas as outras precisam estar em estado inativo.

Medir a energia da tela

Ao medir a tela ligada, verifique se outros dispositivos normalmente ativados quando a tela está ativada também estão ligados. Por exemplo, se a tela sensível ao toque e a luz de fundo da tela normalmente estiverem ativas quando a tela estiver ligada, verifique se esses dispositivos estão ligados ao fazer a medição para ter um exemplo realista de uso de energia da tela.

Algumas tecnologias de tela variam no consumo de energia de acordo com as cores exibidas, fazendo com que as medições de energia variem consideravelmente, dependendo do que é mostrado na tela no momento da medição. Ao medir, verifique se a tela está exibindo algo que tenha características de uma tela realista. Procure um meio-termo entre uma tela toda preta (que consome menos energia para algumas tecnologias) e uma tela toda branca. Uma escolha comum é a visualização de uma programação no app Agenda, que tem uma mistura de elementos com e sem fundo branco.

Meça a tela com a alimentação no brilho de tela/iluminação de fundo mínimo e máximo. Para definir o brilho mínimo:

  • Usar a interface do Android (não recomendado). Defina o controle deslizante "Configurações > Brilho da tela" no brilho mínimo. No entanto, a interface do Android permite definir o brilho apenas para um mínimo de 10 a 20% do brilho possível do painel ou da luz de fundo e não permite definir o brilho tão baixo que a tela não fique visível sem muito esforço.
  • Usar um arquivo sysfs (recomendado). Se disponível, use um arquivo sysfs para controlar o brilho do painel até o mínimo suportado pelo hardware.

Além disso, se o arquivo sysfs da plataforma permitir ativar e desativar o painel LCD, a luz de fundo e a tela touchscreen, use o arquivo para fazer medições com a tela ligada e desligada. Caso contrário, configure um wakelock parcial para que o sistema não seja suspenso e, em seguida, ligue e desligue a tela com o botão liga/desliga.

Medir a potência do Wi-Fi

Faça medições de Wi-Fi em uma rede relativamente silenciosa. Evite introduzir trabalho extra processando grandes volumes de tráfego de transmissão que não estão relacionados à atividade que está sendo medida.

O valor wifi.on mede a energia consumida quando o Wi-Fi está ativado, mas não está transmitindo ou recebendo ativamente. Isso geralmente é medido como o delta entre o consumo atual no estado de suspensão (suspensão) do sistema com o Wi-Fi ativado e desativado.

O valor wifi.scan mede a energia consumida durante uma verificação de Wi-Fi para pontos de acesso. Os aplicativos podem acionar verificações de Wi-Fi usando a classe WifiManager API startScan(). Você também pode abrir "Configurações > Wi-Fi", que realiza verificações de ponto de acesso a cada poucos segundos com um salto aparente no consumo de energia, mas você precisa subtrair a energia da tela dessas medições.

Observação: use uma configuração controlada (como iperf) para gerar tráfego de recebimento e transmissão de rede.