Créer et déployer des bundles de services

Après avoir créé le middleware et écrit votre code personnalisé, vous pouvez déployer vos bundles de services en tant que fichiers APEX.

  1. Créez des fichiers de configuration SDV :

    Rust

    1. Générez les fichiers de configuration SDV en exécutant la commande suivante :

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

      L'exécution de vsidlc avec l'option --apex génère automatiquement tous les fichiers de configuration nécessaires, y compris :

      • Fichier manifeste APEX (apex_manifest.json)
      • Manifeste de 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
      • Un 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 les champs de métadonnées d'exécution essentiels suivants :

      • Nom du service selon les conventions d'attribution de noms
      • Représentation par nombre entier et chaîne 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 essentielles du bundle de services 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"
      }
      
    2. Créez un 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 unique du package SDV
      • 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"
        ]
      }
      
    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 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édéfinies 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 makefile dans une image SDV, ajoutez le nouveau module APEX à PRODUCT_PACKAGES dans le 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 bundle de services au démarrage du système :

    # 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
    

Mises à jour rapides des bundles de services pendant le développement

Si vous utilisez Android Studio for Platform (ASfP), vous pouvez déployer les modifications apportées à un APEX de bundle de services déjà installé directement depuis l'IDE sans recompiler l'image système. Pour en savoir plus, consultez Déployer des bundles de services SDV.

Gestion des dépendances des bundles 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é par le 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 de l'ensemble 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 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ébogage (dumpsys)

Le gestionnaire de cycle de vie implémente l'interface dumpsys. Cette interface affiche la liste des bundles de services à l'utilisateur qui sont à l'état created ou started. L'interface affiche également le FQIN ou l'UID du processus de bundle de services.

Pour afficher l'état actuel et les identifiants de vos bundles 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 de l'IDE de fonctionner avec les dépendances, consultez Mises à jour automatiques du catalogue et intégration LSP.