Estatísticas de energia HAL

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. Um PowerEntity é 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 cada PowerEntity 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 em power_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);