Расширьте описания свойств VHAL в эмуляторе.

Android Automotive OS (AAOS) содержит общие свойства VHAL, которые можно просмотреть в окне VHAL эмулятора. В результате вы можете просмотреть множество информации о VHAL, включая имена, описания и значения значений. Информация извлекается из метаданных свойств VHAL, которые жестко запрограммированы в эмуляторе QEMU .

Когда вы добавляете свои собственные свойства VHAL для эксклюзивного использования на своих устройствах, для просмотра метаданных VHAL в окне VHAL вам потребуется изменить код и создать собственный эмулятор QEMU. Чтобы обойти эту проблему, вы можете написать свои собственные описания в формате JSON и добавить их в образ вашей системы.

Обзор

На этой странице подробно описано, как можно расширить описания свойств VHAL в эмуляторе AAOS.

Создайте метаданные JSON для расширения свойств VHAL.

Эмулятор ищет дополнительные метаданные во всех файлах, заканчивающихся на -types-meta.json в пути к виртуальному устройству Android (AVD). Ожидается, что файлы JSON будут состоять из массива объектов Enum , как показано ниже.

Объект перечисления

Объект Enum с именем VehicleProperty — это особый случай, в котором его можно рассматривать как корень. Его содержимое добавляется на карту свойств автомобиля. Другие Enums (с именем, отличным от VehicleProperty ) определяют карты имен пользовательских значений.

Enum: {
  "name" : String,
  "values" : Array of { ValueObject }
}  

ValueObject

ValueObject: {
  "name" : String,
  "value" : Integer,
  "data_enum" : String, VehicleProperty only, optional,
}

Для VehicleProperty имя Enum описывает, как это свойство отображается в окне VHAL эмулятора. Значением является property_id свойства, описанного ValueObject . data_enum связывает ValueObject с другим Enum . Эта ассоциация используется для преобразования значения в удобочитаемую строку и существует только для ValueObjects в Enum для VehicleProperty . Пример VehicleProperty показан ниже:

[
  {
      "name": "VehicleProperty",
      "values": [
          {
              "name": "CURRENT_GEAR",
              "value": 289408001
          }
      ]
  }
]

В этом примере property_id со value 289408001 предоставляется в качестве name для CURRENT_GEAR . В эмуляторе это свойство уже жестко закодировано в виде имени Current Gear . (Вы не можете воспроизвести этот сценарий, поскольку эта страница была создана после удаления всех жестко запрограммированных свойств в демонстрационных целях.)

Рисунок 1. VehicleProperty, определенный с именем и значением.

На вкладке свойств VHAL эмулятора имя обновляется и становится CURRENT_GEAR , как и ожидалось.

data_enum

В приведенном выше примере отображаемое значение равно 4, когда передача установлена ​​на P.

Рисунок 2. Значение отображается как 4.

Как и предполагалось, на вкладке «Свойства VHAL» в эмуляторе имя отображается как CURRENT_GEAR . В этом отличие от существующего эмулятора, где он отображается как P.

enum VehicleGear {
  GEAR_UNKNOWN = 0x0000,
  GEAR_NEUTRAL = 0x0001,
  GEAR_REVERSE = 0x0002,
  GEAR_PARK = 0x0004,
  GEAR_DRIVE = 0x0008,
  GEAR_1 = 0x0010,
  GEAR_2 = 0x0020,
  GEAR_3 = 0x0040,
  GEAR_4 = 0x0080,
  GEAR_5 = 0x0100,
  GEAR_6 = 0x0200,
  GEAR_7 = 0x0400,
  GEAR_8 = 0x0800,
  GEAR_9 = 0x1000,
}

Чтобы узнать больше, см. определение AIDL .

Как определено в AIDL, значение механизма парковки равно 4 , что означает, что вам необходимо перевести значение 4 в P. Это когда вы используете data_enum , который сопоставляет значение этого свойства с удобочитаемой строкой в ​​другом Enum . Эмулятор использует эту карту для перевода значений свойств. Например:

[
    {
        "name": "VehicleProperty",
        "values": [
            {
                "name": "CURRENT_GEAR",
                "value": 289408001,
                "data_enum": "VehicleGear"
            }
        ]
    },
    {
        "name": "VehicleGear",
        "values": [
            {
                "name": "GEAR_UNKNOWN",
                "value": 0
            },
            {
                "name": "GEAR_PARK",
                "value": 4
            }
        ]
    }

]

Добавьте "data_enum": "VehicleGear" , чтобы эмулятор использовал Enum с именем VehicleGear для преобразования значения свойства. Добавьте еще один Enum с именем VehicleGear , значение которого представляет собой массив ValueObject , где значение свойства (со значением) должно отображаться как имя.

Рисунок 3. Значение отображается как GEAR_PARK.

На вкладке «Свойства VHAL» для эмулятора имя обновляется и становится CURRENT_GEAR , как и ожидалось. Значение свойства 4 отображается как GEAR_PARK .

Используйте метаданные JSON для расширения свойств VHAL.

Чтобы использовать метаданные JSON для расширения свойств VHAL, запустите этот сценарий Python (содержащийся в исходном коде Android), чтобы сгенерировать JSON расширенного свойства на основе информации в AIDL.

Результирующий JSON включает в себя некоторые избыточные значения, такие change_mode , access и unit . Хотя эта информация является частью свойства VHAL, эти значения JSON не влияют на то, что отображается в окне свойств VHAL эмулятора.

Добавьте метаданные JSON в образ системы

Помните, что имя файла должно заканчиваться на -types-meta.json . В противном случае файл игнорируется.

Добавить цель сборки

Добавьте файл -types-meta.json в PRODUCT_COPY_FILE . Например:

PRODUCT_COPY_FILES += \
    device/generic/car/common/vehicle-types-meta.json:vehicle-types-meta.json

Этот код копирует файл в out/target/product/{your_target_path}/ , корень созданного вами целевого вывода.