車輛服務介面定義語言 (VSIDL) 中介軟體定義了一組 Rust 程式庫,可在軟體定義車輛 (SDV) 通訊堆疊上建立抽象層,簡化 SDV 生態系統的使用方式。中介軟體提供標準化方式,讓服務彼此通訊和互動。VSIDLC 產生的程式碼和您的自訂程式碼都會使用這些程式庫。
車輛服務介面定義語言編譯器 (VSIDLC) 會驗證定義、產生包含 genrule 目標的建構檔案 (Android.bp),以便在建構程序中產生 Rust 中介軟體程式碼,並從目錄中的 VSIDL 和 protobuf 檔案建立部署設定。圖 1 顯示 VSIDLC 的輸入內容,以及 VSIDLC 產生的輸出內容:
圖 1. VSIDLC 輸入和輸出內容。
下圖說明如下:
您需要提供下列檔案做為輸入內容,這些檔案會整理在稱為「目錄」的目錄中:
- Proto 檔案 (副檔名為
.proto) 包含 VSIDL 定義的服務單元之間交換的資料結構。 - VSIDL 檔案 (副檔名為
.vsidl) 會定義服務套件、服務單元和單元類型擁有權。 - 每個目錄中的
Android.bp檔案會為目錄中的所有 proto 檔案定義rust_protobuf建構目標。VSIDLC 會使用這些目標中指定的crate_name,在 Rust 中參照產生的 protobuf 訊息型別。
- Proto 檔案 (副檔名為
執行 VSIDLC,輸出下列檔案:
Android.bp檔案會產生在每個服務套件的資料夾中。 如果您設定--genrule,這些目標會在建構程序中產生最新的 Rust 檔案,並納入必要的rust_protobuf程式庫依附元件。系統會為每個服務套件產生
service_bundle.rs檔案,其中包含主要struct和函式,用於與中介軟體元件互動。系統會為套件擁有的每個 RPC 服務產生
lib.rs檔案,並放在以 RPC 服務命名的子資料夾中。這類檔案包括:Interface特徵會實作伺服器端邏輯。Client結構體會呼叫 RPC 服務。如果 VSIDL 檔案中存在
diagnostics_declaration,系統會產生diagnostics.rs檔案,為以 UDS 為基礎的診斷提供必要的繫結。使用
--apex旗標時,系統會產生部署和安全性設定。這些檔案會放在apex/和configs/目錄中,包括自動化調度管理.textproto檔案,以及服務間通訊所需的安全政策 (權限)。使用
--services旗標時,系統會產生服務樣板。這個檔案會放在services/目錄中,並包含 Rust 應用程式架構 (包括main.rs檔案),可協助您快速開始實作。
執行 VSIDLC
如要執行 VSIDLC:
如果尚未設定環境,請執行
source build/envsetup.sh。執行下列指令來建構 VSIDLC:
m vsidlc確認 VSIDL 目錄含有必要的建構、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會產生Android.bpgenrules,而非 Rust 程式碼。 執行m時,genrule 會即時產生必要的 Rust 程式碼,避免將產生的構件置於版本管控之下。
系統會建立
generated_rs目錄,其中包含Android.bp和產生的中介軟體檔案。這個目錄會依據您定義的服務套裝組合完整名稱,整理在對應的子目錄中。
處理依附元件
根據預設,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:
如要將輸出格式變更為 Crate
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
後續步驟
產生中介軟體後,請參閱「實作商業邏輯」。