Buat middleware

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:

Input dan output VSIDLC

Gambar 1. Input dan output VSIDLC.

Berikut adalah penjelasan diagram:

  1. 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.bp di setiap direktori katalog menentukan target build rust_protobuf untuk semua file proto dalam katalog. VSIDLC menggunakan crate_name yang ditentukan dalam target ini untuk mereferensikan jenis pesan protobuf yang dihasilkan di Rust.
  2. Anda menjalankan VSIDLC untuk menghasilkan file berikut:

    • File Android.bp dibuat dalam folder setiap paket layanan. Jika Anda menetapkan --genrule, target ini akan menghasilkan file Rust terbaru selama proses build dan menyertakan dependensi library rust_protobuf yang diperlukan.

    • File service_bundle.rs dibuat untuk setiap paket layanan dan berisi struct dan fungsi utama untuk berinteraksi dengan komponen middleware.

    • File lib.rs dibuat untuk setiap layanan RPC yang dimiliki oleh paket dan ditempatkan di subfolder yang diberi nama sesuai dengan layanan RPC. File ini mencakup:

    • Trait Interface mengimplementasikan logika sisi server.

    • Struct Client melakukan panggilan ke layanan RPC.

    • File diagnostics.rs dibuat jika diagnostics_declaration ada 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 direktori apex/ dan configs/ serta mencakup file .textproto orkestrasi dan kebijakan keamanan (izin) yang diperlukan untuk komunikasi layanan ke layanan.

    • Boilerplate layanan dibuat saat menggunakan flag --services. Boilerplate ini ditempatkan di direktori services/ dan berisi kerangka aplikasi Rust, termasuk file main.rs, untuk memulai implementasi Anda.

Menjalankan VSIDLC

Untuk menjalankan VSIDLC:

  1. Jika Anda belum menyiapkan lingkungan, jalankan source build/envsetup.sh.

  2. Jalankan perintah berikut untuk mem-build VSIDLC:

    m vsidlc
    
  3. Pastikan direktori katalog VSIDL Anda memiliki file build, protobuf, dan VSIDL yang diperlukan.

  4. Jalankan perintah vsidlc:

    vsidlc -c path_to_catalog -o output_directory -p
    

    Dengan:

    • -c path_to_catalog mengidentifikasi jalur ke direktori katalog utama.
    • -o output_directory mengidentifikasi direktori induk tempat direktori output generated_rs dibuat.
    • (opsional) --apex menghasilkan artefak konfigurasi orkestrasi dan keamanan.
    • (opsional) --services menghasilkan kerangka aplikasi Rust jumpstart.
    • (opsional) -p menghapus direktori yang dihasilkan (seperti generated_rs, dan jika berlaku apex, configs, atau services) sebelum membuat file baru.
    • (opsional) --genrule menghasilkan genrule Android.bp, bukan kode Rust. Genrule menghasilkan kode Rust yang diperlukan dengan cepat saat menjalankan m untuk menghindari penempatan artefak yang dihasilkan di bawah kontrol versi.

    Direktori generated_rs dibuat yang berisi Android.bp dan 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:

Contoh hierarki dependensi VSIDLC

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 nilai pretty-please:

    vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-please
    
  • Untuk 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.