После создания промежуточного ПО и написания собственного кода вы можете развернуть пакеты сервисов в виде файлов APEX.
Создайте конфигурационные файлы SDV:
Ржавчина
Сгенерируйте конфигурационные файлы SDV, выполнив следующую команду:
vsidlc -c /path/to/catalog -o /path/to/output --apexЗапуск
vsidlcс флагом--apexавтоматически генерирует все необходимые конфигурационные файлы, включая:- Манифест APEX (
apex_manifest.json) - Манифест метаданных SDV (
sdv_service_bundles_manifest.textproto) - Конфигурация компоновщика (
linker.config.json) - Контексты файлов SELinux (
file_contexts) - Открытые и закрытые ключи (
.avbpubkeyи.pem) - Объявления о правах доступа и конфигурации оркестровки
- Файл
Android.bp, определяющий все необходимые модули Soong.
Сгенерированные конфигурации можно найти по следующему адресу:
/path/to/output/apex/и,
/path/to/output/configs/- Манифест APEX (
C++
Создайте файл манифеста метаданных SDV,
service_bundle.manifest.textproto, содержащий следующие важные поля метаданных выполнения:- Название сервиса в соответствии с принятыми правилами именования.
- Целочисленное и строковое представление версии пакета сервиса.
- Путь к созданной ранее библиотеке
Подготовка необходимых метаданных для пакетов услуг является обязательной для их упаковки и развертывания.
# 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" }Создайте новый файл конфигурации компоновщика ,
linker.config.json:{ "visible": true }Создайте новый файл
apex_manifest.jsonсо следующими полями:- Уникальное имя пакета SDV
- Версия APEX
- Зависимость от библиотек связи 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" ] }Создайте открытый ключ
apex_name.apex_key .avbpubkeyи закрытый ключapex_name.apex_key .pem.Создайте новый контекст файла SELinux
apex_file_contexts.(/.*)? u:object_r:system_file:s0Для получения более подробной информации см. раздел «Контекст и категории безопасности» .
Создавайте предварительно собранные цели в новом или существующем файле
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", }Создайте новый модуль APEX в новом или существующем файле
Android.bp. Используйте имя пакета SDV в качестве имени модуля 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, }
Чтобы включить новый makefile в образ SDV, добавьте новый модуль APEX в раздел
PRODUCT_PACKAGESв makefile продукта . Например, см.sdv_samples_core_services.mk.Если вы используете Cuttlefish, выполните следующую команду для запуска устройства:
sdv-cf create --instance_name=instance1Запустите пакет служб при загрузке системы:
# 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
управление зависимостями пакетов сервисов
В некоторых сценариях статическая компоновка зависимостей пакетов служб может помочь уменьшить размер APEX-файлов и объем памяти, занимаемый пакетами служб, а также сократить время запуска пакетов служб. К таким сценариям относятся APEX-файлы со следующими характеристиками:
- Пакеты отдельных услуг
- Несколько пакетов сервисов, которые не имеют много общих зависимостей.
Для включения статической компоновки добавьте следующие свойства в определение библиотеки пакета служб:
// 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"],
}
В каждой конкретной ситуации мы рекомендуем убедиться, что статическая компоновка с зависимостями приводит к улучшению показателей использования памяти и времени запуска пакетов сервисов.
Отладка (dumpsys)
Менеджер жизненного цикла реализует интерфейс dumpsys . Этот интерфейс отображает пользователю список пакетов служб, находящихся в состоянии created или started . Интерфейс также отображает полный квалифицированный идентификатор (FQIN) или уникальный идентификатор (UID) процесса пакета служб.
Чтобы просмотреть текущее состояние и идентификаторы ваших пакетов служб, выполните следующую команду:
# Grant root access.
adb root
# Execute dumpsys to see service bundles state
adb shell dumpsys google.sdv.lifecycle.ILifecycleManager/default
Что дальше?
Для автоматического запуска vsidlc и обеспечения работы плагина IDE с зависимостями см. раздел «Автоматическое обновление каталога и интеграция LSP» .