Middleware Vehicle Services Interface Definition Language (VSIDL) menentukan sekumpulan library Rust yang membuat lapisan abstraksi di atas tumpukan komunikasi software defined vehicle (SDV) untuk menyederhanakan penggunaan ekosistem SDV. Middleware menyediakan cara standar bagi layanan untuk berkomunikasi dan berinteraksi satu sama lain. Kode yang dihasilkan VSIDLC dan kode kustom Anda menggunakan library ini.
Compiler Vehicle Services Interface Definition Language (VSIDLC) memvalidasi definisi, menghasilkan file build (Android.bp) yang berisi target genrule untuk menghasilkan kode middleware Rust selama proses build, dan membuat konfigurasi deployment dari file VSIDL dan protobuf dalam katalog. Gambar 1 menunjukkan input ke VSIDLC dan output yang dihasilkan oleh VSIDLC:
Gambar 1. Input dan output VSIDLC.
Berikut adalah penjelasan diagram:
Sebagai input, Anda memberikan file berikut yang diatur dalam direktori yang dikenal sebagai katalog:
- File proto (dengan ekstensi
.proto) berisi struktur data yang dipertukarkan antara unit layanan yang ditentukan oleh VSIDL. - File VSIDL (dengan ekstensi
.vsidl) menentukan paket layanan, unit layanan, dan kepemilikan jenis unit. - File
Android.bpdi setiap direktori katalog menentukan target buildrust_protobufuntuk semua file proto dalam katalog. VSIDLC menggunakancrate_nameyang ditentukan dalam target ini untuk mereferensikan jenis pesan protobuf yang dihasilkan di Rust.
- File proto (dengan ekstensi
Anda menjalankan VSIDLC untuk menghasilkan file berikut:
File
Android.bpdibuat dalam folder setiap paket layanan. Jika Anda menetapkan--genrule, target ini akan menghasilkan file Rust terbaru selama proses build dan menyertakan dependensi libraryrust_protobufyang diperlukan.File
service_bundle.rsdibuat untuk setiap paket layanan dan berisistructdan fungsi utama untuk berinteraksi dengan komponen middleware.File
lib.rsdibuat untuk setiap layanan RPC yang dimiliki oleh paket dan ditempatkan di subfolder yang diberi nama sesuai dengan layanan RPC. File ini mencakup:Trait
Interfacemengimplementasikan logika sisi server.Struct
Clientmelakukan panggilan ke layanan RPC.File
diagnostics.rsdibuat jikadiagnostics_declarationada dalam file VSIDL, yang menyediakan binding yang diperlukan untuk diagnostik berbasis UDS.Konfigurasi deployment dan keamanan dibuat saat menggunakan flag
--apex. Konfigurasi ini ditempatkan di direktoriapex/danconfigs/serta mencakup file.textprotoorkestrasi dan kebijakan keamanan (izin) yang diperlukan untuk komunikasi layanan ke layanan.Boilerplate layanan dibuat saat menggunakan flag
--services. Boilerplate ini ditempatkan di direktoriservices/dan berisi kerangka aplikasi Rust, termasuk filemain.rs, untuk memulai implementasi Anda.
Menjalankan VSIDLC
Untuk menjalankan VSIDLC:
Jika Anda belum menyiapkan lingkungan, jalankan
source build/envsetup.sh.Jalankan perintah berikut untuk mem-build VSIDLC:
m vsidlcPastikan direktori katalog VSIDL Anda memiliki file build, protobuf, dan VSIDL yang diperlukan.
Jalankan perintah
vsidlc:vsidlc -c path_to_catalog -o output_directory -pDengan:
-c path_to_catalogmengidentifikasi jalur ke direktori katalog utama.-o output_directorymengidentifikasi direktori induk tempat direktori outputgenerated_rsdibuat.- (opsional)
--apexmenghasilkan artefak konfigurasi orkestrasi dan keamanan. - (opsional)
--servicesmenghasilkan kerangka aplikasi Rust jumpstart. - (opsional)
-pmenghapus direktori yang dihasilkan (sepertigenerated_rs, dan jika berlakuapex,configs, atauservices) sebelum membuat file baru. - (opsional)
--genrulemenghasilkan genruleAndroid.bp, bukan kode Rust. Genrule menghasilkan kode Rust yang diperlukan dengan cepat saat menjalankanmuntuk menghindari penempatan artefak yang dihasilkan di bawah kontrol versi.
Direktori
generated_rsdibuat yang berisiAndroid.bpdan file middleware yang dihasilkan. Direktori ini diatur dalam subdirektori yang sesuai dengan nama paket layanan yang sepenuhnya memenuhi syarat yang Anda tentukan.
Menangani dependensi
Secara default, VSIDLC hanya menghasilkan kode untuk katalog utama, bukan untuk katalog dependensi. Jika katalog Anda menggunakan jenis atau unit layanan yang ditentukan dalam katalog lain, tentukan jalur ke setiap katalog dependensi menggunakan flag -d:
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
Anda harus memberikan jalur untuk seluruh grafik dependensi, termasuk dependensi transitif (dependensi dependensi). Misalnya, Anda memiliki pohon dependensi katalog berikut:
Gambar 2. Contoh pohon dependensi VSIDLC.
Untuk menghasilkan middleware untuk setiap katalog di pohon, Anda harus menjalankan perintah berikut:
| Katalog target | Dependensi | Perintah |
|---|---|---|
| Katalog Inti SDV | T/A | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| Katalog diagnostik | Katalog Inti SDV | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| Katalog SOMEIP | Katalog diagnostik, katalog Inti SDV | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| Katalog OEM | Katalog diagnostik, katalog SOMEIP, (secara transitif) katalog Inti SDV | vsidlc -o ./generated -c ./path/to/oem_catalog -d ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
Memformat output Rust
Secara default, VSIDL menggunakan rustfmt untuk memformat output Rust. Agar default berfungsi dengan baik, tetapkan variabel lingkungan $ANDROID_BUILD_TOP atau variabel lingkungan RUSTFMT_PATH dan RUSTFMT_TOML_PATH. Untuk mengubah format default yang dihasilkan Rust, gunakan opsi --rust-formatter dengan pretty-please atau none:
Untuk mengubah format output menjadi crate
prettyplease, gunakan nilaipretty-please:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-pleaseUntuk mengubah format output menjadi tidak ada, gunakan nilai
none:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
Langkah berikutnya
Setelah membuat middleware, lihat Mengimplementasikan logika bisnis Anda.