電力統計 HAL

デバイス サブシステムの電力は、ラボ環境のさまざまな定常状態の条件(画面がオンになっている場合や、デバイスがアイドル電力状態にある場合など)の下で、頻繁に測定、記録されます。このような測定は、電力消費が安定しているサブシステムや、測定が容易なラボ環境の条件下では有効ですが、特定のユースケース(画面に動画が表示されている場合など)では有効ではありません。

IPower.hal 1.0 は、電力ヒントの提示と、サブシステムのスリープ状態の指標に関する累積データの報告を行うインターフェースを提供します。Android 10 以上では、IPowerStats.hal の電力統計収集 API に累積統計情報報告機能が用意されており、デバイス上のエネルギー使用量データを取得できます。これは、IPower.hal インターフェースの累積統計情報収集の後継機能であり、機能がより明確に分離されています。

IPowerStats サービスによる読み取りは定期的に行われるのではなく、電池残量が 1% 減少したときなどの重要なタイミングで行われます。電池の消耗が遅い場合は測定頻度が低くなり、電池の消耗が早い場合は測定頻度が高くなります。データはサーバーに送り返され、バグレポートで分析と選別に使用される場合があります。これは、消費電力を削減して電池寿命を延ばすための継続的な取り組みの一環です。

IPower.hal と IPowerStats.hal

Android 10 には、IPower.hal および IPowerStats.hal インターフェースが用意されていますが、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.halIPowerStats.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 を返します。同様に、電力監視ハードウェアの使用が意図されていない場合は、getPowerEntityInfo(), getPowerEntityStateInfo() および getPowerEntityStateResidencyData()NOT_SUPPORTED を返すことがあります。

レール監視 API は次のようなデータを返します。

  • ディスプレイの電源レールによる消費量 X µW。
  • モデムの電源レールによる消費量 YμW。

サブシステムのスリープ状態 API は次のようなデータを返します。

  • モデムのスリープ状態 X ミリ秒間。
  • SoC の電流コラプス状態 Y ミリ秒間。
  • GPU のサスペンド状態 Z ミリ秒間。

ハードウェア電力監視サブシステムを使用する

ハードウェア電力監視サブシステムを含むデバイスを設計する場合は、PowerStats.hal によるデータ解析が可能な単一の sysfs ノードを作成するか、ioctl タイプのシステム呼び出しのコレクションを作成して、IPowerStats.hal を実装します。

アキュムレータのオーバーフローが発生しないような方法でカーネル ドライバを実装する必要があります。使用するアルゴリズムは、瞬間および平均のバス電圧およびバス電流の測定値を提供する独自のハードウェア電力監視サブシステムの設計に依存します。カーネル ドライバは、エネルギー アキュムレータを消去しないような方法でこのデータをキャプチャする必要があります。また、起動以降の各サブレールの累積エネルギー データを、各アキュムレータ クエリからのエネルギー読み取り値で増分される 64 ビット変数の形式で維持する必要があります。

1 つのコンポーネント(またはオプションで複数のコンポーネント)の統計は、単一のノードに存在する必要があります。これは慣用的な sysfs の使い方ではありませんが(通常は各ノードを単一の値に制限します)、すべてのデータの一貫性が保証されます。

設計に関するガイダンス

  • sysfs ノードから読み取りを行うとき、またはシステム呼び出しを行うときは、低いレイテンシを設定します(最大 1 ミリ秒)。
  • 次のようにして、統計機能をサポートすることにより電力消費が顕著に増加しないようにします。
    • スリープモード中の経過時間などのパラメータをトラッキングするために、アクセス ポイント(AP)および / またはサブシステムをスリープ状態から復帰させる回数を増やさない。
    • アプリ プロセッサとファームウェア間の統計情報を、機会をうかがって可能であれば他のトラフィックで転送する。
  • 必要に応じて、サブシステムは次のようなドライバ機能を使用します。
    • データを内部的にキャッシュし、やや古いデータを犠牲にしてレイテンシと復帰を回避する。
    • サブシステムがスリープ状態のときに推定を行い、サブシステムを復帰させずに、更新されたスリープ時間を提供する。

コンポーネント、サブシステム、統計情報を選択する

IPowerStats.hal データを収集するコンポーネントまたはサブシステムを選択する場合は、デバイス上で大量の電流(5 mA 以上)を消費するものか、次のような複数の電力消費モードをサポートするものを選択します。

  • 個々の SoC サブシステム。
  • Wi-Fi、イメージ プロセッサ、セキュリティ プロセッサなど、部分的または完全に SoC の外部にあるサブシステム。
  • 高出力 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);