デバイス サブシステムの電力は、ラボ環境のさまざまな定常状態の条件(画面がオンになっている場合や、デバイスがアイドル電力状態にある場合など)の下で、頻繁に測定、記録されます。このような測定は、電力消費が安定しているサブシステムや、測定が容易なラボ環境の条件下では有効ですが、特定のユースケース(画面に動画が表示されている場合など)では有効ではありません。
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.hal
と IPowerStats.hal
のどちらの機能も選択できるようになりましたが、IPowerStats.hal
が実装されていない場合はすべてのクライアントを IPower.hal
にフォールバックする必要があります。
IPowerStats.hal の実装オプション
IPower.hal
の機能は、Android 7~Android 9 でのみ使用できます。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);