Основные примеры кода

Примеры кода SDV Core services в /system/software_defined_vehicle/samples помогут вам начать создавать свои сервисы. Каждый пример содержит файл README с описанием сценария использования.

Обзор каталога примеров

В таблице ниже перечислены каталоги с примерами в system/software_defined_vehicle/samples и соответствующие им руководства.

Пример каталога Описание Руководство по документации
system/software_defined_vehicle/samples/quickstart Пример пакета сервиса Rust, демонстрирующий публикацию VSIDL, подписку и RPC между пакетами Manager и Monitor. Быстрый старт: создание и запуск пакетов сервисов SDV
system/software_defined_vehicle/samples/vsidl Ознакомьтесь с каталогом VSIDL, определениями protobuf и шаблонами реализации пакета сервисов. Реализация бизнес-логики
system/software_defined_vehicle/samples/concal Пример клиента для чтения и обновления параметров конфигурации и калибровки транспортного средства. Настройка и калибровка
system/software_defined_vehicle/samples/health Пакет сервисов с отслеживанием состояния и примеры мониторинга качества обслуживания (QoS). Отслеживание здоровья
system/software_defined_vehicle/samples/oem_partition_update_client Пример сервиса, использующего крейт sdv_oem_updater для запуска и отката обновлений раздела /oem_ab. Обновления разделов AB для OEM-производителей
system/software_defined_vehicle/samples/sdv_gateway Примеры нативных приложений и приложений Java для IVI (NativeSdvGatewayTestApp и SdvCarMonitorTestApp), которые взаимодействуют с основными сервисами SDV через шлюз SDV. Как использовать шлюз SDV в IVI
system/software_defined_vehicle/samples/telemetry Источник данных телеметрии на устройстве и примеры симулятора. Источники данных

Как использовать Logging API

Дополнительную информацию об инструкциях можно найти в следующих статьях:

Пример базового журнала

logging.cpp представляет запись в буферы main, system и radio. Краткое описание доступных буферов журналов приведено в разделе Как посмотреть альтернативные буферы журналов.

  • Чтобы запустить пример без условных журналов, таких как ALOGI_IF:

    logging_sdv_sample
    
  • Чтобы запустить пример и распечатать условные журналы, например ALOGI_IF:

    LOGIF=1 logging_sdv_sample
    

Пример структурированного ведения журнала

Пример файла: structured_logging.cpp

  • Чтобы запустить пример, который записывает журналы в буфер журналов events, выполните следующие действия:

    structured_logging_sdv_sample
    

Буферы журналов event, security и stats содержат структурированные данные, а не произвольный текст.

Структурированные данные регистрируются с помощью API списка событий, который всегда регистрируется с приоритетом INFO и числовым идентификатором тега.

Файл .logtags можно определить с помощью атрибута logtags в Android.bp.. Если он указан, logcat использует его, чтобы получить название тега из его числового идентификатора. Затем название тега можно использовать для фильтрации структурированных журналов. Подробные сведения и описание формата файла приведены в комментарии в файле logcat event.logtags.

В процессе сборки все файлы logtags объединяются и помещаются в файл /system/etc/event-log-tags в образе системы Android.

Как составить пример фильтрации журнала времени

Пример файла: compile_time_log_filtering.cpp

Этот пример содержит макросы, которые можно настроить, чтобы удалить некоторые журналы из исполняемого файла. Подробную информацию можно найти в исходном коде.

Пример фильтрации журналов: log_filtering.cpp

  • Чтобы запустить пример, установите минимальный приоритет журнала на WARN:

    LOGLEVEL=WARN log_filtering_sdv_sample
    

На фильтрацию журналов влияют свойства системы. Для всех журналов с :

  • log.tag.<tag>
  • persist.log.tag.<tag>

Для всех журналов в системе:

  • log.tag
  • persist.log.tag

Чтобы выбрать уровень ведения журнала, который проверяется по порядку, каждому значению можно присвоить V, D, I, W или E.

Действующий уровень ведения журнала – это уровень, заданный в первом системном свойстве, у которого есть значение. Он может быть ниже или выше уровня, заданного приложением с помощью вызова __android_log_set_minimum_priority. Если ни одно из свойств не задано, применяется уровень, настроенный с помощью __android_log_set_minimum_priority.

Подробнее о системе ведения журналов…

  • Запустите пример, установив тег журнала по умолчанию на example_tag:

    LOGTAG=example_tag log_filtering_sdv_sample
    

В примере также содержится закомментированное определение макроса LOG_TAG, которое можно использовать, чтобы задать тег для всех сообщений в журнале. Тег, заданный таким образом, переопределяет тег, заданный во время выполнения с помощью __android_log_set_default_tag.

Если макрос LOG_TAG не определен и приложение не вызывает __android_log_set_default_tag, тегом по умолчанию будет результат getprogname(). Например, имя исполняемого файла.