電源ポリシー

AAOS には、ハードウェア コンポーネントとソフトウェア コンポーネント(ディスプレイ、音声、音声操作など)のオン / オフを必要に応じて選択的に切り替える電源ポリシーが用意されています。このポリシーでは、ハードウェアおよびソフトウェア コンポーネントで期待される電源のオン / オフ状態が指定されています。VHAL(システム特権のあるベンダー サービス)は、Android の電源状態が遷移したとき、または VHAL が想定している特定の条件が満たされたときに、新しい電源ポリシーを適用できます。

電力ポリシーを適用できるのは、Wait for VHAL 状態と On 状態のときです(いくつかの制限がある場合があります)。Shutdown Prepare 状態のときはガレージモードが実行中であり、電源状態の遷移によってガレージモードの実行が妨げられないようにする必要があります。Shutdown Prepare 状態で通常の電源ポリシーを適用することはできませんが、「no user interaction」という特別なシステム電源ポリシーは適用できます。

AAOS の電源状態

AAOS デバイスの電源状態は、次の図のように遷移します。

AAOS の電源状態の図

図 1. AAOS の電源状態の図。

それぞれの電源状態は次のとおりです。

説明
Off
  • アプリ プロセッサ(AP)、メモリ、周辺機器には、物理的に電力が供給されません。
Wait for VHAL
  • 運転手が車両を操作(ドアを開けるなど)すると、VMCU は AP、メモリ、周辺機器に電力を供給します。
  • AAOS は、3 つの状態(Off、Suspend-to-RAM(STR)、Wait for VHAL to finish)のいずれかから遷移して Wait for VHAL 状態に入り、VHAL との連携を待機します。
On
  • VHAL は、AAOS に On 状態に入るように指示します。この状態では、AAOS は完全に動作しており、運転手との通信に応答しています。
  • ディスプレイは、他のフォーム ファクタの Android ディスプレイのオン / オフ呼び出しではなく、電源ポリシーによって制御されます。
Shutdown prepare
  • 運転者が運転を停止すると、VHAL は AAOS に対し、Shutdown Prepare 状態に入るよう指示します。この状態では、ディスプレイと音声はオフになっており、AAOS は運転手との通信を行っていません。Android システムは引き続き実行中であり、アプリや Android システムの更新を行うことができます。更新が完了すると、Android システムは Wait for VHAL Finish 状態に入ります。
Wait for VHAL to finish
  • AAOS は VHAL にシャットダウンできることを通知します。Vehicle Microcontroller Unit(VMCU)は、システム オン チップ(SoC)をディープ スリープの状態にして、AP から電力を遮断することが期待されます。コードの実行はありませんが、AAOS はその後 STR 状態に遷移します。
  • VHAL が終了する前に運転手が戻ると、ヘッドユニット(HU)は直接 Wait for VHAL 状態に遷移します。
Suspend-to-RAM(STR)
  • 車両と AP がオフになり、コードは実行されませんが、AP RAM への電力は維持されます。
Suspend-to-disk(STD)
  • 車両と AP がオフになり、コードは実行されず、処理装置と AP RAM への電力は維持されません。

電源ポリシーの定義

実装者は、/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 interactionsuspend 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 に登録できます。