AAOS には、ハードウェア コンポーネントとソフトウェア コンポーネント(ディスプレイ、音声、音声操作など)のオン / オフを必要に応じて選択的に切り替える電源ポリシーが用意されています。このポリシーでは、ハードウェアおよびソフトウェア コンポーネントで期待される電源のオン / オフ状態が指定されています。VHAL(システム特権のあるベンダー サービス)は、Android の電源状態が遷移したとき、または VHAL が想定している特定の条件が満たされたときに、新しい電源ポリシーを適用できます。
電力ポリシーを適用できるのは、Wait for VHAL 状態と On 状態のときです(いくつかの制限がある場合があります)。Shutdown Prepare 状態のときはガレージモードが実行中であり、電源状態の遷移によってガレージモードの実行が妨げられないようにする必要があります。Shutdown Prepare 状態で通常の電源ポリシーを適用することはできませんが、「no user interaction」という特別なシステム電源ポリシーは適用できます。
AAOS の電源状態
AAOS デバイスの電源状態は、次の図のように遷移します。

図 1. AAOS の電源状態の図。
それぞれの電源状態は次のとおりです。
| 値 | 説明 |
|---|---|
| Off |
|
| Wait for VHAL |
|
| On |
|
| Shutdown prepare |
|
| Wait for VHAL to finish |
|
| Suspend-to-RAM(STR) |
|
| Suspend-to-disk(STD) |
|
電源ポリシーの定義
実装者は、/vendor/etc/automotive/power_policy.xml で電源ポリシーを定義します。これにより、次のことが行われます。
- 電源ポリシーが定義されます。
- デフォルトの電力ポリシーを含む電源ポリシー グループが定義され、電源状態が遷移したときに自動的に適用されます。
- システムの電源ポリシーがオーバーライドされます。
電源ポリシー
電源ポリシーでは、ハードウェアおよびソフトウェア コンポーネントで期待される電源状態が指定されています。AAOS は、電源ポリシーで次のコンポーネントをサポートしています。
|
音声 メディア ディスプレイ Bluetooth |
WiFi モバイル イーサネット 予測 |
NFC 入力 音声操作 視覚操作 |
信頼できるデバイスの検出 位置情報 マイク CPU |
ベンダーは電源ポリシーで使用する独自のカスタム電源コンポーネントを定義することもできます。次の例に示すように、電源ポリシーと同じ XML ファイル内でカスタム電源コンポーネントを定義できます。
<customComponents>CUSTOM_COMPONENT_1000 CUSTOM_COMPONENT_SPECIAL_SENSOR CUSTOM_COMPONENT_AUX_INPUT </customComponents>
電力ポリシー グループ
電力ポリシー グループでは、電源状態が遷移したときに自動的に適用されるデフォルトの電源ポリシーを指定します。デフォルトの電源ポリシーは、Wait for VHAL、On、Wait for VHAL Finish(Deep Sleep Entry または Shutdown Start)状態に対して定義できます。
システム電源ポリシー
AAOS は、no user interaction と suspend prep の 2 つのシステム電源ポリシーをサポートしています。システム電源ポリシーは、デバイスがマナーモード、ガレージモード、Suspend-to-RAM、Suspend-to-disk のいずれかになった場合に適用されます。
システム電源ポリシーにおける各コンポーネントの動作を以下の表に示します。実装者は、no user interaction システム電源ポリシーで Bluetooth、NFC、信頼できるデバイスの検出をオーバーライドできます。オーバーライドは /vendor/etc/power_policy.xml で適用します。
no user interaction
no user interaction システム電源ポリシーの動作は次の表のように定義されています。
| コンポーネント | 電源状態 | 設定可能 |
|---|---|---|
| 音声 | Off | × |
| メディア | Off | × |
| ディスプレイ | Off | × |
| Bluetooth | Off | ○ |
| Wifi | On | × |
| モバイル | On | × |
| イーサネット | On | × |
| 予測 | Off | × |
| NFC | Off | ○ |
| 入力 | Off | × |
| アシスタント | Off | × |
| ユーザーの操作 | Off | × |
| ユーザー ログイン用の信頼できるデバイスの検出 | On | ○ |
| 位置情報 | Off | × |
| マイク | Off | × |
| CPU | On | × |
suspend prep
suspend prep システム電源ポリシーの動作は次の表のように定義されています。
| コンポーネント | 電源状態 | OEM による設定可能 |
|---|---|---|
| 音声 | Off | × |
| メディア | なし | × |
| ディスプレイ | なし | × |
| Bluetooth | Off | × |
| Wifi | Off | × |
| モバイル | なし | × |
| イーサネット | なし | × |
| 予測 | なし | × |
| NFC | なし | × |
| 入力 | なし | × |
| アシスタント | なし | × |
| ユーザーの操作 | なし | × |
| ユーザー ログイン用の信頼できるデバイスの検出 | なし | × |
| 位置情報 | Off | × |
| マイク | Off | × |
| CPU | Off | × |
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.
* @throws IllegalStateException if the current policy is not set.
*/
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.
* @throws IllegalArgumentException if the componentId is invalid.
*/
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.
* @throws IllegalArgumentException if the callback is already registered.
* @throws IllegalStateException if the callback is dead.
*/
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.
* @throws IllegalArgumentException if the callback is not registered.
*/
void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback);
/**
* Applies the power policy.
*
* {@code policyId} should be one of power policy IDs defined in
* {@code /vendor/etc/automotive/power_policy.xml} or predefined system power policies.
*
* @param policyId ID of power policy.
* @throws IllegalArgumentException if {@code policyId} is invalid.
*/
void applyPowerPolicy(in @utf8InCpp String policyId);
/**
* Sets the current power policy group.
*
*
{@code policyGroupId} should be one of power policy group IDs defined in
* {@code /vendor/etc/automotive/power_policy.xml}.
*
* @param policyGroupId ID of power policy group.
* @throws IllegalArgumentException if {@code policyGroupId} is invalid.
*/
void setPowerPolicyGroup(in @utf8InCpp String policyGroupId);
}
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 に登録できます。