Une fois que vous avez créé le middleware et écrit votre code personnalisé, vous pouvez déployer vos packs 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 les suivants :- Fichier manifeste APEX (
apex_manifest.json) - Fichier manifeste des métadonnées SDV (
sdv_service_bundles_manifest.textproto) - Configuration de l'éditeur de liens (
linker.config.json) - Contextes de fichiers SELinux (
file_contexts) - Clés publiques et privées (
.avbpubkeyet.pem) - Déclarations d'autorisations et configurations d'orchestration
- 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 ces champs de métadonnées d'exécution essentiels :- Nom du service conformément aux conventions d'attribution de noms
- Représentation entière et sous forme de chaîne de la version du pack de services
- Chemin d'accès à la bibliothèque créée précédemment
La préparation des métadonnées essentielles du pack de services est obligatoire pour l'empaquetage et le déploiement du pack 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 nouveau fichier de configuration de l'éditeur de liens,
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 de communication SDV
{ "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.avbpubkeyet une clé privée,apex_name.apex_key.pem.Créez un nouveau 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écompilées 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
PRODUCT_PACKAGESdans le fichier 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 pack 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 packs de services
Dans certains cas, vous pouvez utiliser la liaison statique des dépendances du pack de services pour réduire la taille de l'APEX et l'espace mémoire utilisé du pack de services, et pour améliorer le temps de démarrage des packs de services. Ces scénarios incluent les APEX avec :
- Packs de services uniques
- Plusieurs packs de services qui ne partagent pas de nombreuses dépendances communes
Pour activer la liaison statique, ajoutez les propriétés suivantes à la définition de la bibliothèque du pack 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"],
}
Dans chaque situation, nous vous recommandons de vérifier que la liaison statique aux dépendances entraîne des améliorations en termes d'espace mémoire utilisé et de temps de démarrage des bundles de services.
Débogage (dumpsys)
Le gestionnaire de cycle de vie implémente l'interface dumpsys. Cette interface affiche la liste des packs de services à l'utilisateur qui sont à l'état created ou started. L'interface affiche également le FQIN ou l'UID du processus du pack de services.
Pour afficher l'état actuel et les identifiants de vos packs de services, exécutez :
# 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.