車両固有の電源管理をサポートするため、Android には CarPowerManagementService
サービスと CarPowerManager
インターフェースが用意されています。
状態遷移は車両マスター コントロール ユニット(VMCU)によってトリガーされます。VMCU と通信するために、インテグレータは複数のコンポーネントを実装する必要があります。インテグレータは、Vehicle Hardware Abstraction Layer(VHAL)やカーネル実装との統合を行います。また、復帰ソースを無効にし、シャットダウンが無期限に延期されないようにします。
用語
以下の用語は、このドキュメント全体で使用されています。
suspend()
と shutdown()
の最終呼び出しを実行します。システム設計
このセクションでは、AAOS がどのようにアプリ プロセッサの電源状態を表し、どのモジュールが電源管理システムを実装するかについて説明します。また、これらのモジュールがどのように連携し、通常どのように状態遷移が発生するのかについても説明します。
車両の電源ステートマシン
AAOS はステートマシンを使用して AP の電源状態を表します。ステートマシンは、次の図に示す状態を表します。
図 1. 車両の電源ステートマシン。
最も一般的な遷移を青色でハイライト表示しています。それぞれの状態と一般的な遷移は次のとおりです。
- Suspend-to-RAM。車両と SoC がオフの状態です。コードは実行されていません。電力は SoC RAM に対して維持されます。
- Wait for VHAL。運転手が車両を操作(ドアを開けるなど)すると、VMCU は SoC に電力を適用します。AAOS は Suspend-to-RAM から再開し、Wait for VHAL に移行して VHAL との連携を待機します。
- On。VHAL は、AAOS に On 状態に移行するように指示します。この状態では、AAOS は完全に動作しており、運転手との通信に応答しています。
- Shutdown Prepare。運転手が運転を終えると、VHAL は AAOS に対し、シャットダウンの準備に入るよう指示します。この状態では、ディスプレイと音声はオフになっており、AAOS は運転手との通信を行っていません。Android システムは引き続き実行中であり、アプリや Android システムの更新を自由に行うことができます。更新が完了すると、Android システムは Wait for VHAL Finish 状態に入ります。
- Wait for VHAL Finish。この時点で、AAOS はシャットダウンの準備が完了したことを VHAL に通知します。VMCU は SoC をディープ スリープに移行させ、アプリ プロセッサの電力をオフにします。実行中のコードはありませんが、AAOS は Suspend-to-RAM 状態に移行します。
電源管理モジュール
電源管理システムは、次のモジュールで構成されています。
モジュール名 | 説明 |
---|---|
CarPowerManager | Java または C++ API。 |
CarPowerManagementService | 電源状態の遷移を調整。 |
CarPowerPolicyDaemon | ネイティブの電源ポリシー クライアントと通信。 |
車両 HAL | VMCU へのインターフェース。 |
カーネル | Suspend to RAM またはディスクの実装。 |
ディープ スリープ / 休止状態の機能(Android を一時停止して RAM / ディスクに保存)はカーネルに実装されます。この機能は、/sys/power/state
にある特別なファイルとしてユーザー空間に公開されます。AAOS は、このファイルに mem
または disk
を書き込むことで一時停止されます。
CPMS は、他のサービスや HAL と電源状態を調整します。上記のステートマシンを実装し、電源状態の遷移が発生するとすべてのオブザーバーに通知を送信します。このサービスはまた、VHAL を使用してハードウェアにメッセージを送信します。
CPPD は、CPMS が制御するまで電源ポリシーを管理します。また、電源ポリシー変更通知をネイティブ リスナーに送信します。
一部のプロパティは VHAL で定義されています。VMCU と通信するために、CPMS はこれらのプロパティの読み取りと書き込みを行います。アプリは、CPM で定義されたインターフェースを使用して電源状態の変化を監視できます。このインターフェースにより、アプリは電源ポリシー リスナーを登録することもできます。この API は Java から呼び出すことができ、@hide または @System API のアノテーションが付けられます。これは特権アプリのみが使用できることを意味します。これらのモジュール、アプリ、サービスの関係を以下に示します。
図 2. 電源コンポーネントの参照図。
メッセージ シーケンス
前のセクションでは、電源管理システムを構成するモジュールについて説明しました。このセクションでは、ディープ スリープの開始とディープ スリープの終了の例を使用して、モジュールとアプリの通信方法について説明します。
ディープ スリープの開始
VMCU のみがディープ スリープを開始できます。ディープ スリープが開始されると、VMCU は VHAL 経由で CPMS に通知を送信します。CPMS は状態を SHUTDOWN PREPARE に変更し、CPM によって指定された新しいステータス ID を持つ onStateChanged()
メソッドを呼び出すことによって、この状態遷移をすべてのオブザーバー(CPMS を監視するアプリとサービス)にブロードキャストします。
CPM はアプリまたはサービスと CPMS を仲介します。アプリまたはサービス向けの onStateChanged()
メソッドは、CPM の onStateChanged()
メソッドで同期的に呼び出されます。ほとんどのアプリとサービスは、この呼び出しから戻る前に準備を完了する必要があります。特権サービスは、PRE_SHUTDOWN_PREPARE
、SUSPEND_ENTER
、POST_SUSPEND_ENTER
で返された後も非同期的に準備を継続できます。この場合、特権サービスは、準備を完了すると完成した CompletablePowerStateChangeFuture
オブジェクトで complete() を呼び出すことが想定されます。なお、SHUTDOWN_PREPARE
では非同期の準備は許可されていません。DEEP_SLEEP_ENTRY
が VHAL に送信される前に、CPMS はシャットダウンの延期リクエストを VHAL に定期的に送信します。
すべての CPM オブジェクトでシャットダウンの準備が完了すると、CPMS は VHAL に AP_POWER_STATE_REPORT
を送信します。その後、VCU は AP を一時停止する準備ができたことを VMCU に通知します。また、CPMS は一時停止メソッドを呼び出し、カーネルを一時停止します。
上記のシーケンスを以下の図に示します。
図 3. ディープ スリープの開始。
CPM が備えるプログラミング インターフェース
このセクションでは、CPM が備えるシステムアプリとサービス用の Java API について説明します。この API を使用すると、システム ソフトウェアで次のことができます。
- AP の電源状態の変化を監視する。
- 電源ポリシーを適用する。
CPM に備えられた API を呼び出すには、次の手順を実施します。
- CPM インスタンスを取得するために、自動車 API を呼び出します。
- ステップ 1 で作成したオブジェクトで適切なメソッドを呼び出します。
CarPowerManager オブジェクトの作成
CPM オブジェクトを作成するには、Car オブジェクトの getCarManager()
メソッドを呼び出します。このメソッドは、CPM オブジェクトの作成に使用されるファサードです。android.car.Car.POWER_SERVICE
を引数として指定し、CPM オブジェクトを作成します。
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener と登録
システムアプリとサービスは、CarPowerManager.CarPowerStateListener
を実装することで電源状態の変更通知を受信できます。このインターフェースは単一のメソッドである onStateChanged()
を定義します。これは CPMS の電源状態が変更されたときに呼び出されるコールバック関数です。次の例では、インターフェースを実装する新しい匿名クラスを定義します。
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
このリスナー オブジェクトに指示して電源状態の遷移を監視させるには、新しい実行スレッドを作成し、リスナーとこのスレッドを CPM オブジェクトに登録します。
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
電源状態が変更されると、リスナー オブジェクトの onStateChanged()
メソッドが、新しい電源状態を表す値で呼び出されます。実際の値と電源状態の関係は CarPowerManager
で定義され、次の表にも示されています。
名前 | 説明 |
---|---|
STATE_ON | ON 状態に移行します。システムは完全に稼働しています。 |
STATE_SHUTDOWN_CANCELLED | シャットダウンはキャンセルされ、電源状態は通常の状態に戻ります。 |
STATE_SHUTDOWN_ENTER | アプリはクリーンアップされ、シャットダウン状態に移行する準備が完了します。 |
STATE_POST_SHUTDOWN_ENTER | シャットダウン状態の準備が完了し、VMCU はシャットダウン状態に移行できるようになり、シャットダウン状態に移行します。 |
STATE_PRE_SHUTDOWN_PREPARE | シャットダウン プロセスがリクエストされましたが、CPMS はまだプロセスを開始していません。ディスプレイと音声はオンのままです。 |
STATE_SHUTDOWN_PREPARE | この間にガレージモードが実行されることがあります。 |
STATE_SUSPEND_ENTER | アプリはクリーンアップされ、suspend-to-RAM 状態に移行する準備が完了します。 |
STATE_POST_SUSPEND_ENTER | suspend-to-RAM 状態の準備が完了し、VMCU は suspend-to-RAM 状態に移行できるようになり、一時停止状態に移行します。 |
STATE_SUSPEND_EXIT | 一時停止から復帰するか、キャンセルされた一時停止から再開します。 |
STATE_HIBERNATION_ENTER | アプリはクリーンアップされ、休止状態に移行する準備が完了します。 |
STATE_POST_HIBERNATION_ENTER | 休止状態の準備が完了し、VMCU は休止状態に移行できるようになり、休止状態に移行します。 |
STATE_HIBERNATION_EXIT | 休止状態から復帰するか、キャンセルされた休止状態から再開します。 |
STATE_WAIT_FOR_VHAL | システムは起動していますが、ON 状態に移行する前に VHAL との通信を確立するのを待機しています。 |
CarPowerStateListener の登録解除
CPM に登録されているすべてのリスナー オブジェクトの登録を解除するには、以下のように clearListener
メソッドを呼び出します。
powerManager.clearListener();
Android の実装におけるシステム統合
インテグレータは以下の項目を実装します。
- Android を一時停止するカーネル インターフェースを実装する。
- 次の VHAL 関数を実装する。
- 一時停止またはシャットダウンの開始を自動車から Android に伝播。
- シャットダウン準備完了メッセージを Android から自動車に送信。
- Linux カーネル インターフェースを使用して Android のシャットダウンまたは一時停止を開始。
- デバイスが一時停止状態のときに、すべての復帰ソースが無効になっていることを確認する。
- シャットダウン プロセスが無期限に延期されないよう、アプリのすばやいシャットダウンを確実に行う。
- 一時停止や休止状態をブロックしないよう、BSP が電源ポリシーに沿ってデバイス コンポーネントをオン(またはオフ)にすることを確認する。
カーネル インターフェース: /sys/power/state
AAOS は、アプリまたはサービスが mem
(suspend-to-RAM の場合)または disk
(suspend-to-disk の場合)を /sys/power/state
にあるファイルに書き込むと、デバイスを一時停止モードにします。インテグレータは、このファイルをモニタリングし、Linux の電源を一時停止の状態にする関数を用意する必要があります。この関数で GPIO を VMCU に送信して、デバイスが完全にシャットダウンしたことを VMCU に通知することもできます。インテグレータは、最終的なメッセージを VMCU に送信する VHAL と、一時停止またはシャットダウン モードに移行するシステム間の競合状態を排除する必要もあります。
VHAL の役割
VHAL は車両ネットワークと Android 間のインターフェースを提供します。VHAL は以下の役割を果たします。
- 一時停止またはシャットダウンの開始を自動車から Android に伝播。
- シャットダウン準備完了メッセージを Android から自動車に送信。
- Linux カーネル インターフェースを使用して Android のシャットダウンまたは一時停止を開始。
CPMS が VHAL にシャットダウンの準備ができたことを通知すると、VHAL はシャットダウン準備完了メッセージを VMCU に送信します。通常、UART、SPI、USB などの内蔵周辺機器がメッセージを送信します。メッセージが送信されると、CPMS はカーネル コマンドを呼び出してデバイスを一時停止またはシャットダウンします。これを行う前に、VHAL または BSP は GPIO を切り替えて、デバイスの電力をオフにしても安全であることを VMCU に指示できます。
VHAL は、VHAL を介した電源管理を制御する次のプロパティをサポートする必要があります。
名前 | 説明 |
---|---|
AP_POWER_STATE_REPORT | Android はこのプロパティの VehicleApPowerStateSet 列挙値を使用して、VMCU に状態遷移を通知します。 |
AP_POWER_STATE_REQ | VMCU はこのプロパティの VehicleApPowerStateReq 列挙値を使用して、Android に別の電源状態に移行するよう指示します。 |
AP_POWER_STATE_REPORT
このプロパティを使用して、Android の現在の電源管理状態を通知します。このプロパティには 2 つの整数型が含まれます。
int32Values[0]
: 現在の状態の VehicleApPowerStateReport 列挙値。int32Values[1]
: 延期、スリープまたはシャットダウンの時間(ミリ秒単位)。この値の意味は、最初の値によって異なります。
最初の値には次のいずれかの値を指定できます。具体的な説明を含む VehicleApPowerStateReport.aidl
は、hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle
にあります。
値の名前 | 説明 | 2 つ目の値 |
---|---|---|
WAIT_FOR_VHAL | AP が起動しています。VHAL との通信を確立する必要があります。 | |
DEEP_SLEEP_ENTRY | AP がディープ スリープ状態を開始しています。VMCU は、2 番目の値で指定された時間が経過した後に AP を再びオンにする必要があります。 | 要設定 |
DEEP_SLEEP_EXIT | AP がディープ スリープ状態を終了しています。 | |
HIBERNATION_ENTRY | AP が休止状態を開始しています。VMCU は、2 番目の値で指定された時間が経過した後に AP を再びオンにする必要があります。 | 要設定 |
HIBERNATION_EXIT | AP が休止状態を終了しています。 | |
SHUTDOWN_POSTPONE | Android はシャットダウンの準備ができていません。VMCU は AP をシャットダウンする前に、2 番目の値で指定された時間だけ待機する必要があります。Android は、追加の SHUTDOWN_POSTPONE レポートを発行することで、追加の延期をリクエストする場合があります。 | 要設定 |
SHUTDOWN_PREPARE | Android はシャットダウンの準備をしています。 | 要設定 |
SHUTDOWN_START | AP はシャットダウンする準備が完了しました。VMCU は、2 番目の値で指定された時間が経過した後に AP を再びオンにする必要があります(VMCU は、時間を指定してオンにする機能をサポートする必要はありません)。 | 要設定 |
SHUTDOWN_CANCELLED | 現在、Android はシャットダウンの準備を停止しており、WAIT_FOR_VHAL に進みます。 | |
ON | Android は正常に動作しています。 |
状態は、自律的に設定できます。または、VMCU を介したリクエストに応じて設定することもできます。
AP_POWER_STATE_REQ
このプロパティは、Android を別の電源状態に移行するために VMCU によって送信されます。このプロパティには次の 2 つの整数型が含まれます。
int32Values[0]
:VehicleApPowerStateReq
列挙値。遷移先の新しい状態を表します。int32Values[1]
:VehicleApPowerStateShutdownParam
列挙値。この値は、SHUTDOWN_PREPARE
メッセージでのみ送信され、含まれるオプションを Android に送信します。
最初の整数値は、Android が遷移する新しい状態を表します。セマンティクスは VehicleApPowerStateReq.aidl
で定義されています。以下にその一覧を示します。
値の名前 | 説明 |
---|---|
ON | AP がフル オペレーションを開始する必要があります。 |
SHUTDOWN_PREPARE | AP がシャットダウンする準備が必要です。2 番目の値は、AP がシャットダウンを延期できるかどうか、AP が電源をオフにするか、ディープ スリープに入るかどうかを示します。 |
CANCEL_SHUTDOWN | AP がシャットダウンする準備を中止し、ON に切り替わる準備をする必要があります。 |
FINISHED | AP はシャットダウンまたは一時停止されます。 |
VehicleApPowerStateShutdownParam
は VehicleApPowerStateShutdownParam.aidl
で定義されます。この列挙値には次の要素があります。
値の名前 | 説明 |
---|---|
CAN_SLEEP | AP は完全にシャットダウンする代わりに、ディープ スリープ モードに入ることができます。延期が許可されています。 |
CAN_HIBERNATE | AP は完全にシャットダウンする代わりに、休止状態に入ることができます。延期が許可されています。 |
SHUTDOWN_ONLY | AP はシャットダウンする必要があります。延期が許可されています。ディープ スリープは許可されていません。 |
SLEEP_IMMEDIATELY | AP はディープ スリープ モードに入ることもできますが、直ちにスリープまたはシャットダウンする必要があります。延期は許可されていません。 |
HIBERNATE_IMMEDIATELY | AP は suspend-to-disk 状態に入ることがありますが、すぐに休止状態またはシャットダウン状態になる必要があります。延期は許可されていません。 |
SHUTDOWN_IMMEDIATELY | AP は直ちにシャットダウンする必要があります。延期は許可されていません。ディープ スリープは許可されていません。 |
復帰ソース
インテグレータは、デバイスが一時停止モードのときに、適切な復帰ソースを無効にする必要があります。一般的な復帰ソースには、ハートビート、モデム、Wi-Fi、Bluetooth があります。SoC を復帰させるための VMCU の割り込みが、唯一の有効な復帰ソースであることが必要です。これは、VMCU がリモート復帰イベント(リモート エンジン起動など)に備えてモデムをリッスンできることを前提としています。この機能が AP にプッシュされる場合、モデムにサービスを提供する別の復帰ソースを追加する必要があります。
アプリ
OEM は、アプリを迅速にシャットダウンできるように、またシャットダウン プロセスを無期限に延期できないように、慎重にアプリを作成する必要があります。
付録
ソースコード ツリー内のディレクトリ
コンテンツ | ディレクトリ |
---|---|
CarPowerManager 関連のコード。 | packages/services/Car/car-lib/src/android/car/hardware/power |
CarPowerManagementService など。 | packages/services/Car/service/src/com/android/car/power |
VHAL を扱うサービス(VehicleHal や HAlClient など)。 |
packages/services/Car/service/src/com/android/car/hal |
VHAL インターフェースとプロパティの定義。 | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
CarPowerManager についてのアイデアを提供するサンプルアプリ。 |
packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
クラスの図
次のクラスの図は、電源管理システムにおける Java のクラスとインターフェースを示しています。
図 4. 電源クラスの図。
オブジェクトの関係
図 5 は、どのオブジェクトが他のオブジェクトへの参照を持つかを示しています。エッジは、ソース オブジェクトがターゲット オブジェクトへの参照を保持することを意味します。たとえば、VehicleHAL には PropertyHalService オブジェクトへの参照があります。
図 5. オブジェクト参照図。