에뮬레이터에서 VHAL 속성 설명 확장

Android Automotive OS(AAOS)에는 에뮬레이터의 VHAL 창에서 확인할 수 있는 일반 VHAL 속성이 포함되어 있습니다. 따라서 이름과 설명, 값의 의미 등 VHAL에 관한 여러 정보를 확인할 수 있습니다. 이 정보는 QEMU 에뮬레이터에 하드 코딩된 VHAL 속성의 메타데이터에서 추출됩니다.

기기에서 독점으로 사용하기 위해 자체 VHAL 속성을 추가하는 경우 VHAL 창에서 VHAL 메타데이터를 확인하려면 코드를 수정하고 맞춤설정된 QEMU 에뮬레이터를 빌드해야 합니다. 이 문제를 해결하려면 JSON 형식으로 자체 설명을 작성하고 시스템 이미지에 추가하면 됩니다.

개요

이 페이지에서는 AAOS 에뮬레이터에서 VHAL 속성 설명을 확장하는 방법을 자세히 설명합니다.

JSON 메타데이터를 만들어 VHAL 속성 확장

에뮬레이터는 Android Virtual Device(AVD) 경로의 -types-meta.json으로 끝나는 모든 파일에서 추가 메타데이터를 찾습니다. JSON 파일은 아래와 같이 Enum 객체 배열로 구성되어야 합니다.

Enum 객체

이름이 VehiclePropertyEnum 객체는 루트로 고려할 수 있다는 점에서 특별한 사례입니다. 이 객체의 콘텐츠는 차량 속성 맵에 추가됩니다. 다른 Enums(VehicleProperty 이외의 이름)는 맞춤 값의 이름 맵을 정의합니다.

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

ValueObject

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

VehicleProperty의 경우 Enum 이름은 이 속성이 에뮬레이터의 VHAL 창에 표시되는 방식을 설명합니다. 값은 ValueObject로 설명된 속성의 property_id입니다. data_enumValueObject를 또 다른 Enum과 연결합니다. 이 연결은 값을 인간이 읽을 수 있는 문자열에 매핑하는 데 사용되며 VehiclePropertyEnum에서 ValueObjects를 위해서만 존재합니다. VehicleProperty 예는 다음과 같습니다.

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

이 예에서 value289408001property_idCURRENT_GEARname으로 제공됩니다. 에뮬레이터에서 이 속성은 이미 Current Gear라는 이름으로 하드 코딩되어 있습니다. 이 페이지는 데모 목적으로 모든 하드 코딩 속성을 삭제한 후 작성되었으므로 이 시나리오는 재현할 수 없습니다.

그림 1. 이름과 값으로 정의된 VehicleProperty

에뮬레이터의 VHAL 속성 탭에서 이름이 예상대로 CURRENT_GEAR로 새로고침됩니다.

data_enum

위 예에서 표시된 값은 기어가 P로 설정될 때 4입니다.

그림 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입니다. 즉, 값 4P로 변환해야 한다는 의미입니다. 이 속성 값을 다른 Enum의 인간이 읽을 수 있는 문자열에 매핑하는 data_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"를 추가합니다. 그러면 에뮬레이터가 VehicleGear라는 Enum을 사용하여 속성 값을 변환할 수 있습니다. 값이 ValueObject 배열인 VehicleGear라는 또 다른 Enum을 추가합니다. 여기서 속성 값(값 포함)은 이름으로 표시되어야 합니다.

그림 3. GEAR_PARK로 표시된 값

에뮬레이터의 VHAL 속성 탭에서 이름이 예상대로 CURRENT_GEAR로 새로고침됩니다. 속성 값 4GEAR_PARK로 표시됩니다.

JSON 메타데이터를 사용하여 VHAL 속성 확장

JSON 메타데이터를 사용하여 VHAL 속성을 확장하려면 이 Python 스크립트(Android 소스에 포함됨)를 실행하여 AIDL의 정보에서 확장된 속성 JSON을 생성합니다.

결과 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}/에 파일을 복사합니다.