電源ポリシー

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 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 への電力は維持されます。

ソフトウェア アーキテクチャ

電源ポリシーのアーキテクチャを下の図に示します。定義についてはこの後のセクションで説明します。

図 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 に登録できます。