AIDL VHAL のリファレンス実装を提供します。メインサービス スレッドは VehicleService.cpp
に実装されています。VHAL インターフェースの実装は DefaultVehicleHal.cpp
にあります。
リファレンス実装は 2 層アーキテクチャに基づいています。上層の DefaultVehicleHal
では、VHAL AIDL インターフェースを実装し、すべてのハードウェア デバイスに汎用の VHAL ロジックを提供します。下層の FakeVehicleHardware
では、IVehicleHardware
インターフェースを実装します。このクラスは、実際のハードウェアまたは車両バスを操作する VHAL ロジックをシミュレートするもので、デバイス固有です。オプションとしてベンダーは、同じアーキテクチャの採用、同じ DefaultVehicleHal
クラスの再利用(メソッドを上書きするために拡張)、独自の IVehicleHardware
実装の提供ができます。
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 対応プロパティ構成をハードコードせず、起動時に動的に決定できるように、同様の手法を使用できます。車両のプロパティ構成は、デバイス起動後は静的でなければなりません。