Genera middleware

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:

Input e output VSIDLC

Figura 1. Input e output di VSIDLC.

Di seguito è riportata una spiegazione del diagramma:

  1. 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.bp in ogni directory del catalogo definiscono i target di build rust_protobuf per tutti i file proto all'interno del catalogo. VSIDLC utilizza crate_name specificato in questi target per fare riferimento ai tipi di messaggi protobuf generati in Rust.
  2. Esegui VSIDLC per generare i seguenti file:

    • I file Android.bp vengono 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 libreria rust_protobuf necessarie.

    • I file service_bundle.rs vengono generati per ogni bundle di servizi e contengono la struct principale e le funzioni per interagire con i componenti middleware.

    • I file lib.rs vengono 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 Interface implementa la logica lato server.

    • Una struct Client effettua chiamate a un servizio RPC.

    • I file diagnostics.rs vengono generati se è presente una diagnostics_declaration nel 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 directory apex/ e configs/ e includono file di orchestrazione .textproto e policy di sicurezza (autorizzazioni) richieste per la comunicazione da servizio a servizio.

    • Quando si utilizza il flag --services viene generato un boilerplate di servizio. Questo file viene inserito in una directory services/ e contiene uno scheletro di applicazione Rust, incluso un file main.rs, per avviare l'implementazione.

Esegui VSIDLC

Per eseguire VSIDLC:

  1. Se non hai configurato l'ambiente, esegui source build/envsetup.sh.

  2. Esegui il comando seguente per creare VSIDLC:

    m vsidlc
    
  3. Assicurati che la directory del catalogo VSIDL contenga i file di build, protobuf e VSIDL necessari.

  4. Esegui il comando vsidlc:

    vsidlc -c path_to_catalog -o output_directory -p
    

    Dove:

    • -c path_to_catalog identifica il percorso della directory del catalogo principale.
    • -o output_directory identifica la directory principale in cui viene creata la directory di output generated_rs.
    • (facoltativo) --apex genera artefatti di orchestrazione e configurazione della sicurezza.
    • (facoltativo) --services genera uno scheletro di applicazione Rust di avvio rapido.
    • (facoltativo) -p elimina le directory generate esistenti (come generated_rs e, se applicabile, apex, configs o services) prima di generare nuovi file.
    • (facoltativo) --genrule genera genrule Android.bp anziché codice Rust. Le genrule generano il codice Rust necessario in tempo reale quando si esegue m per evitare di inserire gli artefatti generati nel controllo della versione.

    Viene creata una directory generated_rs contenente un file Android.bp e 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:

Esempio di albero delle dipendenze VSIDLC

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

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