HAL de estatísticas de energia

A energia do subsistema do dispositivo geralmente é medida e registrada em um ambiente de laboratório para várias condições de estado estável, como quando a tela está ligada ou o dispositivo está no estado de inatividade. Isso funciona para subsistemas com uma consumo de energia ou em condições facilmente medidas em ambientes de laboratório, mas não para certos casos de uso, como quando uma tela exibe um vídeo.

IPower.hal 1.0 fornece uma interface para transmitir dicas de energia e relatórios de dados cumulativos sobre métricas de estado de sono do subsistema. No Android 10 e versões mais recentes, a função de relatório de estatísticas cumulativas reside nas APIs de coleta de estatísticas de poder IPowerStats.hal e oferece uma maneira de recuperar dados de uso de energia no dispositivo. Isso substitui o de coleta de estatísticas cumulativas da interface IPower.hal, para uma separação mais clara das funcionalidades.

As leituras do serviço IPowerStats não são periódicas. Elas ocorrem momentos importantes, como quando há uma queda de 1% na bateria. As leituras estão menos frequentes quando o consumo da bateria está baixo e mais frequente quando está alto. Os dados podem ser enviadas de volta aos servidores e podem ser usadas em relatórios de bugs para análise e triagem. Isso apoia esforços contínuos para diminuir o consumo de energia e aumentar duração da bateria.

IPower.hal e IPowerStats.hal

As interfaces IPower.hal e IPowerStats.hal estão disponíveis no Android 10, mas o A funcionalidade de coleta de estatísticas do IPower.hal está disponível apenas disponíveis na interface IPowerStats.hal. A A funcionalidade IPowerStats.hal inclui APIs para adquirir e usar dados coletados de medições de energia no dispositivo para dispositivos compatíveis:

  • Realiza medições de energia no nível dos trilhos para baixa frequência (getRailInfo) e alta frequência (streamEnergyData) clientes e informa a energia acumulada desde a inicialização.
  • Informa informações relacionadas a cada PowerEntity compatível para os quais os dados estão disponíveis. Um PowerEntity é um subsistema, periférico ou domínio de energia da plataforma que afeta o e o consumo de energia do dispositivo.
  • Informa o conjunto de estados da entidade de energia (getPowerEntityStateInfo) para os quais as entidades especificadas fornecem dados de residência e, em seguida, informa o 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 CPU atividades.
  • Batterystats, para melhorar a atribuição da bateria usando em vez de estimar o consumo de bateria a partir de constantes predefinidas em power_profile.xml.

Com o Android 10 e versões mais recentes, o fabricante do dispositivo pode escolher entre as funções IPower.hal e IPowerStats.hal, mas todos os clientes deverão retornar para IPower.hal se IPowerStats.hal não foi implementado .

Opções de implementação de IPowerStats.hal

Apenas as funções IPower.hal estão disponíveis no Android 7 até o Android 9. Os dispositivos que fizeram upgrade para o Android 10 precisam 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 ou pode obter o estado de residência do estado de energia informações por software. O hardware de monitoramento de energia só é necessário são compatíveis com getRailInfo(), getEnergyData() e streamEnergyData()

Se você implementar IPowerStats.hal sem o monitoramento de energia hardware, getRailInfo(), getEnergyData() e streamEnergyData() retorna NOT_SUPPORTED. Da mesma forma, getPowerEntityInfo(), getPowerEntityStateInfo() e getPowerEntityStateResidencyData()também pode retornar NOT_SUPPORTED caso não tenha sido criado para ser usado.

Exemplos de dados retornados pelas APIs rail-monitoring incluem

  • O trilho de energia da tela consumiu X μW.
  • O trilho de energia do modem consumiu Y μW.

Exemplos de dados retornados pelas APIs de estado de sono do subsistema incluem

  • O modem ficou inativo por X ms.
  • O SoC ficou no estado de redução de energia por Y ms.
  • A GPU ficou no estado de suspensão por Z ms.

Usar 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 dos quais PowerStats.hal pode analisar dados ou fazendo uma coleção de chamadas do sistema do tipo ioctl.

Você precisa implementar o driver do kernel de forma a impedir o acumulador estouro. O algoritmo usado depende do monitoramento de energia exclusivo do hardware. projeto de subsistema, que deve fornecer tensão de barramento instantânea e média e medidas atuais. O driver do kernel deve capturar esses dados de uma forma que não limpe os acumuladores de energia e mantenha o dados de energia acumulados para cada subtrilho desde a inicialização, na forma de uma variável que é incrementada com a leitura de energia de cada acumulador consulta.

As estatísticas de um determinado componente (ou, opcionalmente, vários componentes) precisam estar no um único nó. Embora esse não seja um uso convencional de sysfs (que normalmente limita cada nó a um único valor), ele garante que todos os dados sejam consistentes.

Orientações de design

  • Mantenha a latência baixa (1 ms, máxima) ao ler a partir do sysfs ou fazendo 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 o ponto de acesso (AP) e/ou as ativações do subsistema para monitorar como o tempo gasto no modo de sono.
    • Transferir estatísticas entre o processador do app e o firmware de maneira oportuna com outro tráfego quando possível.
  • Se necessário, o subsistema pode usar as seguintes funções de driver:
    • Armazenamento interno de dados em cache para evitar latência/ativações em detrimento de um pouco de dados desatualizados.
    • A realização de extrapolação quando o subsistema está em suspensão para fornecer da hora de dormir sem ativar o subsistema.

Escolher componentes, subsistemas e estatísticas

Ao escolher de quais componentes ou subsistemas coletar Dados de IPowerStats.hal, selecione qualquer item no dispositivo que consuma corrente significativa (5 mA ou mais) ou que suporte vários modos de consumo de energia, como estes:

  • Subsistemas SoC individuais.
  • Subsistemas parcial ou completamente fora do SoC, como Wi-Fi, os como o processador de imagem ou o processador de segurança.
  • Periféricos, como câmeras e LEDs de alta potência.
  • Domínios de energia que usam modos diferentes (como o domínio de energia para o SoC como um todo).

Personalização

Esse recurso opcional permite a personalização. Casos de uso de design e personalizar seu uso:

  • Decida quais trilhos medir e com que frequência medi-los.
  • Decida quando ler os dados e como interpretá-los.
  • Com base nos seus dados, decida o que fazer e quando.

Validação

Os testes VTS garantem que os requisitos do Android sejam atendidos. Os comentários em As IPowerStats.hal são usadas para verificar se um dispositivo está no compliance.

Por exemplo, se você chamar getRailInfo() e ele não retornar nada, o teste VTS vai falhar porque você não recebeu informações sobre o rails ou um status retornado de SUCCESS. Da mesma forma, se você recebeu informações sobre trens, mas estavam acompanhadas de um NON_SUPPORTED ou FILE_SYSTEM_ERROR, isso também é uma falha. VTS verifica se as especificações do fabricante do dispositivo foram respeitadas no arquivo HAL, usando os requisitos dos comentários IPower.hal e IPowerStats.hal. Um Confira abaixo um exemplo de comentários usados nos testes de VTS:

/**
* 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);