ミドルウェアを生成する

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 によって生成された出力を示します。

VSIDLC の入力と出力

図 1.VSIDLC の入力と出力。

この図の説明は次のとおりです。

  1. 入力として、カタログと呼ばれるディレクトリ内に整理された次のファイルを提供します。

    • Proto ファイル(拡張子 .proto)には、VSIDL で定義されたサービスユニット間で交換されるデータ構造が含まれています。
    • VSIDL ファイル(拡張子 .vsidl)は、サービス バンドル、サービスユニット、ユニットタイプの所有権を定義します。
    • 各カタログ ディレクトリの Android.bp ファイルは、カタログ内のすべての proto ファイルの rust_protobuf ビルドターゲットを定義します。VSIDLC は、これらのターゲットで指定された crate_name を使用して、生成された protobuf メッセージ タイプを Rust で参照します。
  2. 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 を実行するには:

  1. 環境を設定していない場合は、source build/envsetup.sh を実行します。

  2. 次のコマンドを実行して VSIDLC をビルドします。

    m vsidlc
    
  3. VSIDL カタログ ディレクトリに必要なビルドファイル、protobuf ファイル、VSIDL ファイルがあることを確認します。

  4. 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、該当する場合は apexconfigsservices など)を削除します。
    • (省略可)--genrule は、Rust コードではなく Android.bp genrule を生成します。 genrule は、m の実行時に必要な Rust コードをオンザフライで生成し、生成されたアーティファクトをバージョン管理下に置かないようにします。

    generated_rs ディレクトリが作成され、Android.bp と生成されたミドルウェア ファイルが含まれます。このディレクトリは、定義されたサービス バンドルの完全修飾名に対応するサブディレクトリ内に整理されています。

vsidlc

依存関係を処理する

デフォルトでは、VSIDLC は依存関係カタログではなく、メイン カタログのコードのみを生成します。カタログで他のカタログで定義された型またはサービスユニットを使用する場合は、-d フラグを使用して各依存関係カタログのパスを指定します。

vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...

推移的な依存関係(依存関係の依存関係)を含む、依存関係グラフ全体のパスを指定する必要があります。たとえば、カタログの依存関係ツリーが次のようになっているとします。

VSIDLC 依存関係ツリーの例

図 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
    

次のステップ

ミドルウェアを生成したら、ビジネス ロジックを実装するをご覧ください。