A energia do subsistema do dispositivo geralmente é medida e registrada em um ambiente de laboratório para diversas condições de estado estacionário, como quando a tela está ligada ou o dispositivo está em estado de energia ocioso. Isso funciona para subsistemas com consumo constante de energia ou sob condições que são facilmente medidas em ambientes de laboratório, mas não para determinados casos de uso, como quando uma tela exibe um vídeo.
IPower.hal 1.0
fornece uma interface para passar dicas de energia e relatar dados cumulativos nas métricas de estado de suspensão do subsistema. No Android 10 e versões posteriores, a função de relatório de estatísticas cumulativas reside nas APIs de coleta power-stat IPowerStats.hal
e fornece uma maneira de recuperar dados de uso de energia no dispositivo. Isso substitui a parte de coleta de estatísticas cumulativas da interface IPower.hal
, para uma separação mais clara de funcionalidade.
As leituras do serviço IPowerStats
não são periódicas. Eles ocorrem em momentos importantes, como quando há uma queda de 1% da bateria. As leituras são menos frequentes quando o consumo da bateria está baixo e mais frequentes quando está alto. Os dados podem ser enviados de volta aos servidores e usados em relatórios de bugs para análise e triagem. Isto apoia os esforços contínuos para diminuir o consumo de energia e aumentar a vida útil da bateria.
IPower.hal e IPowerStats.hal
Ambas as interfaces IPower.hal
e IPowerStats.hal
estão disponíveis no Android 10, mas a funcionalidade de coleta de estatísticas IPower.hal
está disponível apenas na interface IPowerStats.hal
. A funcionalidade IPowerStats.hal
inclui APIs para adquirir e usar dados coletados de medições de energia no dispositivo para dispositivos suportados:
- Executa medições de energia no nível do trilho para clientes de baixa frequência (
getRailInfo
) e de alta frequência (streamEnergyData
) e relata a energia acumulada desde a inicialização. - Relata informações relacionadas a cada
PowerEntity
compatível para os quais há dados disponíveis. UmPowerEntity
é um subsistema de plataforma, periférico ou domínio de energia que afeta o consumo total de energia do dispositivo. - Informa o conjunto de estados de entidade de energia (
getPowerEntityStateInfo
) para os quais as entidades especificadas fornecem dados de residência e, em seguida, relata os dados acumulados para cadaPowerEntity
especificado.
As APIs IPowerStats.hal
são usadas pelos seguintes clientes:
-
Statsd
, para coletar métricas de consumo de energia por trilho. -
Perfetto
, para correlacionar o consumo de energia com a atividade da CPU. -
Batterystats
, para melhorar a atribuição da bateria usando dados medidos em vez de estimar o consumo da bateria a partir de constantes predefinidas empower_profile.xml.
Com o Android 10 e versões posteriores, um fabricante de dispositivo pode escolher entre as funções IPower.hal
e IPowerStats.hal
, mas todos os clientes deverão recorrer a IPower.hal
se IPowerStats.hal
não estiver implementado .
Opções de implementação IPowerStats.hal
Somente as funções IPower.hal
estão disponíveis do Android 7 ao Android 9. Os dispositivos que foram atualizados para o Android 10 devem ter um subsistema de monitoramento de energia de hardware ou outros meios disponíveis para monitorar e registrar estatísticas de energia. Alguns SoCs coletam estatísticas de uso de energia para você, ou você pode obter informações de residência do estado da entidade de energia por meio de software. O hardware de monitoramento de energia só é necessário para suportar getRailInfo()
, getEnergyData()
e streamEnergyData()
.
Se você implementar IPowerStats.hal
sem hardware de monitoramento de energia, getRailInfo(), getEnergyData()
e streamEnergyData()
retornarão NOT_SUPPORTED
. Da mesma forma, getPowerEntityInfo(), getPowerEntityStateInfo()
e getPowerEntityStateResidencyData()
também podem retornar NOT_SUPPORTED
se não for pretendido ser usado.
Exemplos de dados retornados pelas APIs de monitoramento ferroviário incluem
- O barramento de alimentação do display consumiu X µW.
- O barramento de alimentação do modem consumiu Y µW.
Exemplos de dados retornados pelas APIs de estado de suspensão do subsistema incluem
- O modem ficou inativo por X ms.
- O SoC estava no estado de colapso de energia por Y ms.
- A GPU ficou em estado suspenso por Z ms.
Use um subsistema de monitoramento de energia de hardware
Se o design do seu dispositivo tiver um subsistema de monitoramento de energia de hardware, implemente IPowerStats.hal
criando um único nó sysfs a partir do qual PowerStats.hal
pode analisar dados ou fazendo uma coleção de chamadas de sistema do tipo ioctl .
Você deve implementar seu driver de kernel de uma forma que evite o estouro do acumulador. O algoritmo usado depende do design exclusivo do subsistema de monitoramento de energia do hardware, que deve fornecer medições instantâneas e médias de tensão e corrente do barramento. O driver do kernel deve capturar esses dados de uma maneira que não limpe os acumuladores de energia, e deve manter os dados de energia acumulados para cada subrail desde a inicialização, na forma de uma variável de 64 bits que é incrementada com a leitura de energia de cada consulta do acumulador.
As estatísticas de um determinado componente (ou opcionalmente, de vários componentes) devem estar em um único nó. Embora este não seja um uso convencional do sysfs (que normalmente limita cada nó a um único valor), ele garante que todos os dados sejam consistentes.
Orientação de projeto
- Mantenha a latência baixa (1 ms, no máximo) ao ler do nó sysfs ou ao fazer chamadas do sistema.
- Certifique-se de que a funcionalidade de estatísticas de suporte não aumente de forma mensurável o consumo de energia:
- Não aumente as ativações do ponto de acesso (AP) e/ou subsistema para rastrear parâmetros como o tempo gasto no modo de suspensão.
- Transfira estatísticas entre o processador de aplicativos e o firmware de forma oportunista com outro tráfego, quando possível.
- Se necessário, o subsistema pode utilizar as seguintes funções de driver:
- Armazenar dados em cache internamente para evitar latência/despertar às custas de dados ligeiramente obsoletos.
- Executar extrapolação quando o subsistema está em suspensão, para fornecer tempo de suspensão atualizado sem despertar o subsistema.
Escolha componentes, subsistemas e estatísticas
Ao escolher quais componentes ou subsistemas coletar dados IPowerStats.hal
, selecione qualquer coisa no dispositivo que consuma corrente significativa (5 mA ou mais) ou que suporte vários modos de consumo de energia, como os seguintes:
- Subsistemas SoC individuais.
- Subsistemas parcial ou totalmente fora do SoC, como WiFi, processador de imagem ou processador de segurança.
- Periféricos como LEDs e câmeras de alta potência.
- Domínios de potência que usam modos diferentes (como o domínio de potência do SoC como um todo).
Costumização
Este recurso opcional pode ser personalizado. Projete casos de uso e personalize seu uso:
- Decida quais trilhos medir e com que frequência medi-los.
- Decida quando ler os dados e como interpretá-los.
- Decida que ação tomar e quando tomá-la, com base nos seus dados.
Validação
Os testes VTS garantem que os requisitos do Android sejam atendidos. Os comentários em IPowerStats.hal
são usados para verificar se um dispositivo está em conformidade.
Por exemplo, se você chamar getRailInfo()
e ele não retornar nada, o teste VTS falhará porque você não recebeu informações sobre os trilhos monitorados ou um status retornado de SUCCESS
. Da mesma forma, se você recebeu informações sobre trilhos, mas elas foram acompanhadas por uma resposta NON_SUPPORTED
ou FILE_SYSTEM_ERROR
, isso também é uma falha. O VTS verifica se as especificações do fabricante do dispositivo são cumpridas no arquivo HAL, usando os requisitos nos comentários IPower.hal e IPowerStats.hal. Um exemplo de comentários usados em testes VTS é mostrado abaixo:
/** * Rail information: * Reports information related to the rails being monitored. * * @return rails Information about monitored rails. * @return status SUCCESS on success or NOT_SUPPORTED if * feature is not enabled or FILESYSTEM_ERROR on filesystem nodes * access error. */ getRailInfo() generates(vec<e;RailInfo>e; rails, Status status);