AAOS には、ハードウェア コンポーネントとソフトウェア コンポーネント(ディスプレイ、オーディオ、音声操作など)のオン / オフが必要に応じて選択的に切り替える電源ポリシーが用意されています。このポリシーでは、ハードウェアおよびソフトウェア コンポーネントで期待される電源のオン / オフ状態が指定されています。VHAL(システム特権のあるベンダー サービス)は、Android の電源状態が遷移したとき、または VHAL が想定している特定の条件が満たされたときに、新しい電源ポリシーを適用できます。
電力ポリシーを適用できるのは、Wait for VHAL 状態と On 状態のときです。Shutdown Prepare 状態のときはガレージモードが実行中であり、電源状態の遷移によってガレージモードの実行が妨げられないようにする必要があります。Shutdown Prepare 状態で通常の電源ポリシーを適用することはできませんが、「no user interaction」という特別なシステム電源ポリシーは適用できます。
AAOS の電源状態
AAOS デバイスの電源状態は、次の図のように遷移します。
図 1.AAOS の電源状態の図
それぞれの電源状態は次のとおりです。
値 | 説明 |
---|---|
Off | アプリ プロセッサ(AP)、メモリ、周辺機器には、物理的に電力が供給されません。 |
Wait for VHAL |
|
On |
|
Shutdown Prepare |
|
Wait for VHAL to Finish |
|
Suspend-to-RAM(STR) | 車両と AP がオフになり、コードは実行されませんが、AP RAM への電力は維持されます。 |
ソフトウェア アーキテクチャ
電源ポリシーのアーキテクチャを下の図に示します。定義についてはこの後のセクションで説明します。
図 2. 電力ポリシーのアーキテクチャ
電源ポリシーの定義
実装者は、/vendor/etc/automotive/power_policy.xml
で電源ポリシーを定義します。これにより、次のことが行われます。
- 電源ポリシーが定義されます。
- デフォルトの電力ポリシーを含む電源ポリシー グループが定義され、電源状態が遷移したときに自動的に適用されます。
- システムの電源ポリシーがオーバーライドされます。
電源ポリシー
電源ポリシーは、ハードウェアおよびソフトウェア コンポーネントで期待される一連の電源状態です。AAOS は、電源ポリシーで次のコンポーネントをサポートしています。
AUDIO
MEDIA
DISPLAY_MAIN
DISPLAY_CLUSTER
DISPLAY_FRONT_PASSENGER
DISPLAY_REAR_PASSENGER
BLUETOOTH
WIFI
CELLULAR
ETHERNET
PROJECTION
NFC
INPUT
VOICE_INTERACTION
VISUAL_INTERACTION
TRUSTED_DEVICE_DETECTION
LOCATION
MICROPHONE
CPU
電力ポリシー グループ
電力ポリシー グループでは、電源状態が遷移したときに自動的に適用されるデフォルトの電源ポリシーを指定します。デフォルトの電源ポリシーは、Wait for VHAL、On、Wait for VHAL Finish(Deep Sleep Entry または Shutdown Start)状態に対して定義できます。
システム電源ポリシー
AAOS がサポートしているシステム電源ポリシーは「no user interaction」だけです。デバイスがマナーモードまたはガレージモードになると、このシステム電源ポリシーが適用されます。
システム電源ポリシーにおける各コンポーネントの動作を以下の表に示します。
実装者は、システムの電源ポリシーで Bluetooth、NFC、信頼できるデバイスの検出をオーバーライドできます。オーバーライドは /vendor/etc/power_policy.xml
で適用します。
コンポーネント | 電源状態 | 設定可能 |
---|---|---|
音声 | Off | × |
メディア | Off | × |
ディスプレイ(メイン) | Off | × |
ディスプレイ(クラスタ) | Off | × |
ディスプレイ(助手席) | Off | × |
ディスプレイ(後部座席) | Off | × |
Bluetooth | Off | ○ |
Wi-Fi | ON | × |
モバイル | ON | × |
イーサネット | ON | × |
予測 | Off | × |
NFC | Off | ○ |
入力 | Off | × |
音声インタラクション | Off | × |
視覚的インタラクション | Off | × |
信頼できるデバイスの検出 | ON | ○ |
位置情報 | Off | × |
マイク | Off | × |
CPU | On | × |
VHAL とのインタラクション
システムレイヤで実行されている自動車の電力ポリシー デーモンは、VHAL からのリクエストをリッスンするために 2 つのプロパティをサブスクライブします。
POWER_POLICY_REQ
: VHAL はこのプロパティに電源ポリシー ID を書き込みます。POWER_POLICY_GROUP_REQ
: VHAL はこのプロパティに電源ポリシー グループ ID を書き込みます。
システムの現在の電源ポリシーは、VHAL 以外のモジュールで変更できます。その場合は、自動車の電源ポリシー デーモンが CURRENT_POWER_POLICY
プロパティを更新して、VHAL に変更を通知します。
ネイティブ プロセスとのインタラクション
前述のように、自動車の電源ポリシー デーモンはシステムレイヤで実行され、電源ポリシー管理という観点から見れば、フレームワーク レイヤで実行される CPMS とほぼ同じ機能を提供します。 また、自動車電源ポリシー デーモンと CPMS が完全に同期されていることが想定されています。
自動車の電源ポリシー デーモンは、HAL やその他のネイティブ プロセスで使用する AIDL インターフェースをエクスポートします。新しい電源ポリシーが変更されたときには、通知を受けることができます。つまり、それぞれが電源状態を変更しなければならないときに通知を受けることができます。
ICarPowerPolicyServer.aidl
package android.frameworks.automotive.powerpolicy; import android.frameworks.automotive.powerpolicy.CarPowerPolicy; import android.frameworks.automotive.powerpolicy.CarPowerPolicyFilter; import android.frameworks.automotive.powerpolicy.ICarPowerPolicyChangeCallback; import android.frameworks.automotive.powerpolicy.PowerComponent; /** * ICarPowerPolicyServer is an interface implemented by the power policy daemon. * VHAL changes the power policy and the power policy daemon notifies the change to registered * subscribers. When subscribing to policy changes, a filter can be specified so that the registered * callbacks can listen only to a specific power component's change. */ @VintfStability interface ICarPowerPolicyServer { /** * Gets the current power policy. */ CarPowerPolicy getCurrentPowerPolicy(); /** * Gets whether the power component is turned on or off. * * @param componentId Power component ID defined in PowerComponent.aidl to check power state. * @return True if the component's power state is on. */ boolean getPowerComponentState(in PowerComponent componentId); /** * Subscribes to power policy change. * Notification is sent to the registered callback when the power policy changes and the power * state of the components which the callback is interested in changes. * * @param callback Callback that is invoked when the power policy changes. * @param filter The list of components which the callback is interested in. */ void registerPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback, in CarPowerPolicyFilter filter); /** * Unsubscribes from power policy change. * * @param callback Callback that doesn't want to receive power policy change. */ void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback); }
ICarPowerPolicyChangeCallback.aidl
package android.frameworks.automotive.powerpolicy; import android.frameworks.automotive.powerpolicy.CarPowerPolicy; /** * ICarPowerPolicyChangeCallback is notified when a power policy changes. */ @VintfStability oneway interface ICarPowerPolicyChangeCallback { /** * Called when a power policy is fully changed. * * @param policy The current policy. */ void onPolicyChanged(in CarPowerPolicy policy); }
Java モジュールとのインタラクション
CarPowerManager
では、電源ポリシーの管理を有効にするメソッドを使用できます。
- 現在の電源ポリシーを取得する
- 現在の電源ポリシー グループを取得する
- 新しい電源ポリシーを適用する
- 新しい電源ポリシー グループを設定する
このメソッドを使用できるのはシステム特権モジュールのみです。電源ポリシーが適用されたときに通知が必要なモジュールは、電源ポリシー変更リスナーを CarPowerManager
に登録できます。