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

Hệ điều hành ô tô Android (AAOS) chứa các thuộc tính VHAL phổ biến có thể xem được trong cửa sổ VHAL của trình mô phỏng. Do đó, bạn có thể xem rất nhiều thông tin về VHAL bao gồm tên, mô tả và ý nghĩa của các giá trị. Thông tin được trích xuất từ ​​siêu dữ liệu của thuộc tính VHAL, được mã hóa 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ị của mình, việc xem siêu dữ liệu VHAL trong cửa sổ VHAL yêu cầu bạn sửa đổi mã và xây dựng trình mô phỏng QEMU tùy chỉnh. Để giải quyết vấn đề này, bạn có thể viết mô tả của riêng mình ở định dạng JSON và chúng vào hình ảnh hệ thống của bạn.

Tổng quan

Trang này nêu 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 thuộc tính VHAL

Trình mô phỏng tìm kiế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). Các tệp JSON dự kiến ​​​​sẽ bao gồm một mảng các đối tượng Enum như hiển thị bên dưới.

Đối tượng liệt kê

Đối tượng Enum có tên VehicleProperty là một trường hợp đặc biệt trong đó bạn có thể coi nó như một root. Nội dung của nó được thêm vào bản đồ thuộc tính xe. Enums khác (có tên khác VehicleProperty ) xác định bản đồ tên của các giá trị tùy 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 hiển thị thuộc tính này trong cửa sổ VHAL của trình mô phỏng. Giá trị là property_id của thuộc tính được mô tả bởi ValueObject . data_enum liên kết ValueObject với một Enum khác. Liên kết này được sử 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 đối với ValueObjects trong Enum cho VehicleProperty . Một ví dụ về VehicleProperty được hiển thị bên dưới:

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

Trong ví dụ này, property_idvalue 289408001 được cung cấp làm name cho CURRENT_GEAR . Trong trình mô phỏng, thuộc tính này đã được mã hóa cứng dưới dạng tên Current Gear . (Bạn không thể tái tạo kịch bản này vì trang này được tạo sau khi xóa tất cả các thuộc tính được mã hóa cứng cho mục đích trình diễn.)

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

Trong tab Thuộc tính VHAL của trình mô phỏng, tên được làm mới để đọc CURRENT_GEAR như mong đợi.

dữ liệu_enum

Trong ví dụ trên, giá trị được hiển thị là 4 khi cài số P.

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

Đúng như dự định, trên tab Thuộc tính VHAL trong trình mô phỏng, tên xuất hiện là CURRENT_GEAR . Điều này trái ngược với trình giả lập hiện có, nơi nó được hiển thị dưới dạng 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,
}

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

Như được định nghĩa trong AIDL, giá trị của bánh răng Park4 , nghĩa là bạn cần dịch giá trị 4 thành P. Đây là khi bạn sử dụng data_enum , ánh xạ giá trị thuộc tính này tới một chuỗi có thể đọc được trong một Enum khác. Trình mô phỏng sử dụng bản đồ này để dịch các giá trị 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 VehicleGear để dịch giá trị thuộc tính. Thêm một 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 tab Thuộc tính VHAL dành cho trình mô phỏng, tên được làm mới để đọc CURRENT_GEAR như mong đợi. Giá trị thuộc tính là 4 được hiển thị dưới dạng GEAR_PARK .

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

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

JSON kết quả bao gồm một số giá trị dư 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 nhưng các giá trị JSON này không ảnh hưởng đến nội dung hiển thị 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

Hãy 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 tin sẽ bị bỏ qua.

Thêm mục tiêu xây 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 sao chép tệp vào out/target/product/{your_target_path}/ , gốc của đầu ra mục tiêu được xây dựng của bạn.