Tạo phần mềm trung gian

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:

Đầu vào và đầu ra của VSIDLC

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ơ đồ:

  1. 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.bp trong mỗi thư mục danh mục xác định các mục tiêu bản dựng rust_protobuf cho tất cả tệp proto trong danh mục. VSIDLC sử dụng crate_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.
  2. 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ện rust_protobuf cần thiết.

    • Tệp service_bundle.rs được tạo cho mỗi gói dịch vụ và chứa struct chí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 Interface triển khai logic phía máy chủ.

    • Cấu trúc Client thực hiện các lệnh gọi đến dịch vụ RPC.

    • Tệp diagnostics.rs được tạo nếu diagnostics_declaration có 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ục apex/configs/ và bao gồm các tệp điều phối .textproto và 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ục services/ và chứa một khung ứng dụng Rust, bao gồm cả tệp main.rs, để khởi động quá trình triển khai.

Chạy VSIDLC

Cách chạy VSIDLC:

  1. Nếu bạn chưa thiết lập môi trường, hãy chạy source build/envsetup.sh.

  2. Chạy lệnh sau để tạo VSIDLC:

    m vsidlc
    
  3. Đả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.

  4. Chạy lệnh vsidlc:

    vsidlc -c path_to_catalog -o output_directory -p
    

    Trong trường hợp:

    • -c path_to_catalog xác định đường dẫn đến thư mục danh mục chính.
    • -o output_directory xác định thư mục mẹ nơi thư mục đầu ra generated_rs được tạo.
    • (không bắt buộc) --apex tạ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) --services tạo khung ứng dụng Rust khởi động nhanh.
    • (không bắt buộc) -p xoá các thư mục đã tạo hiện có (như generated_rs và nếu có thể áp dụng apex, configs hoặc services) trước khi tạo tệp mới.
    • (không bắt buộc) --genrule tạo genrule Android.bp thay vì mã Rust. Genrule tạo mã Rust cần thiết ngay lập tức khi chạy m để 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ứa Android.bp và 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:

Ví dụ về cây phần phụ thuộc VSIDLC

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_PATHRUSTFMT_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.