Nachdem Sie die Middleware erstellt und Ihren benutzerdefinierten Code geschrieben haben, können Sie Ihre Dienstpakete als APEX-Dateien bereitstellen.
SDV-Konfigurationsdateien erstellen:
Rost
Führen Sie den folgenden Befehl aus, um SDV-Konfigurationsdateien zu generieren:
vsidlc -c /path/to/catalog -o /path/to/output --apexWenn Sie
vsidlcmit dem Flag--apexausfü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 (
.avbpubkeyund.pem) - Berechtigungserklärungen 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/- APEX-Manifest (
C++
Erstellen Sie eine SDV-Metadatenmanifestdatei,
service_bundle.manifest.textprotomit diesen wichtigen Ausführungsmetadatenfeldern:- Name des Dienstes gemäß den Namenskonventionen
- Ganzzahl- und Stringdarstellung der Dienstpaketversion
- Pfad zur zuvor erstellten Bibliothek
Die Vorbereitung wichtiger Metadaten für Dienstpakete ist für die Paketierung und Bereitstellung von Dienstpaketen erforderlich.
# 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" }Erstellen Sie eine neue Linker-Konfiguration-Datei,
linker.config.json:{ "visible": true }Erstellen Sie eine neue
apex_manifest.json-Datei mit den folgenden Feldern:- Eindeutiger SDV-Paketname gemäß den SDV-Namenskonventionen
- Version des APEX
- Abhängigkeit von SDV Comms-Bibliotheken
{ "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" ] }Erstellen Sie einen öffentlichen Schlüssel,
apex_name.apex_key.avbpubkeyund einen privaten Schlüssel,apex_name.apex_key.pem.Erstellen Sie einen neuen SELinux-Dateikontext
apex_file_contexts.(/.*)? u:object_r:system_file:s0Weitere Informationen finden Sie unter Sicherheitskontext und ‑kategorien.
Erstellen Sie vorkompilierte 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", }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, }
Wenn Sie die neue Make-Datei in ein SDV-Image einfügen möchten, fügen Sie das neue APEX-Modul in der Produkt-Make-Datei zu dem
PRODUCT_PACKAGEShinzu. Ein Beispiel finden Sie untersdv_samples_core_services.mk.Wenn Sie Cuttlefish verwenden, führen Sie den folgenden Befehl aus, um ein Gerät zu starten:
sdv-cf create --instance_name=instance1Führen Sie das Dienstpaket aus, wenn das System gestartet wird:
# 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
Abhängigkeitsverwaltung für Dienstpakete
In einigen Fällen können Sie die statische Verknüpfung der Dienstpaketabhängigkeiten verwenden, um die APEX-Größe und den Speicherbedarf des Dienstpakets zu reduzieren und die Startzeit der Dienstpakete zu verbessern. Diese Szenarien umfassen APEX-Dateien mit:
- Einzelnen Dienstpaketen
- Mehreren Dienstpaketen, die nicht viele gemeinsame Abhängigkeiten haben
Fügen Sie der Bibliotheksdefinition des Dienstpakets 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"],
}
In jeder Situation empfehlen wir, zu prüfen, ob die statische Verknüpfung mit Abhängigkeiten zu Verbesserungen beim Speicherbedarf und bei den Startzeiten von Dienstpaketen führt.
Debuggen (dumpsys)
Der Lebenszyklusmanager implementiert die dumpsys-Schnittstelle. Diese Schnittstelle zeigt dem Nutzer die Liste der Dienstpakete an, die sich im Status created oder started befinden. Die Schnittstelle zeigt auch den FQIN oder die UID des Dienstpaketprozesses an.
Führen Sie den folgenden Befehl aus, um den aktuellen Status und die IDs Ihrer Dienstpakete aufzurufen:
# 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.