Você pode determinar o consumo de energia de cada componente comparando a corrente consumida pelo dispositivo quando o componente está no estado desejado (como ligado, ativo, em varredura) e quando o componente 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 Monsoon Solution Inc. Power Monitor e Power Tool).
Os fabricantes geralmente fornecem informações sobre a corrente consumida por um componente individual. Use essas informações se elas representarem com precisão a corrente consumida pela bateria do dispositivo na prática. No entanto, valide os valores fornecidos pelo fabricante antes de usá-los no perfil de energia do seu dispositivo.
Controle o consumo de energia
Ao medir, certifique-se de que o dispositivo não tenha uma conexão com uma fonte de carga externa, como uma conexão USB a um host de desenvolvimento usado ao executar o Android Debug Bridge (adb). O dispositivo em teste pode consumir corrente do host, diminuindo assim as medições na bateria. Evite conexões USB On-The-Go (OTG), pois o dispositivo OTG pode consumir corrente do dispositivo em teste.
Excluindo o componente que está sendo medido, o sistema deve funcionar com um nível constante de consumo de energia para evitar medições imprecisas causadas por alterações em outros componentes. As atividades do sistema que podem introduzir alterações indesejadas nas medições de potência incluem:
- Atividade de recepção, transmissão ou digitalização de celular, Wi-Fi e Bluetooth . Quando não estiver medindo a potência do rádio celular, coloque o dispositivo no modo avião e habilite o Wi-Fi ou o Bluetooth conforme apropriado.
- Ligar/desligar tela . 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 sejam da tela.
- Suspensão/retomada do sistema . Um estado de tela desligada pode desencadear a suspensão do sistema, colocando partes do dispositivo em um estado de baixo consumo de energia ou desligado. Isto pode afetar o consumo de energia do componente que está sendo medido e introduzir grandes variações nas leituras de energia à medida que o sistema retoma periodicamente o envio de alarmes, etc. Para obter detalhes, consulte Controlando a suspensão do sistema .
- CPUs alterando a velocidade e entrando/saindo do estado ocioso do agendador 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 dos trilhos de alimentação associados às CPUs e à memória. Durante os testes, esses ajustes afetam as medições de potência:
- As operações de escalonamento de velocidade da CPU podem reduzir a quantidade de escalonamento de clock e tensão de barramentos de memória e outros componentes principais do sistema.
- A atividade de agendamento pode afetar a porcentagem de tempo que as CPUs passam em estados ociosos de baixo consumo de energia. Para obter detalhes sobre como evitar que esses ajustes ocorram durante os testes, consulte Controlando as velocidades da CPU .
Por exemplo, Joe Droid deseja calcular o valor screen.on
para um dispositivo. Ele ativa o modo avião no dispositivo, executa o dispositivo em um estado atual estável, mantém a velocidade da CPU constante e usa um wakelock parcial para evitar a suspensão do sistema. Joe então desliga a tela do dispositivo e faz uma medição (200 mA). Em seguida, Joe liga a tela do dispositivo com brilho mínimo e faz outra medição (300 mA). O valor screen.on
é 100 mA (300 - 200).
Nota : Para componentes que não possuem 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 alimentação externa no lugar da bateria do dispositivo, o sistema pode apresentar problemas devido a um termistor de bateria desconectado ou pinos integrados do medidor de combustível (ou seja, uma leitura inválida da temperatura da bateria ou da capacidade restante da bateria pode desligar o kernel ou o sistema Android) . Baterias falsas podem fornecer sinais nos pinos do termistor ou medidor de combustível que imitam leituras de temperatura e estado de carga para um sistema normal, e também podem fornecer cabos convenientes para conexão a fontes de alimentação externas. Alternativamente, você pode modificar o sistema para ignorar os dados inválidos da bateria perdida.
Suspensão do sistema de controle
Esta seção descreve como evitar o estado de suspensão do sistema quando você não deseja que ele interfira em outras medições e como medir o consumo de energia do estado de suspensão do sistema quando você deseja medi-lo.
Impedir a suspensão do sistema
A suspensão do sistema pode introduzir variações indesejadas nas medições de potência e colocar os componentes do sistema em estados de baixa potência inadequados para medir o uso de energia ativa. Para evitar que o sistema seja suspenso enquanto a tela estiver 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 a suspensão do sistema. (Lembre-se de desconectar o cabo USB do dispositivo antes de medir o consumo de energia.)
Para remover o wakelock:
adb shell "echo temporary > /sys/power/wake_unlock"
Suspensão do sistema de medição
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 do rádio celular, que pode funcionar em um processador separado das partes SoC controladas pela suspensão do sistema.
- Certifique-se de que o sistema esteja no estado suspenso:
- A confirmação das leituras atuais estabelece-se em um valor estável. As leituras devem estar dentro da faixa esperada para o consumo de energia do estado suspenso do SoC mais o consumo de energia dos componentes do sistema que permanecem ligados (como o USB PHY).
- Verificando a saída do console do sistema.
- Observando indicações externas do status do sistema (como um LED apagando quando não está em suspensão).
Controle as velocidades da CPU
CPUs ativas podem ser colocadas on-line ou off-line, ter suas velocidades de clock e tensões associadas alteradas (possivelmente também afetando as velocidades do barramento de memória e outros estados de energia do núcleo do sistema) e podem entrar em estados ociosos de menor consumo de energia enquanto estão no loop ocioso do kernel. Ao medir diferentes estados de energia da CPU para o perfil de energia, evite a variação do consumo de energia ao medir outros parâmetros. O perfil de potência pressupõe que todas as CPUs tenham as mesmas velocidades e características de potência disponíveis.
Ao medir a potência da CPU, ou enquanto mantém a potência da CPU constante para fazer outras medições, mantenha constante o número de CPUs colocadas on-line (como ter uma CPU on-line e o restante off-line/hotplugged). Manter todas as CPUs, exceto uma, em agendamento ocioso pode produzir resultados aceitáveis. Interromper a estrutura do Android com adb shell stop
pode reduzir a atividade de agendamento do sistema.
Você deve especificar as velocidades de CPU disponíveis para o seu dispositivo na entrada cpu.speeds
do perfil de energia. Para obter uma lista de 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 potência correspondentes no valor cpu.active
.
Para plataformas em que o número de núcleos colocados on-line afeta significativamente o consumo de energia, talvez seja necessário modificar o driver cpufreq ou governador da plataforma. A maioria das plataformas suporta o controle da velocidade da CPU usando o governador cpufreq do espaço do usuário e o uso de interfaces sysfs para definir a velocidade. Por exemplo, para definir a velocidade para 200 MHz em um sistema com apenas 1 CPU ou todas as CPUs compartilhando uma política cpufreq comum, use o console do sistema ou o shell adb 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
Nota : Os comandos exatos diferem dependendo da implementação da plataforma cpufreq.
Esses comandos garantem que a nova velocidade não esteja fora dos limites permitidos, definem a nova velocidade e depois imprimem a velocidade na qual a CPU está realmente funcionando (para verificação). Se a velocidade mínima atual antes da execução for superior a 200.000, poderá ser necessário reverter a ordem das duas primeiras linhas ou executar a primeira linha novamente para diminuir a velocidade mínima antes de definir a velocidade máxima.
Para medir a corrente consumida por uma CPU rodando em várias velocidades, use o console do sistema para colocar a CPU em um loop vinculado à 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 durante a execução de aceleração térmica devido a uma medição de alta temperatura (ou seja, após a execução de CPUs em altas velocidades por períodos prolongados). Fique atento a essa limitação, usando a saída do console do sistema ao fazer medições ou verificando o log 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 executando tarefas. A CPU deve estar em um loop inativo do agendador 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 potência quando o sistema não estiver no modo de suspensão e não estiver executando tarefas. Uma CPU (geralmente a CPU primária) deve executar a tarefa enquanto todas as outras CPUs devem estar em estado inativo.
Meça a potência da tela
Ao medir a tela ligada, certifique-se de que outros dispositivos normalmente ligados quando a tela está ativada também estejam ligados. Por exemplo, se a tela sensível ao toque e a luz de fundo da tela normalmente estiverem ligadas quando a tela estiver ligada, certifique-se de que esses dispositivos estejam ligados quando você medir para obter um exemplo realista do uso de energia da tela.
Algumas tecnologias de display variam no consumo de energia de acordo com as cores exibidas, fazendo com que as medições de potência variem consideravelmente dependendo do que é exibido na tela no momento da medição. Ao medir, certifique-se de que a tela esteja exibindo algo que tenha características de potência de uma tela realista. Mire entre os extremos de uma tela totalmente preta (que consome menos energia para algumas tecnologias) e uma tela totalmente branca. Uma escolha comum é visualizar uma programação no aplicativo de calendário, que possui uma mistura de fundo branco e elementos não brancos.
Meça a tela ligada com o brilho mínimo e máximo da tela/luz de fundo. Para definir o brilho mínimo:
- Use a UI do Android (não recomendado). Defina o controle deslizante Configurações> Brilho da tela para o brilho mínimo da tela. No entanto, a IU do Android permite definir o brilho apenas para um mínimo de 10-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 possa não ser visível sem grande esforço.
- Use um arquivo sysfs (recomendado). Se disponível, use um arquivo sysfs para controlar o brilho do painel até o brilho mínimo suportado pelo hardware.
Além disso, se o arquivo sysfs da plataforma permitir ligar e desligar o painel LCD, a luz de fundo e a tela sensível ao toque, use o arquivo para fazer medições com a tela ligada e desligada. Caso contrário, defina 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.
Meça a potência do Wi-Fi
Execute medições de Wi-Fi em uma rede relativamente silenciosa. Evite introduzir trabalho adicional processando grandes volumes de tráfego de transmissão que não esteja relacionado à 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 Wi-Fi ativado e desativado.
O valor wifi.scan
mede a energia consumida durante uma varredura de Wi-Fi para pontos de acesso. Os aplicativos podem acionar verificações de Wi-Fi usando a API startScan()
da classe WifiManager. Você também pode abrir Configurações > Wi-Fi, que executa verificações de pontos de acesso a cada poucos segundos com um aparente salto no consumo de energia, mas você deve subtrair a energia da tela dessas medições.
Nota : Use uma configuração controlada (como iperf ) para gerar tráfego de recepção e transmissão de rede.