Tài nguyên khác

Các tài nguyên sau đây cung cấp thông tin chi tiết về vị trí mã, công cụ, thử nghiệm và cấp phép.

Vị trí mã có thể truy vấn

Mã cho đối tượng giao diện nhà cung cấp có thể truy vấn sẽ chuyển đến system/libvintf.

Việc viết tệp kê khai và ma trận tương thích theo cách thủ công có thể sẽ khó khăn. Hãy sử dụng các công cụ sau đây để tạo tệp kê khai/ma trận tương thích mẫu để bắt đầu.

LSHAL

LSHAL là một công cụ phía thiết bị liệt kê tất cả HAL đã đăng ký với hwservicemanager và tất cả các cách triển khai truyền dẫn có sẵn (ví dụ: android.hardware.foo@1.0-impl.so) trên thiết bị. Công cụ này cũng có thể tạo tệp kê khai thiết bị dựa trên danh sách:

adb shell su 0 /system/bin/lshal --init-vintf

Xin lưu ý những điều sau:

  1. Nếu một gói vừa được đăng ký với hwservicemanager vừa được tìm thấy dưới dạng HAL truyền dẫn, thì <transport> sẽ được đặt thành hwbinder.
  2. Không có phiên bản SELinux nào được ghi vào tệp kê khai. Bạn nên chèn phần tử này thông qua assemble_vintf như giải thích bên dưới.
  3. Tệp kê khai HAL được tạo có thể không chính xác. Bạn cần chú ý để khắc phục những điểm không nhất quán giữa tệp kê khai thiết bị và những gì vendor.img thực sự cung cấp.

ASSEMBLE_VINTF

assemble_vintf là một công cụ phía máy chủ:

  1. Xác minh ma trận tương thích hoặc tệp kê khai là hợp lệ.
  2. Chèn các biến vào tệp kê khai/ma trận tương thích có sẵn tại thời điểm tạo bản dựng và tạo một tệp mới cần được cài đặt vào thiết bị.
  3. Kiểm tra khả năng tương thích giữa tệp được tạo và tệp kép của tệp đó.
  4. Nếu bạn cung cấp một tệp kê khai, thì bạn có thể tạo một ma trận tương thích mẫu tương thích với tệp kê khai đó.

Ví dụ: Tạo ma trận tương thích với thiết bị từ tệp kê khai khung

assemble_vintf -m --hals-only \
    -i system/libhidl/manifest.xml \
    -o device/manufacturer/device_name/compatibility_matrix.xml

Xin lưu ý rằng tất cả HAL đều được đặt thành optional="true".

Ví dụ: Tạo ma trận tương thích với khung xương từ tệp kê khai thiết bị

assemble_vintf -m --hals-only \
    -i device/foo/bar/manifest.xml \
    -o path/to/place/output/compatibility_matrix.xml

Xin lưu ý rằng tất cả HAL đều được đặt thành optional="true".

Ví dụ: Tạo tệp XML kê khai thiết bị từ các biến

Tại thời gian xây dựng, nếu các biến sau đây được xác định trong device/manufacturer/device_name/BoardConfig.mk:

# Vendor manifest is named DEVICE_MANIFEST_FILE for legacy reasons.
DEVICE_MANIFEST_FILE := \
    device/manufacturer/device_name/vendor_manifest.xml
ODM_MANIFEST_FILES := \
    device/manufacturer/device_name/odm_manifest.xml
ODM_MANIFEST_SKUS := sku1 sku2
ODM_MANIFEST_SKU1_FILES := \
    device/manufacturer/device_name/odm_manifest_sku1.xml
ODM_MANIFEST_SKU2_FILES := \
    device/manufacturer/device_name/odm_manifest_sku2.xml

Sau đó, các lệnh sau đây sẽ được thực thi (trong hệ thống xây dựng, được sửa đổi để bỏ qua thông tin chi tiết về cách triển khai) để tạo tệp XML kê khai thiết bị:

# vendor manifest; only when DEVICE_MANIFEST_FILE is set
BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) assemble_vintf \
    $(addprefix,-i ,$(DEVICE_MANIFEST_FILE)) \
    -o $(TARGET_OUT_VENDOR)/etc/vintf/manifest.xml

# ODM manifests
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest.xml

# ODM manifests for each sku
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_SKU1_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest_sku1.xml
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_SKU2_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest_sku2.xml

Trong thời gian chạy, đối tượng VINTF sẽ kết hợp tệp kê khai nhà cung cấp và tệp kê khai ODM làm tệp kê khai thiết bị. Xem bài viết Tệp kê khai thiết101} bị để biết thông tin chi tiết.

Ví dụ: Tạo tệp XML ma trận tương thích với thiết bị từ các biến

Tại thời gian xây dựng, nếu các biến sau đây được xác định trong device/manufacturer/device_name/BoardConfig.mk:

# vendor compatibility matrix is named DEVICE_MATRIX_FILE for legacy reasons.
DEVICE_MATRIX_FILE := \
    device/manufacturer/device_name/vendor_compatibility_matrix.xml \
    device/manufacturer/device_name/vendor_compatibility_matrix_additional.xml

Sau đó, các lệnh sau đây sẽ được thực thi (trong hệ thống xây dựng, được sửa đổi để bỏ qua thông tin chi tiết về cách triển khai) để tạo tệp XML ma trận khả năng tương thích với thiết bị:

# vendor compatibility matrix; only when DEVICE_MATRIX_FILE is set
assemble_vintf \
    $(addprefix,-i ,$(DEVICE_MATRIX_FILE)) \
    -o $(TARGET_OUT_VENDOR)/etc/vintf/compatibility_matrix.xml

Trong thời gian chạy, đối tượng VINTF sẽ sử dụng ma trận tương thích với nhà cung cấp làm ma trận tương thích với thiết bị. Xem bài viết Ma trận tương thích với thiết bị để biết thông tin chi tiết.

Ví dụ: Tạo tệp XML kê khai khung từ các biến

Các biến sau đây có thể được xác định trong device/manufacturer/device_name/BoardConfig.mk:

# Device-specific system manifest is named DEVICE_FRAMEWORK_MANIFEST_FILE for legacy reasons
DEVICE_FRAMEWORK_MANIFEST_FILE := \
    device/manufacturer/device_name/device_system_manifest.xml

# Product manifest
PRODUCT_MANIFEST_FILES := \
    device/manufacturer/device_name/product_manifest.xml

Các lệnh sau đây sẽ được thực thi (trong hệ thống xây dựng, được sửa đổi để bỏ qua thông tin chi tiết về cách triển khai) để tạo tệp XML kê khai khung:

# system manifest
assemble_vintf \
    -i system/libhidl/vintfdata/manifest.xml \
    $(addprefix,-i ,$(DEVICE_FRAMEWORK_MANIFEST_FILE)) \
    -o $(TARGET_OUT)/etc/vintf/manifest.xml

# product manifest
assemble_vintf \
    $(addprefix,-i ,$(PRODUCT_MANIFEST_FILES)) \
    -o $(TARGET_OUT_PRODUCT)/etc/vintf/manifest.xml

Trong thời gian chạy, đối tượng VINTF sẽ kết hợp tệp kê khai hệ thống, các mảnh tệp kê khai hệ thống, tệp kê khai sản phẩm và các mảnh tệp kê khai sản phẩm làm tệp kê khai khung. Xem bài viết Tệp kê khai khung để biết thông tin chi tiết.

Ví dụ: Tạo tệp XML ma trận tương thích với khung từ các biến

Các biến sau đây có thể được xác định trong device/manufacturer/device_name/BoardConfig.mk để xác định FCM sản phẩm và FCM hệ thống dành riêng cho thiết bị:

DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE := \
    device/manufacturer/device_name/product_compatibility_matrix.xml
# Device-specific system compatibility matrix is named
# DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE for legacy reasons.
DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE := \
    device/manufacturer/device_name/device_system_compatibility_matrix.xml

Bạn phải cài đặt FCM system_ext bằng các mô-đun Soong. Bạn cũng có thể cài đặt FCM sản phẩm bằng các mô-đun Soong; đừng xác định DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE nếu bạn sử dụng phương thức này. Ngoài ra, bạn có thể cài đặt nhiều phiên bản FCM sản phẩm và phiên bản FCM system_ext bằng các mô-đun Soong. Hãy xác định những nội dung sau:

  • Xác định một mô-đun trong device/manufacturer/device_name/Android.bp. Ví dụ (thay thế system_ext bằng sản phẩm cho FCM sản phẩm):
    vintf_compatibility_matrix {
        name: "system_ext_compatibility_matrix.xml",
        stem: "compatibility_matrix.xml",
        system_ext_specific: true,
        // product_specific: true, // for product FCM
        srcs: [
            "system_ext_compatibility_matrix.xml",
        ],
    }
  • Cài đặt mô-đun vào device/manufacturer/device_name/device.mk. Ví dụ:
    PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml

Các lệnh sau đây sẽ được thực thi (trong hệ thống xây dựng, được sửa đổi để bỏ qua thông tin chi tiết về cách triển khai) để tạo tệp XML ma trận khả năng tương thích với khung:

# common system compatibility matrix for each FCM version
BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) \
POLICYVERS=$(POLICYVERS) \
BOARD_AVB_VBMETA_VERSION=$(BOARD_AVB_VBMETA_VERSION)
assemble_vintf \
    -i hardware/interfaces/compatibility_matrices/compatibility_matrix.empty.xml
    $(addprefix,-i ,$(DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE)) \
    -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.device.xml

# framework compatibility matrixes at each FCM version
assemble_vintf
    -i hardware/interfaces/compatibility_matrices/compatibility_matrix.{level}.xml \
    -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.{level}.xml \
    --kernel=...

# product framework compatibility matrix; only when
# DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE is set or when the Soong module for
# product FCM is defined
assemble_vintf
    -i $(DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE)
    -o $(TARGET_OUT_PRODUCT)/etc/vintf/compatibility_matrix.xml

# system_ext framework compatibility matrix; only when the Soong module for
# system_ext FCM is defined
assemble_vintf
    -i <srcs for the soong module>
    -o $(TARGET_OUT_SYSTEM_EXT)/etc/vintf/compatibility_matrix.xml

Trong thời gian chạy, đối tượng VINTF sẽ kết hợp một tập hợp con của ma trận tương thích với hệ thống và ma trận tương thích với sản phẩm làm ma trận tương thích với khung. Xem bài viết Ma trận tương thích với khung để biết thông tin chi tiết.

Ví dụ: Tạo tệp kê khai nhà cung cấp từ các mảnh

Bạn có thể gói nhiều mảnh tệp kê khai nhà cung cấp tại thời gian xây dựng. Ví dụ:

<!-- device/manufacturer/device_name/manifest_common.xml -->
<manifest version="1.0" type="device">
    <!-- common HALs here -->
</manifest>
<!-- device/manufacturer/device_name/ir.xml -->
<manifest version="1.0" type="device">
    <hal>
        <name>android.hardware.ir</name>
        <version>1.0</version>
        <!-- other fields -->
    </hal>
</manifest>
# device/manufacturer/device_name/BoardConfig.mk
DEVICE_MANIFEST_FILE := device/manufacturer/device_name/manifest_common.xml
ifdef BOARD_ENABLE_IR
    DEVICE_MANIFEST_FILE += device/manufacturer/device_name/ir.xml
endif

Sau đó, assemble_vintf sẽ thêm HAL IR vào tệp kê khai nhà cung cấp nếu BOARD_ENABLE_IR được xác định và bỏ qua nếu BOARD_ENABLE_IR không được xác định. Các lệnh sau đây (được sửa đổi để bỏ qua thông tin chi tiết về cách triển khai) sẽ được thực thi để tạo tệp kê khai nhà cung cấp:

# if BOARD_ENABLE_IR is defined
BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \
    -i device/manufacturer/device_name/manifest_common.xml:device/manufacturer/device_name/ir.xml \
    -o $(TARGET_OUT_VENDOR)/manifest.xml

# if BOARD_ENABLE_IR is not defined
BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \
    -i device/manufacturer/device_name/manifest_common.xml \
    -o $(TARGET_OUT_VENDOR)/manifest.xml

Để biết chi tiết, hãy xem:

assemble_vintf --help

Thử nghiệm

Dự án platform/system/libvintf sử dụng GTest để chuyển đổi tuần tự, giải tuần tự hoá và kiểm tra khả năng tương thích.

Cấp phép

  • tinyxml2 (external/tinyxml2) để tuần tự hoá/giải tuần tự hoá đối tượng thành/từ XML. Giấy phép tương tự BSD.
  • libselinux (external/selinux/libselinux) để lấy phiên bản policydb. Giấy phép miền công cộng.
  • libz (external/zlib) để giải nén /proc/config.gz. Giấy phép tương tự BSD.
  • Dự án libvintf sử dụng giấy phép Apache 2.0 (với các tệp MODULE_LICENSE_APACHE2 và NOTICE thích hợp).