Phần mềm trung gian Ngôn ngữ định nghĩa giao diện dịch vụ xe (VSIDL) xác định một tập hợp các thư viện Rust tạo lớp trừu tượng trên ngăn xếp giao tiếp của xe được xác định bằng phần mềm (SDV) để đơn giản hoá việc sử dụng hệ sinh thái SDV. Phần mềm trung gian cung cấp một cách thức tiêu chuẩn để các dịch vụ giao tiếp và tương tác với nhau. Cả mã do VSIDLC tạo và mã tuỳ chỉnh của bạn đều sử dụng các thư viện này.
Trình biên dịch Ngôn ngữ định nghĩa giao diện dịch vụ xe (VSIDLC) xác thực các định nghĩa, tạo tệp bản dựng (Android.bp) chứa các mục tiêu genrule để tạo mã phần mềm trung gian Rust trong quá trình xây dựng và tạo cấu hình triển khai từ các tệp VSIDL và protobuf trong một danh mục. Hình 1 cho thấy dữ liệu đầu vào cho VSIDLC và dữ liệu đầu ra do VSIDLC tạo:
Hình 1. Dữ liệu đầu vào và đầu ra của VSIDLC.
Sau đây là phần giải thích về sơ đồ:
Là dữ liệu đầu vào, bạn cung cấp các tệp sau được sắp xếp trong các thư mục được gọi là danh mục:
- Tệp proto (có đuôi
.proto) chứa các cấu trúc dữ liệu được trao đổi giữa các đơn vị dịch vụ do VSIDL xác định. - Tệp VSIDL (có đuôi
.vsidl) xác định các gói dịch vụ, đơn vị dịch vụ và quyền sở hữu loại đơn vị. - Tệp
Android.bptrong mỗi thư mục danh mục xác định các mục tiêu bản dựngrust_protobufcho tất cả tệp proto trong danh mục. VSIDLC sử dụngcrate_nameđược chỉ định trong các mục tiêu này để tham chiếu các loại thông báo protobuf được tạo trong Rust.
- Tệp proto (có đuôi
Bạn chạy VSIDLC để xuất các tệp sau:
Tệp
Android.bpđược tạo trong thư mục của mỗi gói dịch vụ. Nếu bạn đặt--genrule, các mục tiêu này sẽ tạo tệp Rust mới nhất trong quá trình xây dựng và bao gồm các phần phụ thuộc thư việnrust_protobufcần thiết.Tệp
service_bundle.rsđược tạo cho mỗi gói dịch vụ và chứastructchính và các hàm để tương tác với các thành phần phần mềm trung gian.Tệp
lib.rsđược tạo cho mỗi dịch vụ RPC do một gói sở hữu và được đặt trong một thư mục con được đặt tên theo dịch vụ RPC. Các tệp này bao gồm:Đặc điểm
Interfacetriển khai logic phía máy chủ.Cấu trúc
Clientthực hiện các lệnh gọi đến dịch vụ RPC.Tệp
diagnostics.rsđược tạo nếudiagnostics_declarationcó trong tệp VSIDL, cung cấp các liên kết cần thiết cho tính năng chẩn đoán dựa trên UDS.Cấu hình triển khai và bảo mật được tạo khi sử dụng cờ
--apex. Các cấu hình này được đặt trong thư mụcapex/vàconfigs/và bao gồm các tệp điều phối.textprotovà chính sách bảo mật (quyền) cần thiết cho giao tiếp giữa các dịch vụ.Một mẫu dịch vụ được tạo khi sử dụng cờ
--services. Mẫu này được đặt trong thư mụcservices/và chứa một khung ứng dụng Rust, bao gồm cả tệpmain.rs, để khởi động quá trình triển khai.
Chạy VSIDLC
Cách chạy VSIDLC:
Nếu bạn chưa thiết lập môi trường, hãy chạy
source build/envsetup.sh.Chạy lệnh sau để tạo VSIDLC:
m vsidlcĐảm bảo thư mục danh mục VSIDL có các tệp bản dựng, protobuf và VSIDL cần thiết.
Chạy lệnh
vsidlc:vsidlc -c path_to_catalog -o output_directory -pTrong trường hợp:
-c path_to_catalogxác định đường dẫn đến thư mục danh mục chính.-o output_directoryxác định thư mục mẹ nơi thư mục đầu ragenerated_rsđược tạo.- (không bắt buộc)
--apextạo các cấu phần phần mềm điều phối và cấu hình bảo mật. - (không bắt buộc)
--servicestạo khung ứng dụng Rust khởi động nhanh. - (không bắt buộc)
-pxoá các thư mục đã tạo hiện có (nhưgenerated_rsvà nếu có thể áp dụngapex,configshoặcservices) trước khi tạo tệp mới. - (không bắt buộc)
--genruletạo genruleAndroid.bpthay vì mã Rust. Genrule tạo mã Rust cần thiết ngay lập tức khi chạymđể tránh đưa các cấu phần phần mềm đã tạo vào hệ thống quản lý phiên bản.
Một thư mục
generated_rsđược tạo chứaAndroid.bpvà các tệp phần mềm trung gian được tạo. Thư mục này được sắp xếp trong các thư mục con tương ứng với tên đủ điều kiện của các gói dịch vụ mà bạn đã xác định.
Xử lý các phần phụ thuộc
Theo mặc định, VSIDLC chỉ tạo mã cho danh mục chính, không tạo mã cho danh mục phần phụ thuộc. Nếu danh mục của bạn sử dụng các loại hoặc đơn vị dịch vụ được xác định trong các danh mục khác, hãy chỉ định đường dẫn đến từng danh mục phần phụ thuộc bằng cờ -d:
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
Bạn phải cung cấp đường dẫn cho toàn bộ biểu đồ phần phụ thuộc, bao gồm cả các phần phụ thuộc bắc cầu (phần phụ thuộc của phần phụ thuộc). Ví dụ: giả sử bạn có cây phần phụ thuộc danh mục sau:
Hình 2. Ví dụ về cây phần phụ thuộc VSIDLC.
Để tạo phần mềm trung gian cho từng danh mục trong cây, bạn phải chạy các lệnh sau:
| Danh mục mục tiêu | Phần phụ thuộc | Lệnh |
|---|---|---|
| Danh mục SDV Core | Không áp dụng | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| Danh mục chẩn đoán | Danh mục SDV Core | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| Danh mục SOMEIP | Danh mục chẩn đoán, danh mục SDV Core | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| Danh mục OEM | Danh mục chẩn đoán, danh mục SOMEIP, (bắc cầu) danh mục 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 |
Định dạng đầu ra Rust
Theo mặc định, VSIDL sử dụng rustfmt để định dạng đầu ra Rust. Để mặc định hoạt động đúng cách, hãy đặt biến môi trường $ANDROID_BUILD_TOP hoặc biến môi trường RUSTFMT_PATH và RUSTFMT_TOML_PATH. Để thay đổi định dạng mặc định mà Rust xuất ra, hãy sử dụng tuỳ chọn --rust-formatter với pretty-please hoặc none:
Để thay đổi định dạng đầu ra thành crate
prettyplease, hãy sử dụng giá trịpretty-please:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-pleaseĐể thay đổi định dạng đầu ra thành none, hãy sử dụng giá trị
none:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
Các bước tiếp theo
Sau khi tạo phần mềm trung gian, hãy xem bài viết Triển khai logic trong kinh doanh.