El middleware del lenguaje de definición de la interfaz de servicios para vehículos (VSIDL) define un conjunto de bibliotecas de Rust que crean una capa de abstracción sobre la pila de comunicación del vehículo definido por software (SDV) para simplificar el uso del ecosistema del SDV. El middleware proporciona una forma estandarizada para que los servicios se comuniquen e interactúen entre sí. Tanto el código generado por VSIDLC como tu código personalizado usan estas bibliotecas.
El compilador del lenguaje de definición de la interfaz de servicios para vehículos (VSIDLC) valida las definiciones, genera archivos de compilación (Android.bp) que contienen destinos genrule para producir código de middleware de Rust durante el proceso de compilación y crea configuraciones de implementación a partir de los archivos VSIDL y protobuf en un catálogo. En la figura 1, se muestran la entrada y la salida generada por VSIDLC:
Figura 1: Entradas y salidas de VSIDLC
A continuación, se explica el diagrama:
Como entradas, proporcionas los siguientes archivos organizados en directorios conocidos como catálogos:
- Los archivos .proto (con la extensión
.proto) contienen estructuras de datos que se intercambian entre las unidades de servicio definidas por VSIDL. - Los archivos VSIDL (con la extensión
.vsidl) definen paquetes de servicios, unidades de servicio y propiedad del tipo de unidad. - Los archivos
Android.bpen cada directorio del catálogo definen los destinos de compilaciónrust_protobufpara todos los archivos .proto dentro del catálogo. VSIDLC usa elcrate_nameespecificado en estos destinos para hacer referencia a los tipos de mensajes de protobuf generados en Rust.
- Los archivos .proto (con la extensión
Ejecuta VSIDLC para generar los siguientes archivos:
Los archivos
Android.bpse generan dentro de la carpeta de cada paquete de servicio. Si configuras--genrule, estos destinos generan archivos de Rust actualizados durante el proceso de compilación y, además, incluyen las dependencias de bibliotecarust_protobufnecesarias.Se generan archivos
service_bundle.rspara cada paquete de servicios, que contienen elstructprincipal y las funciones para interactuar con los componentes de middleware.Se generan archivos
lib.rspara cada servicio de RPC que pertenece a un paquete y se colocan en una subcarpeta con el nombre del servicio de RPC. Estos archivos incluyen lo siguiente:Un rasgo
Interfaceimplementa la lógica del servidor.Una estructura
Clientrealiza llamadas a un servicio de RPC.Los archivos
diagnostics.rsse generan si hay undiagnostics_declarationen el archivo VSIDL, lo que proporciona las vinculaciones necesarias para el diagnóstico basado en UDS.Cuando se usa la marca
--apex, se generan las configuraciones de implementación y seguridad. Estos se colocan en los directoriosapex/yconfigs/, y se incluyen archivos de orquestación.textprotoy políticas de seguridad (permisos) necesarios para la comunicación de servicio a servicio.Se genera un boilerplate de servicio cuando se usa la marca
--services. Se coloca en un directorioservices/y contiene un esqueleto de aplicación de Rust, incluido un archivomain.rs, para iniciar rápidamente tu implementación.
Ejecuta VSIDLC
Para ejecutar VSIDLC, haz lo siguiente:
Si no configuraste tu entorno, ejecuta
source build/envsetup.sh.Ejecuta el siguiente comando para compilar VSIDLC:
m vsidlcAsegúrate de que el directorio del catálogo de VSIDL tenga los archivos de compilación, protobuf y VSIDL necesarios.
Ejecuta el comando
vsidlc:vsidlc -c path_to_catalog -o output_directory -pEn la que:
-c path_to_catalogidentifica la ruta de acceso al directorio principal del catálogo.-o output_directoryidentifica el directorio principal en el que se crea el directorio de salidagenerated_rs.- (Opcional)
--apexgenera artefactos de configuración de seguridad y orquestación. - (Opcional)
--servicesgenera un esqueleto de aplicación de Rust de inicio rápido. - (opcional)
-pborra los directorios existentes generados (comogenerated_rsy, si corresponde,apex,configsoservices) antes de generar archivos nuevos. - (opcional)
--genrulegeneraAndroid.bpgenrules en lugar de código de Rust. Las genrules generan el código de Rust necesario sobre la marcha cuando se ejecutampara evitar colocar artefactos generados bajo control de versión.
Se crea un directorio
generated_rsque contiene unAndroid.bpy los archivos de middleware generados. Este directorio se organiza en subdirectorios que corresponden a los nombres completamente calificados de los paquetes de servicios definidos.
Control de dependencias
De forma predeterminada, VSIDLC genera código solo para el catálogo principal, no para los catálogos de dependencias. Si tu catálogo usa tipos o unidades de servicio definidos en otros catálogos, especifica la ruta de acceso a cada catálogo de dependencia con la marca -d:
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
Debes proporcionar rutas de acceso para todo el gráfico de dependencias, incluidas las dependencias transitivas (dependencias de dependencias). Por ejemplo, supón que tienes el siguiente árbol de dependencias del catálogo:
Figura 2: Ejemplo de árbol de dependencias de VSIDLC.
Para generar el middleware de cada catálogo del árbol, debes ejecutar los siguientes comandos:
| Catálogo objetivo | Dependencias | Comando |
|---|---|---|
| Catálogo principal de SDV | N/A | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| Catálogo de diagnósticos | Catálogo principal de SDV | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| Catálogo de SOME/IP | Catálogo de diagnósticos, catálogo principal de SDV | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| Catálogo de OEM | Catálogo de diagnóstico, catálogo de SOMEIP y catálogo de SDV Core (de forma transitiva) | vsidlc -o ./generated -c ./path/to/oem_catalog -d ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
Da formato al resultado de Rust
De forma predeterminada, VSIDL usa rustfmt para dar formato al resultado de Rust. Para que el valor predeterminado funcione correctamente, configura la variable de entorno $ANDROID_BUILD_TOP o las variables de entorno RUSTFMT_PATH y RUSTFMT_TOML_PATH. Para cambiar el formato predeterminado que genera Rust, usa la opción --rust-formatter con pretty-please o none:
Para cambiar el formato de resultado al crate
prettyplease, usa el valorpretty-please:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-pleasePara cambiar el formato de salida a ninguno, usa el valor
none:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
¿Qué sigue?
Después de generar el middleware, consulta Implementa tu lógica empresarial.