Después de crear el middleware y escribir tu código personalizado, puedes implementar tus paquetes de servicios como archivos APEX.
Crea archivos de configuración de SDV:
Rust
Para generar archivos de configuración de SDV, ejecuta lo siguiente:
vsidlc -c /path/to/catalog -o /path/to/output --apexCuando se ejecuta
vsidlccon la marca--apex, se generan automáticamente todos los archivos de configuración necesarios, incluidos los siguientes:- Manifiesto de APEX (
apex_manifest.json) - Manifiesto de metadatos de SDV (
sdv_service_bundles_manifest.textproto) - Configuración del vinculador (
linker.config.json) - Contextos de archivos de SELinux (
file_contexts) - Claves públicas y privadas (
.avbpubkeyy.pem) - Declaraciones de permisos y configuraciones de orquestación
- Un archivo
Android.bpque define todos los módulos de Soong necesarios
Puedes encontrar las configuraciones generadas en:
/path/to/output/apex/y
/path/to/output/configs/- Manifiesto de APEX (
C++
Crea un archivo de manifiesto de metadatos de SDV,
service_bundle.manifest.textprotocon estos campos de metadatos de ejecución esenciales:- Nombre del servicio según las convenciones de nombres
- Representación de número entero y cadena de la versión del paquete de servicios
- Ruta de acceso a la biblioteca creada anteriormente
Es obligatorio preparar los metadatos esenciales del paquete de servicios para el empaquetado y la implementación del paquete de servicios.
# proto-file: //system/software_defined_vehicle/core_services/service_bundles_registry/proto/sdv_service_bundles_manifest.proto # proto-message: SdvServiceBundleManifestEntry # SDV service bundle metadata definition with mandatory fields. sdv_service_bundle_metadata { # Service bundle name. name: "ServiceBundleName" # Service bundle integer version. version_number: 42 # Service bundle version as a string. version_name: "42.alpha" # Service bundle library path. native_library_path: "lib64/libservice_bundle.so" }Crea un nuevo archivo de configuración del vinculador,
linker.config.json:{ "visible": true }Crea un archivo
apex_manifest.jsonnuevo con estos campos:- Nombre de paquete de SDV único
- Versión de APEX
- Dependencia de las bibliotecas de SDV Comms
{ "name": "com.sdv.oem.apex_and_module_name", "version": 1, "requireNativeLibs": [ "libsdv_comms_ctx_ffi.so", "libsdv_comms_dt_ffi.so", "libsdv_comms_id_ffi.so", "libsdv_comms_sd_ffi.so" ] }Crea una clave pública,
apex_name.apex_key.avbpubkeyy una clave privada,apex_name.apex_key.pem.Crea un nuevo contexto de archivo de SELinux
apex_file_contexts.(/.*)? u:object_r:system_file:s0Para obtener más información, consulta Contexto y categorías de seguridad.
Crea objetivos precompilados en un archivo
Android.bpnuevo o existente:// SDV manifest file prebuilt. prebuilt_etc { name: "com.sdv.oem.apex_and_module_name.service_bundles_manifest", // The source filename of the manifest file. src: "service_bundle.manifest.textproto", // The name of the installed file needs be `sdv_service_bundles_manifest.textproto`. filename: "sdv_service_bundles_manifest.textproto", // Disable direct installation of the prebuilt to one of the partitions. // The manifest is used only inside of an apex. installable: false, } // The linker config to allow libraries for the apex to be linkable. linker_config { name: "com.sdv.oem.apex_and_module_name. linker_config", src: "linker.config.json", // Disable direct installation of the prebuilt to one of the partitions. // The linker configuration is used only inside of an apex. installable: false, } // Key to be used for signing the apex. apex_key { name: "apex_name.apex_key", public_key: "apex_name.apex_key.avbpubkey", private_key: "apex_name.apex_key.pem", }Crea un nuevo módulo APEX en un archivo
Android.bpnuevo o existente. Usa el nombre del paquete de SDV como nombre del módulo APEX.apex { name: "com.sdv.oem.apex_and_module_name", // The service bundle(s) to be included in the apex. native_shared_libs: [ "libservice_bundle", ], prebuilts: [ // SDV service bundles manifest file. "com.sdv.oem.apex_and_module_name.service_bundles_manifest", // Linker configuration to enable loading library from apex. "com.sdv.oem.apex_and_module_name.linker_config", ], // Json manifest file describes metadata of the APEX package. // The 'name' field from the JSON is used as a mounting point. manifest: "apex_manifest.json", // Setting the security contexts to files in this APEX bundle. file_contexts: "apex_file_contexts", // Name of the apex_key module that provides the private key to sign the APEX bundle. key: "apex_name.apex_key", // Mark apex as non-updatable for now, this might be revisited going forward. updatable: false, // Service bundle package is installed into /product partition. product_specific: true, }
Para incluir el nuevo archivo makefile en una imagen de SDV, agrega el nuevo módulo APEX a the
PRODUCT_PACKAGESen el archivo makefile del producto. Por ejemplo, consultasdv_samples_core_services.mk.Si usas Cuttlefish, ejecuta el siguiente comando para iniciar un dispositivo:
sdv-cf create --instance_name=instance1Ejecuta el paquete de servicios cuando se inicie el sistema:
# Grant root access. adb root # Launch the new service bundle. adb shell sdv_service_bundle start \ local-vm:com.sdv.oem.apex_and_module_name.ServiceBundleName/instance-1
Administración de dependencias del paquete de servicios
En algunas situaciones, puedes usar la vinculación estática de las dependencias del paquete de servicios para reducir el tamaño de APEX y el espacio en memoria del paquete de servicios, y para mejorar el tiempo de inicio de los paquetes de servicios. Estos casos incluyen APEXes con lo siguiente:
- Paquetes de servicios únicos
- Varios paquetes de servicios que no comparten muchas dependencias comunes
Para habilitar la vinculación estática, agrega las siguientes propiedades a la definición de la biblioteca del paquete de servicios:
// Service bundle library.
rust_ffi_shared {
// See rust_ffi_shared basic template.
...
// uses static linking for the dependencies
prefer_rlib: true,
// needed to correctly resolve commstack deps
ld_flags: ["-Wl,--no-as-needed"],
}
Para cada situación, te recomendamos que confirmes que la vinculación estática a las dependencias genera mejoras en la huella de memoria y los tiempos de inicio de los paquetes de servicios.
Depuración (dumpsys)
El administrador del ciclo de vida implementa la interfaz dumpsys. Esta interfaz muestra al usuario la lista de paquetes de servicios que se encuentran en el estado created o started. La interfaz también muestra el FQIN o el UID del proceso del paquete de servicios.
Para ver el estado actual y los identificadores de tus paquetes de servicios, ejecuta lo siguiente:
# Grant root access.
adb root
# Execute dumpsys to see service bundles state
adb shell dumpsys google.sdv.lifecycle.ILifecycleManager/default
¿Qué sigue?
Para ejecutar vsidlc automáticamente y habilitar el complemento del IDE para que funcione con
dependencias, consulta Actualizaciones automáticas del catálogo y la integración de LSP.