リファレンス実装

AIDL VHAL のリファレンス実装を提供します。メインサービス スレッドは VehicleService.cpp に実装されています。VHAL インターフェースの実装は DefaultVehicleHal.cpp にあります。

リファレンス実装は 2 層アーキテクチャに基づいています。上層の DefaultVehicleHal では、VHAL AIDL インターフェースを実装し、すべてのハードウェア デバイスに汎用の VHAL ロジックを提供します。下層の FakeVehicleHardware では、IVehicleHardware インターフェースを実装します。このクラスは、実際のハードウェアまたは車両バスを操作する VHAL ロジックをシミュレートするもので、デバイス固有です。オプションとしてベンダーは、同じアーキテクチャの採用、同じ DefaultVehicleHal クラスの再利用(メソッドを上書きするために拡張)、独自の IVehicleHardware 実装の提供ができます。

VHAL リファレンス実装
図 1. VHAL リファレンス実装

DefaultVehicleHal には以下のロジックが含まれており、汎用的であるとみなされ、あらゆる VHAL 実装に適用できます。

  • IVehicle インターフェースを実装します。
  • ID の重複チェックなど、基本的な入力チェックを行います。
  • 各バインダ クライアントの操作ごとにクライアント オブジェクト(GetValuesClient など)を割り当て、グローバル プールにそれぞれ追加します。
  • 保留中のリクエストを保留中のリクエスト プールに追加するなどの非同期コールバック ロジックを管理します。結果を受信したときに保留中のリクエストを解決するか、保留中のリクエストの一つがタイムアウトしたときにエラーを返します。
  • LargeParcelable をシリアル化または逆シリアル化します(ParcelableUtils.h を参照)。
  • サブスクリプションを管理します(SubscriptionManager.h を参照)。
  • 権限をチェックします(checkReadPermission 機能と checkWritePermission 機能を参照)。
  • 定期的に IVehicleHardware.checkHealth を呼び出し、ハートビート シグナルを送信します(checkHealth 機能を参照)。

IVehicleHardware は、VHAL のハードウェア固有の実装を表現するために使用する汎用インターフェースです。IVehicleHardware のリファレンス実装は FakeVehicleHardware で、プロパティ値を格納するためにメモリ内マップを使用します。実際の車両バスとは通信しません。エミュレータ上で動作し、ハードウェア固有の依存関係を持たないことが想定されています。ベンダーの実装では、そのまま使用してはならず、車両バス固有のロジックを追加する必要があります。

Android 14 では、FakeVehicleHardware は初期化中に、JSON 形式の構成ファイルを含むデバイスの /vendor/etc/automotive/vhalconfig/ フォルダから実行時にサポートされているプロパティ構成を読み取ります。構成ファイルの形式と内容については、リファレンス VHAL README ファイルをご覧ください。

FakeVehicleHardware は、テスト用の構成ファイルの上書きもサポートしています。システム プロパティ persist.vendor.vhal_init_value_override が設定されている場合、デバイス上の /vendor/etc/automotive/vhaloverride/ フォルダにある構成ファイルを使用して、既存の構成を上書きします。ベンダー実装では、VHAL 対応プロパティ構成をハードコードせず、起動時に動的に決定できるように、同様の手法を使用できます。車両のプロパティ構成は、デバイス起動後は静的でなければなりません。