Ampliar las descripciones de propiedades de VHAL en el emulador

El sistema operativo Android Automotive (AAOS) contiene propiedades VHAL comunes que se pueden ver en la ventana VHAL de un emulador. Como resultado, puede ver una gran cantidad de información sobre los VHAL, incluidos los nombres, las descripciones y el significado de los valores. La información se extrae de los metadatos de las propiedades VHAL, que están codificados en el emulador QEMU .

Cuando agrega sus propias propiedades de VHAL para uso exclusivo en sus dispositivos, la visualización de metadatos de VHAL en la ventana de VHAL requiere que modifique el código y cree un emulador de QEMU personalizado. Para evitar esto, puede escribir sus propias descripciones en formato JSON y colocarlas en la imagen de su sistema.

Descripción general

Esta página detalla cómo puede extender las descripciones de las propiedades VHAL en un emulador AAOS.

Cree metadatos JSON para ampliar las propiedades de VHAL

El emulador busca metadatos adicionales en todos los archivos que terminan en -types-meta.json en la ruta del dispositivo virtual de Android (AVD). Se espera que los archivos JSON consten de una matriz de objetos Enum como se muestra a continuación.

Objeto de enumeración

El objeto Enum con el nombre VehicleProperty es un caso especial en el que se puede considerar como una raíz. Su contenido se añade al mapa de propiedades del vehículo. Otras Enums (con un nombre que no sea VehicleProperty ) definen mapas de los nombres de los valores personalizados.

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

objeto de valor

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

Para VehicleProperty , el nombre Enum describe cómo se muestra esta propiedad en la ventana VHAL del emulador. El valor es el property_id de la propiedad descrita por ValueObject . data_enum asocia ValueObject con otro Enum . Esta asociación se usa para asignar un valor a una cadena legible por humanos y existe solo para ValueObjects en el Enum para VehicleProperty . A continuación se muestra un ejemplo de VehicleProperty :

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

En este ejemplo, se proporciona un property_id con un value de 289408001 como name para CURRENT_GEAR . En el emulador, esta propiedad ya está codificada como un nombre, Current Gear . (No puede reproducir este escenario ya que esta página se creó después de eliminar todas las propiedades codificadas con fines de demostración).

Figura 1. VehicleProperty definido con nombre y valor.

En la pestaña Propiedades VHAL del emulador, el nombre se actualiza para leer CURRENT_GEAR como se esperaba.

data_enum

En el ejemplo anterior, el valor mostrado es 4 cuando la marcha está en P .

Figura 2. Valor mostrado como 4.

Según lo previsto, en la pestaña Propiedades de VHAL en el emulador, el nombre aparece como CURRENT_GEAR . Esto contrasta con el emulador existente, donde se muestra como 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,
}

Para obtener más información, consulte la definición de AIDL .

Como se define en el AIDL, el valor del engranaje de estacionamiento es 4 , lo que significa que debe traducir el valor 4 a P . Esto es cuando usa data_enum , que asigna este valor de propiedad a una cadena legible por humanos en otro Enum . El emulador usa este mapa para traducir valores de propiedad. Por ejemplo:

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

]

Agregue "data_enum": "VehicleGear" para que el emulador use un Enum llamado VehicleGear para traducir el valor de la propiedad. Agregue otro Enum llamado VehicleGear con el valor como una matriz de ValueObject , donde el valor de la propiedad (con el valor) debe mostrarse como un nombre.

Figura 3. Valor mostrado como GEAR_PARK.

En la pestaña Propiedades de VHAL para el emulador, el nombre se actualiza para leer CURRENT_GEAR , como se esperaba. El valor de propiedad de 4 se muestra como GEAR_PARK .

Use metadatos JSON para extender las propiedades VHAL

Para usar metadatos JSON para ampliar sus propiedades VHAL, ejecute este script de Python (que se encuentra en la fuente de Android) para generar la propiedad extendida JSON a partir de la información del AIDL.

El JSON resultante incluye algunos valores redundantes, como change_mode , access y unit . Aunque esta información es parte de la propiedad VHAL, estos valores JSON no afectan lo que se muestra en la ventana de propiedades VHAL del emulador.

Agregar metadatos JSON a la imagen del sistema

Tenga en cuenta que un nombre de archivo debe terminar con -types-meta.json . Si no, el archivo se ignora.

Agregar un objetivo de compilación

Agregue el archivo -types-meta.json a PRODUCT_COPY_FILE . Por ejemplo:

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

Este código copia el archivo en out/target/product/{your_target_path}/ , la raíz de la salida de destino creada.