Mở rộng phần mô tả thuộc tính VHAL trong trình mô phỏng

Android Automotive OS (AAOS) chứa các thuộc tính VHAL phổ biến có thể để xem trong cửa sổ VHAL của trình mô phỏng. Kết quả là bạn có thể xem được nhiều thông tin về VHAL, bao gồm cả tên, nội dung mô tả và ý nghĩa của các giá trị. Thông tin này được trích xuất từ siêu dữ liệu của các thuộc tính VHAL, được mã hoá cứng vào Trình mô phỏng QEMU.

Khi bạn thêm thuộc tính VHAL của riêng mình để sử dụng độc quyền trên thiết bị, hãy xem siêu dữ liệu VHAL trong cửa sổ VHAL, bạn cần sửa đổi mã và tạo trình mô phỏng QEMU tuỳ chỉnh. Người nhận giải quyết vấn đề này, bạn có thể viết nội dung mô tả của riêng mình ở định dạng JSON rồi đưa chúng vào hệ thống của bạn hình ảnh.

Tổng quan

Trang này trình bày chi tiết cách bạn có thể mở rộng mô tả thuộc tính VHAL trong trình mô phỏng AAOS.

Tạo siêu dữ liệu JSON để mở rộng các thuộc tính VHAL

Trình mô phỏng tìm siêu dữ liệu bổ sung trong tất cả các tệp kết thúc bằng -types-meta.json trong đường dẫn Thiết bị ảo Android (AVD). Tệp JSON cần bao gồm một mảng Enum đối tượng như minh hoạ dưới đây.

Đối tượng enum

Đối tượng Enum có tên VehicleProperty là một trường hợp đặc biệt trong đó bạn có thể coi đó là thư mục gốc. Nội dung của chuyến đi sẽ được thêm vào bản đồ thuộc tính xe. Lý do khác Enums (có tên không phải là VehicleProperty) xác định bản đồ của các tên này của các giá trị tuỳ chỉnh.

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

Đối tượng giá trị

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

Đối với VehicleProperty, tên Enum mô tả cách điều này thuộc tính này sẽ xuất hiện trong cửa sổ VHAL của trình mô phỏng. Giá trị là property_id của thuộc tính mà ValueObject mô tả. data_enum liên kết ValueObject với một Enum khác. Mối liên kết này được dùng để ánh xạ một giá trị thành một chuỗi mà con người có thể đọc được và chỉ tồn tại cho ValueObjects trong Enum cho VehicleProperty. Dưới đây là ví dụ về VehicleProperty:

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

Trong ví dụ này, property_idvalue289408001 được cung cấp dưới dạng name cho CURRENT_GEAR. Trong trình mô phỏng, thuộc tính này đã được mã hoá cứng làm tên Current Gear. (Bạn không thể tái hiện trường hợp này vì trang này được tạo sau khi xoá tất cả mã được cố định giá trị trong mã cho mục đích minh hoạ.)

Hình 1. Thuộc tính xe được xác định bằng tên và giá trị.

Trong thẻ VHAL Properties (Thuộc tính VHAL) của trình mô phỏng, tên sẽ được làm mới để đọc CURRENT_GEAR như dự kiến.

dữ_liệu_enum

Trong ví dụ trên, giá trị được hiển thị là 4 khi bánh răng được đặt thành B.

Hình 2. Giá trị được hiển thị là 4.

Như đã dự tính, trên thẻ VHAL Properties (Thuộc tính VHAL) trong trình mô phỏng, tên sẽ xuất hiện như CURRENT_GEAR. Điều này trái ngược với trình mô phỏng hiện có, trong đó trình mô phỏng thể hiện dưới dạng B.

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,
}

Để tìm hiểu thêm, hãy xem AIDL định nghĩa.

Theo định nghĩa trong AIDL, giá trị của bánh răng Đỗ xe4, tức là có nghĩa là bạn cần chuyển giá trị 4 sang P. Đây là khi bạn sử dụng data_enum để liên kết giá trị thuộc tính này với một chuỗi mà con người có thể đọc được trong một chuỗi khác Enum Trình mô phỏng sử dụng bản đồ này để dịch các giá trị của thuộc tính. Ví dụ:

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

]

Thêm "data_enum": "VehicleGear" để trình mô phỏng sử dụng Enum có tên là VehicleGear để dịch giá trị thuộc tính. Thêm Enum khác có tên VehicleGear với giá trị là một mảng ValueObject, trong đó giá trị thuộc tính (có giá trị) sẽ được hiển thị dưới dạng tên.

Hình 3. Giá trị được hiển thị dưới dạng GEAR_PARK.

Trên thẻ Thuộc tính VHAL cho trình mô phỏng, tên sẽ được làm mới để đọc CURRENT_GEAR, đúng như dự kiến. Giá trị thuộc tính của 4 được hiển thị dưới dạng GEAR_PARK

Sử dụng siêu dữ liệu JSON để mở rộng các thuộc tính VHAL

Để sử dụng siêu dữ liệu JSON nhằm mở rộng các thuộc tính VHAL, hãy chạy thuộc tính này Tập lệnh Python (có trong nguồn Android) để tạo thuộc tính mở rộng JSON từ thông tin trong AIDL.

JSON thu được có chứa một số giá trị thừa, chẳng hạn như change_mode, accessunit. Mặc dù thông tin này là một phần của thuộc tính VHAL, các giá trị JSON này không ảnh hưởng đến nội dung xuất hiện trong cửa sổ thuộc tính VHAL của trình mô phỏng.

Thêm siêu dữ liệu JSON vào hình ảnh hệ thống

Xin lưu ý rằng tên tệp phải kết thúc bằng -types-meta.json. Nếu không, tệp sẽ bị đã bỏ qua.

Thêm mục tiêu bản dựng

Thêm tệp -types-meta.json vào PRODUCT_COPY_FILE. Ví dụ:

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

Mã này sẽ sao chép tệp vào out/target/product/{your_target_path}/, thư mục gốc của đầu ra mục tiêu đã tạo.