Créer et déployer des bundles de services

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.

  1. Créez des fichiers de configuration SDV :

    Rust

    1. Générez des fichiers de configuration SDV en exécutant :

      vsidlc -c /path/to/catalog -o /path/to/output --apex
      

      L'exécution de vsidlc avec l'indicateur --apex gé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 (.avbpubkey et .pem)
      • Déclarations d'autorisations et configurations d'orchestration
      • Fichier Android.bp dé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/
      

    C++

    1. Créez un fichier manifeste de métadonnées SDV, service_bundle.manifest.textproto avec 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"
      }
      
    2. Créez un nouveau fichier de configuration de l'éditeur de liens, linker.config.json :

      { "visible": true }
      
    3. Créez un fichier apex_manifest.json avec 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"
        ]
      }
      
    4. Créez une clé publique, apex_name.apex_key.avbpubkey et une clé privée, apex_name.apex_key.pem.

    5. Créez un nouveau contexte de fichier SELinux apex_file_contexts.

      (/.*)?    u:object_r:system_file:s0
      

      Pour en savoir plus, consultez Contexte et catégories de sécurité.

    6. Créez des cibles précompilées dans un fichier Android.bp nouveau 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",
      }
      
    7. Créez un module APEX dans un fichier Android.bp nouveau 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,
      }
      
  2. Pour inclure le nouveau fichier makefile dans une image SDV, ajoutez le nouveau module APEX au PRODUCT_PACKAGES dans le fichier makefile du produit. Par exemple, consultez sdv_samples_core_services.mk.

  3. Si vous utilisez Cuttlefish, exécutez la commande suivante pour démarrer un appareil :

    sdv-cf create --instance_name=instance1
    
  4. Exé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.