Po utworzeniu oprogramowania pośredniczącego i napisaniu kodu niestandardowego możesz wdrożyć pakiety usług jako pliki APEX.
Utwórz pliki konfiguracji SDV:
Rdza
Wygeneruj pliki konfiguracji SDV, uruchamiając:
vsidlc -c /path/to/catalog -o /path/to/output --apexUruchomienie polecenia
vsidlcz flagą--apexautomatycznie generuje wszystkie niezbędne pliki konfiguracji, w tym:- Plik manifestu APEX (
apex_manifest.json) - Plik manifestu metadanych SDV (
sdv_service_bundles_manifest.textproto) - Konfiguracja tagu łączącego (
linker.config.json) - Konteksty plików SELinux (
file_contexts) - Klucze publiczne i prywatne (
.avbpubkeyi.pem) - Deklaracje uprawnień i konfiguracje administracji
- Plik
Android.bpdefiniujący wszystkie niezbędne moduły Soong.
Wygenerowane konfiguracje znajdziesz tutaj:
/path/to/output/apex/oraz
/path/to/output/configs/- Plik manifestu APEX (
C++
Utwórz plik manifestu metadanych SDV
service_bundle.manifest.textprotoz tymi podstawowymi polami metadanych wykonywania:- Nazwa usługi zgodna z konwencjami nazewnictwa.
- Liczba całkowita i ciąg znaków reprezentujące wersję pakietu usług
- Ścieżka do utworzonej wcześniej biblioteki
Przygotowanie metadanych pakietu usług podstawowych jest obowiązkowe w przypadku pakowania i wdrażania pakietu usług.
# 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" }Utwórz nowy plik konfiguracji tagu łączącego
linker.config.json:{ "visible": true }Utwórz nowy plik
apex_manifest.jsonz tymi polami:- Unikalna nazwa pakietu SDV
- Wersja APEX
- Zależność od bibliotek 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" ] }Utwórz klucz publiczny
apex_name.apex_key.avbpubkeyi klucz prywatnyapex_name.apex_key.pem.Utwórz nowy kontekst pliku SELinux
apex_file_contexts.(/.*)? u:object_r:system_file:s0Więcej informacji znajdziesz w artykule Kontekst i kategorie zabezpieczeń.
Utwórz gotowe cele w nowym lub istniejącym pliku
Android.bp:// 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", }Utwórz nowy moduł APEX w nowym lub istniejącym pliku
Android.bp. Użyj nazwy pakietu SDV jako nazwy modułu 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, }
Aby uwzględnić nowy plik makefile w obrazie SDV, dodaj nowy moduł APEX do
PRODUCT_PACKAGESw pliku makefile usługi. Na przykład:sdv_samples_core_services.mk.Jeśli używasz Cuttlefish, uruchom to polecenie, aby uruchomić urządzenie:
sdv-cf create --instance_name=instance1Uruchom pakiet usług po uruchomieniu systemu:
# 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
Szybkie aktualizacje pakietu usług podczas programowania
Jeśli używasz Android Studio for Platform (ASfP), możesz wdrażać zmiany w zainstalowanym już pakiecie usług APEX bezpośrednio z IDE bez konieczności ponownego tworzenia obrazu systemu. Więcej informacji znajdziesz w artykule Wdrażanie pakietów usług SDV.
Zarządzanie zależnościami pakietu usług
W niektórych przypadkach możesz użyć statycznego łączenia zależności pakietu usług, aby zmniejszyć rozmiar APEX i wykorzystanie pamięci przez pakiet usług oraz skrócić czas uruchamiania pakietów usług. Te scenariusze obejmują APEX-y:
- Pakiety pojedynczych usług
- kilka pakietów usług, które nie mają wielu wspólnych zależności;
Aby włączyć linkowanie statyczne, dodaj do definicji biblioteki pakietu usług te właściwości:
// 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"],
}
W każdej sytuacji zalecamy sprawdzenie, czy statyczne linkowanie do zależności prowadzi do zmniejszenia wykorzystania pamięci i skrócenia czasu uruchamiania pakietów usług.
Debugowanie (dumpsys)
Menedżer cyklu życia implementuje interfejs dumpsys. Ten interfejs wyświetla użytkownikowi listę pakietów usług, które są w stanie created lub started. Interfejs wyświetla też FQIN lub UID procesu pakietu usług.
Aby wyświetlić bieżący stan i identyfikatory pakietów usług, wykonaj polecenie:
# Grant root access.
adb root
# Execute dumpsys to see service bundles state
adb shell dumpsys google.sdv.lifecycle.ILifecycleManager/default
Co dalej?
Aby automatycznie wykonywać polecenie vsidlc i umożliwić wtyczce IDE pracę z zależnościami, zapoznaj się z artykułem Automatyczne aktualizacje katalogu i integracja z LSP.