전원 통계 HAL

기기 하위 시스템 전력은 보통 화면이 켜져 있거나 기기가 유휴 전력 상태에 있는 경우와 같이 다양한 안정 상태 조건에 따라 실험실 환경에서 측정 및 기록됩니다. 이 방법은 전력 사용량이 일정한 하위 시스템이나 실험실 환경에서 쉽게 측정되는 조건에서는 작동하지만 화면에 동영상이 표시되는 경우와 같이 특정 사용 사례에서는 작동하지 않습니다.

IPower.hal 1.0전력 힌트를 전달하고 하위 시스템 절전 상태 측정항목에 관한 누적 데이터를 보고할 수 있는 인터페이스를 제공합니다. Android 10 이상에는 누적 통계 보고 함수가 IPowerStats.hal 전력 통계 수집 API에 포함되어 있으며 기기의 에너지 사용 데이터를 가져오는 방법을 제공합니다. 이 함수는 기능을 더욱 명확하게 구분하기 위해 IPower.hal 인터페이스의 누적 통계 수집 부분을 대체합니다.

IPowerStats 서비스는 값을 주기적으로 판독하지 않습니다. 배터리가 1% 감소하는 경우와 같이 중요한 순간에 값을 판독합니다. 배터리가 느리게 소모되면 덜 자주 판독하고 빠르게 소모되면 더 자주 판독합니다. 데이터는 다시 서버로 전송되고 분석 및 분류를 위해 버그 신고에 사용될 수도 있습니다. 이 기능은 전력 소비를 줄이고 배터리 수명을 늘리기 위한 지속적인 노력에 도움이 됩니다.

IPower.hal 및 IPowerStats.hal

IPower.hal IPowerStats.hal 인터페이스는 둘 다 Android 10에서 사용할 수 있지만 IPower.hal 통계 수집 기능은 IPowerStats.hal 인터페이스에서만 사용할 수 있습니다. IPowerStats.hal 기능에는 지원되는 기기의 기기 전력 측정에서 수집된 데이터를 가져오고 사용하는 API가 포함됩니다.

  • 빈도가 낮은 클라이언트(getRailInfo)와 빈도가 높은(streamEnergyData) 클라이언트 둘 다의 레일 수준 에너지를 측정하고 부팅 이후 누적된 에너지를 보고합니다.
  • 데이터가 제공되는 지원되는 각 PowerEntity와 관련된 정보를 보고합니다. PowerEntity는 총 기기 전력 소비에 영향을 미치는 플랫폼 하위 시스템, 주변기기 또는 전력 도메인입니다.
  • 지정된 항목에서 보존 데이터를 제공하는 전력 항목 상태(getPowerEntityStateInfo)의 집합을 보고한 다음 지정된 각 PowerEntity의 누적된 데이터를 보고합니다.

IPowerStats.hal API는 다음 클라이언트에서 사용됩니다.

  • Statsd: 레일당 전력 소비 측정항목을 수집합니다.
  • Perfetto: 전력 소비를 CPU 활동과 연관시킵니다.
  • Batterystats: power_profile.xml.의 사전 정의된 상수에서 배터리 소모를 추정하는 대신 측정된 데이터를 사용하여 배터리 속성을 개선합니다.

Android 10 이상에서는 기기 제조업체가 IPower.hal 함수와 IPowerStats.hal 함수 중에서 선택할 수 있지만 IPowerStats.hal이 구현되지 않은 경우 모든 클라이언트가 IPower.hal로 돌아가야 합니다.

IPowerStats.hal 구현 옵션

Android 7부터 Android 9까지는 IPower.hal 함수만 사용할 수 있습니다. Android 10으로 업그레이드된 기기에는 하드웨어 전력 모니터링 하위 시스템 또는 전력 통계를 모니터링하고 기록할 수 있는 다른 방법이 있어야 합니다. 일부 SoC에서는 사용자를 대신하여 전력 사용 통계를 수집하며 소프트웨어를 통해 전력 항목 상태 보존 정보를 얻을 수도 있습니다. 전력 모니터링 하드웨어는 getRailInfo(), getEnergyData(), streamEnergyData()를 지원하기 위해서만 필요합니다.

전력 모니터링 하드웨어 없이 IPowerStats.hal을 구현하면 getRailInfo(), getEnergyData(), streamEnergyData()에서 NOT_SUPPORTED를 반환합니다. 마찬가지로 IPowerStats.hal이 사용되지 않을 경우 getPowerEntityInfo(), getPowerEntityStateInfo(), getPowerEntityStateResidencyData()에서도 NOT_SUPPORTED를 반환할 수 있습니다.

레일 모니터링 API에서 반환하는 데이터의 예는 다음과 같습니다.

  • XµW를 소비하는 디스플레이의 전력 레일
  • YµW를 소비하는 모뎀의 전력 레일

하위 시스템 절전 상태 API에서 반환하는 데이터의 예는 다음과 같습니다.

  • 모뎀이 Xms 동안 절전 상태였습니다.
  • SoC가 Yms 동안 전력 붕괴 상태였습니다.
  • GPU가 Zms 동안 정지 상태였습니다.

하드웨어 전력 모니터링 하위 시스템 사용

기기 설계에 하드웨어 전력 하위 시스템이 있는 경우 PowerStats.hal에서 데이터를 파싱할 수 있는 단일 sysfs 노드를 만들거나 ioctl 유형 시스템 호출의 컬렉션을 만들어 IPowerStats.hal을 구현하세요.

누산기 오버플로를 방지하는 방식으로 커널 드라이버를 구현해야 합니다. 사용되는 알고리즘은 즉각적인 평균 버스 전압과 현재 측정항목을 모두 제공해야 하는 고유한 하드웨어 전력 모니터링 하위 시스템 설계에 따라 달라집니다. 커널 드라이버는 에너지 누산기를 지우지 않는 방식으로 이 데이터를 캡처해야 하며 부팅 이후 각 하위 레일의 누적된 에너지를 각 누산기 쿼리의 에너지 판독값과 함께 증가하는 64비트 변수 형식으로 유지해야 합니다.

지정된 구성요소 또는 여러 구성요소(선택 사항)의 통계는 단일 노드에 있어야 합니다. 이 방법은 각 노드를 단일 값으로 제한하는 sysfs의 일반적인 사용 방법은 아니지만 이 방법을 사용하면 모든 데이터의 일관성이 유지됩니다.

설계 안내

  • sysfs 노드에서 읽거나 시스템 호출을 할 때 지연 시간을 짧게(최대 1밀리초) 유지합니다.
  • 지원 통계 기능이 전력 소모량을 크게 증가시키지 않는지 확인합니다.
    • 절전 모드에 소요된 시간과 같은 매개변수를 추적하기 위해 액세스 포인트(AP) 및 하위 시스템 wakeup을 늘리지 않습니다.
    • 가능한 경우 앱 프로세서와 펌웨어 간의 통계를 필요에 따라 다른 트래픽과 함께 전달합니다.
  • 필요한 경우 하위 시스템에서 다음과 같은 드라이버 함수를 사용할 수도 있습니다.
    • 지연 시간/wakeup을 피하기 위해 약간 오래된 데이터를 사용하여 데이터를 내부적으로 캐시
    • 하위 시스템이 절전 모드에 있을 때 보간을 실행하여 하위 시스템을 절전 모드에서 해제하지 않고 업데이트된 절전 시간을 제공

구성요소, 하위 시스템, 통계 선택

IPowerStats.hal 데이터를 수집할 구성요소 또는 하위 시스템을 선택할 때 유의한 전류(5mA 이상)를 소비하거나 다음과 같이 여러 전력 소비 모드를 지원하는 기기를 선택하세요.

  • 개별 SoC 하위 시스템
  • 부분적으로 또는 전체적으로 SoC 외부에 있는 하위 시스템 전체. 예: Wi-Fi, 이미지 프로세서, 보안 프로세서
  • 고전력 LED, 카메라와 같은 주변기기
  • 여러 모드를 사용하는 전력 도메인(예: SoC 전체의 전력 도메인)

맞춤설정

이 선택적 기능은 맞춤설정할 수 있습니다. 사용 사례를 설계하고 사용량을 맞춤설정합니다.

  • 측정할 레일과 측정 빈도를 결정합니다.
  • 데이터를 판독할 시기와 해석 방법을 결정합니다.
  • 데이터를 기반으로 실행할 작업과 시기를 결정합니다.

유효성 검사

VTS 테스트는 Android 요구사항이 충족되는지 확인합니다. IPowerStats.hal의 주석은 기기가 규정을 준수하는지 확인하는 데 사용됩니다.

예를 들어 getRailInfo()를 호출했는데 아무것도 반환되지 않으면 모니터링된 레일 또는 SUCCESS의 반환된 상태에 관한 정보를 받지 않았기 때문에 VTS 테스트가 실패합니다. 마찬가지로 레일 정보를 수신했지만 NON_SUPPORTED 또는 FILE_SYSTEM_ERROR 응답이 수반되는 경우에도 실패합니다. VTS는 IPower.hal 및 IPowerStats.hal 주석의 요구사항을 사용하여 HAL 파일에서 기기 제조업체 사양이 준수되는지 확인합니다. 다음은 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);