Il middleware Vehicle Services Interface Definition Language (VSIDL) definisce un insieme di librerie Rust che creano un livello di astrazione sopra lo stack di comunicazione del veicolo definito dal software (SDV) per semplificare l'utilizzo dell'ecosistema SDV. Il middleware fornisce un modo standardizzato per i servizi di comunicare e interagire tra loro. Sia il codice generato da VSIDLC sia il codice personalizzato utilizzano queste librerie.
Il compilatore Vehicle Services Interface Definition Language (VSIDLC) convalida le definizioni, genera file di build (Android.bp) contenenti target genrule per produrre codice middleware Rust durante il processo di compilazione e crea configurazioni di deployment dai file VSIDL e protobuf in un catalogo. La Figura 1 mostra l'input di VSIDLC e l'output generato da VSIDLC:
Figura 1. Input e output di VSIDLC.
Di seguito è riportata una spiegazione del diagramma:
Come input, fornisci i seguenti file organizzati all'interno di directory note come cataloghi:
- I file Proto (con estensione
.proto) contengono strutture di dati scambiate tra le unità di servizio definite da VSIDL. - I file VSIDL (con estensione
.vsidl) definiscono i bundle di servizi, le unità di servizio e la proprietà del tipo di unità. - I file
Android.bpin ogni directory del catalogo definiscono i target di buildrust_protobufper tutti i file proto all'interno del catalogo. VSIDLC utilizzacrate_namespecificato in questi target per fare riferimento ai tipi di messaggi protobuf generati in Rust.
- I file Proto (con estensione
Esegui VSIDLC per generare i seguenti file:
I file
Android.bpvengono generati all'interno della cartella di ogni bundle di servizi. Se imposti--genrule, questi target generano file Rust aggiornati durante il processo di compilazione e includono le dipendenze della libreriarust_protobufnecessarie.I file
service_bundle.rsvengono generati per ogni bundle di servizi e contengono lastructprincipale e le funzioni per interagire con i componenti middleware.I file
lib.rsvengono generati per ogni servizio RPC di proprietà di un bundle e vengono inseriti in una sottocartella con il nome del servizio RPC. Questi file includono:Un tratto
Interfaceimplementa la logica lato server.Una struct
Clienteffettua chiamate a un servizio RPC.I file
diagnostics.rsvengono generati se è presente unadiagnostics_declarationnel file VSIDL, fornendo i binding necessari per la diagnostica basata su UDS.Le configurazioni di deployment e sicurezza vengono generate quando si utilizza il flag
--apex. Questi file vengono inseriti nelle directoryapex/econfigs/e includono file di orchestrazione.textprotoe policy di sicurezza (autorizzazioni) richieste per la comunicazione da servizio a servizio.Quando si utilizza il flag
--servicesviene generato un boilerplate di servizio. Questo file viene inserito in una directoryservices/e contiene uno scheletro di applicazione Rust, incluso un filemain.rs, per avviare l'implementazione.
Esegui VSIDLC
Per eseguire VSIDLC:
Se non hai configurato l'ambiente, esegui
source build/envsetup.sh.Esegui il comando seguente per creare VSIDLC:
m vsidlcAssicurati che la directory del catalogo VSIDL contenga i file di build, protobuf e VSIDL necessari.
Esegui il comando
vsidlc:vsidlc -c path_to_catalog -o output_directory -pDove:
-c path_to_catalogidentifica il percorso della directory del catalogo principale.-o output_directoryidentifica la directory principale in cui viene creata la directory di outputgenerated_rs.- (facoltativo)
--apexgenera artefatti di orchestrazione e configurazione della sicurezza. - (facoltativo)
--servicesgenera uno scheletro di applicazione Rust di avvio rapido. - (facoltativo)
-pelimina le directory generate esistenti (comegenerated_rse, se applicabile,apex,configsoservices) prima di generare nuovi file. - (facoltativo)
--genrulegenera genruleAndroid.bpanziché codice Rust. Le genrule generano il codice Rust necessario in tempo reale quando si eseguemper evitare di inserire gli artefatti generati nel controllo della versione.
Viene creata una directory
generated_rscontenente un fileAndroid.bpe i file middleware generati. Questa directory è organizzata all'interno di sottodirectory corrispondenti ai nomi completi dei bundle di servizi definiti.
Gestisci le dipendenze
Per impostazione predefinita, VSIDLC genera codice solo per il catalogo principale, non per i cataloghi delle dipendenze. Se il catalogo utilizza tipi o unità di servizio definiti in altri cataloghi, specifica il percorso di ogni catalogo delle dipendenze utilizzando il flag -d:
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
Devi fornire i percorsi per l'intero grafico delle dipendenze, incluse le dipendenze transitive (dipendenze delle dipendenze). Ad esempio, supponiamo di avere il seguente albero delle dipendenze del catalogo:
Figura 2. Esempio di albero delle dipendenze VSIDLC.
Per generare il middleware per ogni catalogo nell'albero, devi eseguire i seguenti comandi:
| Catalogo di destinazione | Dipendenze | Comando |
|---|---|---|
| Catalogo principale SDV | N/D | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| Catalogo di diagnostica | Catalogo principale SDV | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| Catalogo SOMEIP | Catalogo di diagnostica, catalogo principale SDV | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| Catalogo OEM | Catalogo di diagnostica, catalogo SOMEIP, (transitivo) catalogo principale 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 |
Formatta l'output Rust
Per impostazione predefinita, VSIDL utilizza rustfmt per formattare l'output Rust. Affinché il valore predefinito funzioni correttamente, imposta la variabile di ambiente $ANDROID_BUILD_TOP o le variabili di ambiente RUSTFMT_PATH e RUSTFMT_TOML_PATH. Per modificare il formato predefinito dell'output Rust, utilizza l'opzione --rust-formatter con pretty-please o none:
Per modificare il formato di output in
prettyplease, utilizza il valorepretty-please:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-pleasePer modificare il formato di output in nessuno, utilizza il valore
none:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
Passaggi successivi
Dopo aver generato il middleware, consulta Implementa la logica di business.