HAR プラットフォーム抽象化レイヤ

高可用性レンダラ(HAR)を使用して、Android で表示できない車両情報を表示します。これは、起動、可用性、安全性、規制などの問題が原因で発生する可能性があります。HAR は、Rust で記述されたポータブルな組み込みアプリです。

HAR(HAR フレームワークとも呼ばれます)には、アプリのビルドに使用するコードが含まれています。HAR で構築されたアプリは HAR ベースのアプリです。HAR フレームワークには、さまざまなプラットフォーム用のコード セクションがあります。たとえば、Linux システムでは、サウンドに tinyalsa などのライブラリを使用します。QNX には独自のオーディオ ライブラリがあります。

プラットフォームには、ハードウェア、オペレーティング システム、システム ライブラリなどの要素が含まれます。プラットフォーム固有のコードには、サブシステムと呼ばれる部分があります。各サブシステムは、音声、EVS カメラ、車両データなどのプラットフォーム機能を 1 つ処理します。プラットフォームをサポートするには、HAR フレームワークのすべてのサブシステムが実装されている必要があります。

プラットフォーム固有のサブシステム コードは、HAR ベースのアプリと同じプロセスで実行されることも、別のプロセスで実行されることもあります。分離されている場合、このコードはプロセス間通信(IPC)を処理して、プラットフォームがアプリをサポートしているかどうかを確認します。複雑な IPC メカニズムは、プラットフォーム固有のコードの一部でなければなりません。

HAR テストスイートは、プラットフォーム用に実装されたすべてのサブシステムでテストを実行します。このスイートを使用して、プラットフォームが HAR 要件を満たしているかどうかを確認し、新しい問題を見つけます。

用語

このページでは以下の用語を使用します。

HAR ベースのアプリ
HAR フレームワークで構築された OEM または機能固有のアプリ。アプリは、アプリの状態やその他のカスタマイズ可能な側面によって異なります。
HAR フレームワーク
アプリのビルドに使用されるコアツールセットを提供します。
HAR プラットフォームの抽象化
すべてのターゲット プラットフォームが実装する必要がある既知の API を提供する HAR フレームワークの一部。
HAR テストスイート
プラットフォーム実装に関する一連の既知のテスト。プラットフォーム実装が特定のプラットフォームで HAR フレームワークをサポートしていることを確認するのに役立ちます。

適用対象外

HAR では次のことはできません。

  • すべてのプラットフォーム ターゲットの個々の実装: ターゲット プラットフォームの実装。このページでは、プラットフォーム実装が満たす必要のあるインターフェースと、テストスイートが満たす必要のあるインターフェースについて説明します。

  • テストケース: すべてのインターフェースの具体的なテストケース。このページでは、引数、戻り値、想定される動作、想定される副作用など、インターフェースの個々の関数について説明します。このページでは、テストケースを実装して実行できるテストスイートについて説明します。

プラットフォーム抽象化の上位レベルのクレート構造

Rust プロジェクトはクレートで構成されます。図 1 は、HAR プラットフォーム抽象化レイヤのクレート構造を示しています。プラットフォーム抽象化レイヤは、2 つ以上の Rust クレートに影響します。

  • 抽象化(Rust trait の説明)は HAR フレームワーク クレートにあります。

  • プラットフォームの実装は、別の har-platform-x クレートによって行われます。たとえば、har-platform-linux や har-platform-android です。

プラットフォーム実装を指定しないと、HAR クレートをビルドまたはテストできません。HAR フレームワークはフレームワークであるため、これは意図的なものです。

プラットフォームを指定するアプリは、このフレームワークでビルドして、機能させ、テストする必要があります。HAR フレームワークとプラットフォーム間の接続は、次の図のとおりです。

HAR クレート

図 1. HAR クレート。

display-safety 内の一般的な構造

この設計では、図 2 に示すように、display_safety リポジトリに一連の新しいクレートを追加します。

HAR クレート、フレームワーク、アプリ

図 2. 抽象化モジュール。

テストスイートは構造的にはアプリに似ていますが、特定のプラットフォーム実装クレートのみに依存します。テストスイートは HAR フレームワークで定義されたトレイトと構造を参照する必要がありますが、より複雑な実装を参照してはなりません。

プラットフォーム抽象化レイヤの概要

次の表に、HAR プラットフォーム抽象化レイヤによって定義されるプラットフォーム固有のサブシステムを示します。

抽象化名 関連する関数 説明 メモ
OpenGL 2D レンダリング HAR フレームワーク クレートに OpenGLES 2.0/3.0 レンダリング機能を提供します。
Audio 音声レンダリング システム オーディオを管理、再生するための Android SoundPool のようなインターフェースを提供します。
Camera 車両カメラのディスプレイ 車載カメラの情報を管理して表示するための EVS HAL のようなインターフェースを提供します。
Looper アプリのメインループとディスプレイ構成 プラットフォーム固有のアプリのメインループとディスプレイ構成を管理するための Android Looper のようなインターフェースを提供します。
UserInput タッチ、キーボード、ハンドル、ロータリー コントローラ、その他のプラットフォーム固有の入力 HAR ベースのアプリにタッチ入力とキーボード入力を行うためのインターフェースを提供します。har-user-input-evdev の Linux evdev に基づくリファレンス実装。
VehicleData 車両の状態の入力 Android VHAL や CAN バス などが提供する任意の車両データのストリームを HAR ベースのアプリに提供するインターフェースを提供します。
ResourceManager アプリ固有のキャッシュに保存された設計ドキュメント キャッシュされた画像や設計ドキュメントなど、HAR の起動に必要なリソースのメモリ内キャッシュを提供します。ディスク キャッシュはまだ実装されていません。
Logging システム ロギングとテレメトリー トレース システムを使用して、プラットフォーム固有のロギング サポートを提供します。これにより、プラットフォームで必要なテレメトリー収集が可能になります。
Tracing システム トレース トレース システムとプロファイリング システムを統合するための抽象化を提供します。
Monitoring システムのモニタリング HAR フレームワーク内のパフォーマンスとレイテンシをモニタリングするためのツールキット。
Commlib 車両データ protobuf シリアル化を使用したリファレンス実装。非推奨: reference/harry-control-api で定義された API と、実装 harry-grpcio-server および harry-tonic-server(リファレンス実装)を使用します。
TestSupport テストサポートフック テストケースのビルドアップとティアダウン、テストイベントの生成、テスト アーティファクトの作成をサポートします。たとえば、UserInput をテストするためのシミュレートされたタッチイベントの生成や、分析用のスクリーンショットの生成などがあります。 この機能は、製品版のビルドに含まれないように Rust によってロックされています。

命名規則とフレームワーク構造

次の表に、これらの名前と構造を示します。

  • HAR フレームワークによって提供される、想定されるサブシステム trait インスタンス。各 trait は、実装する必要があるプラットフォーム固有のサブシステムを表します。

  • プラットフォーム クレート内のプラットフォーム固有のサブシステム実装の想定される名前。HAR ベースのアプリは、これらの特定の名前が実装されることを想定しています。

  • プラットフォーム関連の実装から HAR フレームワークに情報を渡すために通常使用される、関連する HAR フレームワーク enum インスタンスと struct インスタンス。

トレイト名 実装名 HAR フレームワークの列挙型と構造体
GlContextFactory OpenGL trait harry::Renderer
harry::DisplayRotation
AudioApiFactory Audio harry::AudioApi
harry::AudioDevice
harry::VolumeMillibel
ICameraManager Camera harry::ICameraDevice
harry::CameraDescriptor
Looper Looper harry::LooperMessage
harry::LooperOptions
harry::DisplayId
PlatformVehicleData VehicleData harry::VehicleDataType
harry::VehicleDataListener
ResourceManager(構造体) ResourceManager harry::ResourceManagerMessage
harry::ResourceToken
harry::RawImageData
PlatformTracing Tracing なし
HarPerformanceMonitor Monitoring harry::Renderer
harry::ResolveLatencyToken
PlatformTestSupport TestSupport harry::TestConfig
harry::TestDisplayConfig

エラーとエラー処理

提案された API は Rust の Result<> 型を使用します。Rust では、エラーを伝播する Result 型をチェックする必要があります。そうでない場合、コンパイラは警告またはエラーを生成します。ビルド時のチェックにより、プラットフォーム固有のコードからのエラーチェックが強制されます。

プラットフォーム実装から返されるエラーは harry::error::Error 型です。プラットフォーム エラータイプがアプリコードに漏洩しないことを確認するには、HAR フレームワークが提供する標準エラータイプを使用します。

harry::error::Error 型は、すべてのサブシステムに固有のエラーを含むように拡張されます。

// This is Rust
pub enum Error {
  Msg(String), // A generic message string
  // Legacy error type, likely to be removed or merged into Msg
  Audio(String),
}

回復不能なエラーは、主に定義されたインターフェースとコールバックを通じて返されます。

テストスイートの詳細設計

このセクションでは、抽象化のプラットフォーム固有の実装を検証するテストスイートの設計について説明します。

テストスイートのテストをビルドする

Soong ビルド(Android.bp ファイルで定義)の場合、テストは Android プラットフォーム ビルドシステムの一部としてコンパイルされ、実行は atest によって管理されます。

テストスイートを実行する

個々のプラットフォームをテストするには:

関連するテスト ターゲット(atest <module_name> など)を指定して atest コマンドを使用します。このコマンドは、Android デバイスまたはエミュレータにテストをデプロイして実行します。