Vehicle Services Interface Definition Language(VSIDL)ミドルウェアは、ソフトウェア定義車両(SDV)通信スタックの上に抽象化レイヤを作成する一連の Rust ライブラリを定義し、SDV エコシステムの利用を簡素化します。このミドルウェアは、サービスが相互に通信してやり取りするための標準化された方法を提供します。VSIDLC で生成されたコードとカスタムコードの両方で、これらのライブラリが使用されます。
Vehicle Services Interface Definition Language コンパイラ(VSIDLC)は、定義を検証し、ビルドプロセス中に
Rust ミドルウェア コードを生成する genrule ターゲットを含むビルドファイル(Android.bp)を生成し、カタログ内の VSIDL
ファイルと protobuf ファイルからデプロイ構成を作成します。図 1 に、VSIDLC への入力と VSIDLC
によって生成された出力を示します。
図 1.VSIDLC の入力と出力。
この図の説明は次のとおりです。
入力として、カタログと呼ばれるディレクトリ内に整理された次のファイルを提供します。
- Proto ファイル(拡張子
.proto)には、VSIDL で定義されたサービスユニット間で交換されるデータ構造が含まれています。 - VSIDL ファイル(拡張子
.vsidl)は、サービス バンドル、サービスユニット、ユニットタイプの所有権を定義します。 - 各カタログ ディレクトリの
Android.bpファイルは、カタログ内のすべての proto ファイルのrust_protobufビルドターゲットを定義します。VSIDLC は、これらのターゲットで指定されたcrate_nameを使用して、生成された protobuf メッセージ タイプを Rust で参照します。
- Proto ファイル(拡張子
VSIDLC を実行して、次のファイルを出力します。
Android.bpファイルは、各サービス バンドルのフォルダ内に生成されます。--genruleを設定すると、これらのターゲットはビルドプロセス中に最新の Rust ファイルを生成し、必要なrust_protobufライブラリの依存関係を含めます。service_bundle.rsファイルは、各サービス バンドルに対して生成され、ミドルウェア コンポーネントとやり取りするためのメインのstructと関数が含まれています。lib.rsファイルは、バンドルが所有する RPC サービスごとに生成され、RPC サービスの名前が付いたサブフォルダに配置されます。これらのファイルには次のものが含まれます。Interfaceトレイトは、サーバーサイド ロジックを実装します。Client構造体は、RPC サービスを呼び出します。VSIDL ファイルに
diagnostics_declarationが存在する場合、diagnostics.rsファイルが生成され、UDS ベースの診断に必要なバインディングが提供されます。--apexフラグを使用すると、デプロイとセキュリティの構成が生成されます。これらはapex/ディレクトリとconfigs/ディレクトリに配置され、サービス間通信に必要なオーケストレーション.textprotoファイルとセキュリティ ポリシー(権限)が含まれます。--servicesフラグを使用すると、サービス ボイラープレートが生成されます。これはservices/ディレクトリに配置され、実装をすぐに開始できるように、main.rsファイルを含む Rust アプリケーションのスケルトンが含まれています。
VSIDLC を実行する
VSIDLC を実行するには:
環境を設定していない場合は、
source build/envsetup.shを実行します。次のコマンドを実行して VSIDLC をビルドします。
m vsidlcVSIDL カタログ ディレクトリに必要なビルドファイル、protobuf ファイル、VSIDL ファイルがあることを確認します。
vsidlcコマンドを実行します。vsidlc -c path_to_catalog -o output_directory -pここで
-c path_to_catalogは、メイン カタログ ディレクトリのパスを指定します。-o output_directoryは、親ディレクトリ でgenerated_rs出力ディレクトリが作成される場所を指定します。- (省略可)
--apexは、オーケストレーションとセキュリティの構成アーティファクトを生成します。 - (省略可)
--servicesは、すぐに開始できる Rust アプリケーションのスケルトンを生成します。 - (省略可)
-pは、新しいファイルを生成する前に、既存の生成されたディレクトリ(generated_rs、該当する場合はapex、configs、servicesなど)を削除します。 - (省略可)
--genruleは、Rust コードではなくAndroid.bpgenrule を生成します。 genrule は、mの実行時に必要な Rust コードをオンザフライで生成し、生成されたアーティファクトをバージョン管理下に置かないようにします。
generated_rsディレクトリが作成され、Android.bpと生成されたミドルウェア ファイルが含まれます。このディレクトリは、定義されたサービス バンドルの完全修飾名に対応するサブディレクトリ内に整理されています。
vsidlc依存関係を処理する
デフォルトでは、VSIDLC は依存関係カタログではなく、メイン カタログのコードのみを生成します。カタログで他のカタログで定義された型またはサービスユニットを使用する場合は、-d
フラグを使用して各依存関係カタログのパスを指定します。
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
推移的な依存関係(依存関係の依存関係)を含む、依存関係グラフ全体のパスを指定する必要があります。たとえば、カタログの依存関係ツリーが次のようになっているとします。
図 2.VSIDLC の依存関係ツリーの例。
ツリー内の各カタログのミドルウェアを生成するには、次のコマンドを実行する必要があります。
| ターゲット カタログ | 依存関係 | コマンド |
|---|---|---|
| SDV Core カタログ | なし | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| 診断カタログ | SDV Core カタログ | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| SOMEIP カタログ | 診断カタログ、SDV Core カタログ | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| OEM カタログ | 診断カタログ、SOMEIP カタログ、(推移的に)SDV Core カタログ | vsidlc -o ./generated -c ./path/to/oem_catalog -d ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
Rust 出力をフォーマットする
デフォルトでは、VSIDL は rustfmt を使用して Rust 出力をフォーマットします。デフォルトが正しく機能するように、$ANDROID_BUILD_TOP
環境変数または RUSTFMT_PATH 環境変数と RUSTFMT_TOML_PATH
環境変数を設定します。Rust が出力する
デフォルトの形式を変更するには、--rust-formatter オプションを
pretty-please または none とともに使用します。
出力形式をクレート
prettypleaseに変更するには、pretty-please値を使用します。vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-please出力形式をなしに変更するには、
none値を使用します。vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
次のステップ
ミドルウェアを生成したら、ビジネス ロジックを実装するをご覧ください。