Dienstbündel erstellen und bereitstellen

Nachdem Sie die Middleware erstellt und den benutzerdefinierten Code geschrieben haben, können Sie Ihre Dienstbündel als APEX-Dateien bereitstellen.

  1. SDV-Konfigurationsdateien erstellen:

    Rost

    1. Generieren Sie SDV-Konfigurationsdateien mit folgendem Befehl:

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

      Wenn Sie vsidlc mit dem Flag --apex ausführen, werden automatisch alle erforderlichen Konfigurationsdateien generiert, darunter:

      • APEX-Manifest (apex_manifest.json)
      • SDV-Metadatenmanifest (sdv_service_bundles_manifest.textproto)
      • Linker-Konfiguration (linker.config.json)
      • SELinux-Dateikontexte (file_contexts)
      • Öffentliche und private Schlüssel (.avbpubkey und .pem)
      • Erklärungen zu Berechtigungen und Orchestrierungskonfigurationen
      • Eine Android.bp-Datei, in der alle erforderlichen Soong-Module definiert sind.

      Die generierten Konfigurationen finden Sie unter:

      /path/to/output/apex/
      

      und

      /path/to/output/configs/
      

    C++

    1. Erstellen Sie eine Manifestdatei mit SDV-Metadaten, service_bundle.manifest.textproto mit diesen wichtigen Ausführungsmetadatenfeldern:

      • Name des Dienstes gemäß den Namenskonventionen
      • Ganzzahl- und Stringdarstellung der Servicepaketversion
      • Pfad zur zuvor erstellten Bibliothek

      Die Vorbereitung der Metadaten für das Bundle mit wichtigen Diensten ist für die Paketierung und Bereitstellung von Service-Bundles obligatorisch.

      # 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. Erstellen Sie eine neue Linker-Konfigurationsdatei, linker.config.json:

      { "visible": true }
      
    3. Erstellen Sie eine neue apex_manifest.json-Datei mit diesen Feldern:

      • Eindeutiger SDV-Paketname
      • Version von APEX
      • Abhängigkeit von SDV Comms-Bibliotheken
      zu verwenden.
      {
        "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. Erstellen Sie einen öffentlichen Schlüssel, apex_name.apex_key.avbpubkey und einen privaten Schlüssel, apex_name.apex_key.pem.

    5. Erstellen Sie einen neuen SELinux-Dateikontext apex_file_contexts.

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

      Weitere Informationen finden Sie unter Sicherheitskontext und ‑kategorien.

    6. Erstellen Sie vorgefertigte Ziele in einer neuen oder vorhandenen Android.bp-Datei:

      // 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. Erstellen Sie ein neues APEX-Modul in einer neuen oder vorhandenen Android.bp-Datei. Verwenden Sie den SDV-Paketnamen als APEX-Modulnamen.

      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. Wenn Sie das neue Makefile in ein SDV-Image einfügen möchten, fügen Sie das neue APEX-Modul der PRODUCT_PACKAGES im Produkt-Makefile hinzu. Ein Beispiel finden Sie unter sdv_samples_core_services.mk.

  3. Wenn Sie Cuttlefish verwenden, führen Sie den folgenden Befehl aus, um ein Gerät zu starten:

    sdv-cf create --instance_name=instance1
    
  4. Dienstpaket beim Systemstart ausführen:

    # 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
    

Verwaltung von Abhängigkeiten von Dienst-Bundles

In einigen Szenarien können Sie die statische Verknüpfung der Dienstbundle-Abhängigkeiten verwenden, um die APEX-Größe und den Speicherbedarf des Dienstbundles zu verringern und die Startzeit der Dienstbundles zu verbessern. Zu diesen Szenarien gehören APEXes mit:

  • Pakete mit einem einzelnen Dienst
  • Mehrere Dienstbündel, die nicht viele gemeinsame Abhängigkeiten haben

Fügen Sie der Bibliotheksdefinition des Dienstbündels die folgenden Eigenschaften hinzu, um die statische Verknüpfung zu aktivieren:

// 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"],
}

Wir empfehlen, für jede Situation zu prüfen, ob die statische Verknüpfung mit Abhängigkeiten zu Verbesserungen beim Speicherbedarf und den Startzeiten von Service-Bundles führt.

Debuggen (dumpsys)

Der Lifecycle-Manager implementiert die dumpsys-Schnittstelle. Auf dieser Benutzeroberfläche wird dem Nutzer die Liste der Service-Bundles angezeigt, die sich entweder im Status created oder started befinden. Auf der Benutzeroberfläche wird auch der FQIN oder die UID des Servicebündelprozesses angezeigt.

So rufen Sie den aktuellen Status und die Kennungen Ihrer Dienstpakete auf:

# Grant root access.
adb root

# Execute dumpsys to see service bundles state
adb shell dumpsys google.sdv.lifecycle.ILifecycleManager/default

Nächste Schritte

Informationen zum automatischen Ausführen von vsidlc und zum Aktivieren des IDE-Plug-ins für die Arbeit mit Abhängigkeiten finden Sie unter Automatische Katalogaktualisierungen und LSP-Integration.