Une fois que vous avez créé le middleware et écrit votre code personnalisé, vous pouvez déployer vos bundles de services en tant que fichiers APEX.
Créez des fichiers de configuration SDV :
Rust
Générez des fichiers de configuration SDV en exécutant :
vsidlc -c /path/to/catalog -o /path/to/output --apexL'exécution de
vsidlcavec l'indicateur--apexgénère automatiquement tous les fichiers de configuration nécessaires, y compris :- Fichier manifeste APEX (
apex_manifest.json) - Manifeste des métadonnées SDV (
sdv_service_bundles_manifest.textproto) - Configuration du linker (
linker.config.json) - Contextes de fichier SELinux (
file_contexts) - Clés publiques et privées (
.avbpubkeyet.pem) - Déclarations d'autorisations et configurations d'orchestration
- Un fichier
Android.bpdéfinissant tous les modules Soong nécessaires.
Vous trouverez les configurations générées sous :
/path/to/output/apex/et
/path/to/output/configs/- Fichier manifeste APEX (
C++
Créez un fichier manifeste de métadonnées SDV,
service_bundle.manifest.textprotoavec les champs de métadonnées d'exécution essentiels suivants :- Nom du service selon les conventions d'attribution de noms
- Représentation sous forme d'entier et de chaîne de caractères de la version du bundle de services
- Chemin d'accès à la bibliothèque créée précédemment
La préparation des métadonnées du bundle de services essentiels est obligatoire pour l'empaquetage et le déploiement du bundle de services.
# 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" }Créez un fichier de configuration du linker,
linker.config.json:{ "visible": true }Créez un fichier
apex_manifest.jsonavec les champs suivants :- Nom de package SDV unique
- Version de l'APEX
- Dépendance aux bibliothèques 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" ] }Créez une clé publique,
apex_name.apex_key.avbpubkey, et une clé privée,apex_name.apex_key.pem.Créez un contexte de fichier SELinux :
apex_file_contexts.(/.*)? u:object_r:system_file:s0Pour en savoir plus, consultez Contexte et catégories de sécurité.
Créez des cibles prédéfinies dans un fichier
Android.bpnouveau ou existant :// 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", }Créez un module APEX dans un fichier
Android.bpnouveau ou existant. Utilisez le nom du package SDV comme nom du module 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, }
Pour inclure le nouveau fichier makefile dans une image SDV, ajoutez le nouveau module APEX au fichier
PRODUCT_PACKAGESdans le makefile du produit. Par exemple, consultezsdv_samples_core_services.mk.Si vous utilisez Cuttlefish, exécutez la commande suivante pour démarrer un appareil :
sdv-cf create --instance_name=instance1Exécutez le bundle de services lorsque le système est démarré :
# 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
Gestion des dépendances des offres groupées de services
Dans certains cas, vous pouvez utiliser l'association statique des dépendances du bundle de services pour réduire la taille de l'APEX et l'espace mémoire utilisé du bundle de services, et pour améliorer le temps de démarrage des bundles de services. Ces scénarios incluent les APEX avec :
- Packs de services uniques
- Plusieurs bundles de services qui ne partagent pas beaucoup de dépendances communes
Pour activer l'association statique, ajoutez les propriétés suivantes à la définition de la bibliothèque du bundle de services :
// 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"],
}
Pour chaque situation, nous vous recommandons de vérifier que l'association statique aux dépendances permet d'améliorer l'espace mémoire utilisé et les temps de démarrage des bundles de services.
Déboguer (dumpsys)
Le gestionnaire de cycle de vie implémente l'interface dumpsys. Cette interface affiche la liste des groupes de services à l'utilisateur qui sont à l'état created ou started. L'interface affiche également le FQIN ou l'UID du processus du bundle de services.
Pour afficher l'état actuel et les identifiants de vos groupes de services, exécutez la commande suivante :
# Grant root access.
adb root
# Execute dumpsys to see service bundles state
adb shell dumpsys google.sdv.lifecycle.ILifecycleManager/default
Étape suivante
Pour exécuter automatiquement vsidlc et permettre au plug-in IDE de fonctionner avec les dépendances, consultez Mises à jour automatiques du catalogue et intégration LSP.