Dodatkowe materiały

Szczegółowe informacje o lokalizacjach kodu, narzędziach, testowaniu i licencjonowaniu znajdziesz w tych zasobach.

Lokalizacja kodu, w której można wysyłać zapytania

Kod obiektu interfejsu dostawcy, który można wysyłać jako zapytanie, trafia do system/libvintf.

Ręczne tworzenie plików manifestu i macierzy zgodności może być trudne. Użyj tych narzędzi, aby wygenerować szablon manifestu lub macierzy zgodności, od którego możesz zacząć.

LSHAL

LSHAL to narzędzie po stronie urządzenia, które wyświetla listę wszystkich zarejestrowanych interfejsów HALhwservicemanager i wszystkich dostępnych implementacji przekazywaniaandroid.hardware.foo@1.0-impl.so na urządzeniu (np. android.hardware.foo@1.0-impl.so). Może też wygenerować na podstawie listy plik manifestu urządzenia:

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

Uwaga:

  1. Jeśli pakiet jest zarejestrowany w hwservicemanager i znajduje się w HAL-u przekazywania, wartość <transport> jest ustawiona na hwbinder.
  2. W pliku manifestu nie ma informacji o wersji SELinux. Zalecamy wstawianie elementu za pomocą assemble_vintf w sposób opisany poniżej.
  3. Wygenerowany plik manifestu HAL może być niedokładny. Do usunięcia niezgodności między plikiem manifestu urządzenia a tym, co faktycznie udostępnia vendor.img, wymagana jest interwencja człowieka.

ASSEMBLE_VINTF

assemble_vintf to narzędzie po stronie hosta, które:

  1. Sprawdza, czy macierz zgodności lub plik manifestu są prawidłowe.
  2. Wstawia zmienne do manifestów lub macierzy zgodności dostępnych w czasie kompilacji i generuje nowy plik, który należy zainstalować na urządzeniu.
  3. Sprawdza zgodność wygenerowanego pliku z jego odpowiednikiem.
  4. Jeśli podano plik manifestu, opcjonalnie generuje szablonową macierz zgodności, która jest zgodna z tym plikiem.

Przykład: generowanie macierzy zgodności urządzeń z pliku manifestu platformy

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

Pamiętaj, że wszystkie warstwy HAL są ustawione na optional="true".

Przykład: generowanie szkieletu macierzy zgodności platformy na podstawie pliku manifestu urządzenia

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

Pamiętaj, że wszystkie warstwy HAL są ustawione na optional="true".

Przykład: generowanie plików XML manifestu urządzenia na podstawie zmiennych

Jeśli w czasie kompilacji w pliku device/manufacturer/device_name/BoardConfig.mk zdefiniowane są te zmienne:

# 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

Następnie wykonywane są te polecenia (w systemie kompilacji, zmodyfikowane w celu pominięcia szczegółów implementacji), aby wygenerować pliki XML manifestu urządzenia:

# 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

W czasie działania obiekt VINTF łączy pliki manifestu dostawcy i pliki manifestu ODM jako plik manifestu urządzenia. Więcej informacji znajdziesz w sekcji Manifest urządzenia.

Przykład: generowanie plików XML macierzy zgodności urządzeń na podstawie zmiennych

Jeśli w czasie kompilacji w pliku device/manufacturer/device_name/BoardConfig.mk zdefiniowane są te zmienne:

# 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

Następnie wykonywane są te polecenia (w systemie kompilacji, zmodyfikowane w celu pominięcia szczegółów implementacji), aby wygenerować pliki XML macierzy zgodności urządzeń:

# 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

W czasie działania obiekt VINTF używa macierzy zgodności dostawcy jako macierzy zgodności urządzenia. Szczegółowe informacje znajdziesz w tabeli zgodności urządzeń.

Przykład: generowanie plików XML manifestu platformy na podstawie zmiennych

W ramach elementu device/manufacturer/device_name/BoardConfig.mk można zdefiniować te zmienne:

# 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

Aby wygenerować pliki XML manifestu platformy, wykonywane są te polecenia (w systemie kompilacji, zmodyfikowane w celu pominięcia szczegółów implementacji):

# 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

W czasie działania obiekt VINTF łączy manifest systemu, fragmenty manifestu systemu, manifest produktu i fragmenty manifestu produktu jako manifest platformy. Więcej informacji znajdziesz w pliku manifestu.

Przykład: generowanie plików XML macierzy zgodności platformy na podstawie zmiennych

device/manufacturer/device_name/BoardConfig.mk można zdefiniować te zmienne, aby określić FCM produktu i systemowy FCM urządzenia:

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

Usługa FCM system_ext musi być zainstalowana za pomocą modułów Soong. Moduł FCM produktu można też zainstalować za pomocą modułów Soong. Jeśli używasz tej metody, nie definiuj DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE. Dodatkowo można zainstalować wiele wersji FCM produktu i wiele wersji FCM system_ext za pomocą modułów Soong. Zdefiniuj te elementy:

  • Zdefiniuj moduł w usłudze device/manufacturer/device_name/Android.bp. Na przykład (zastąp system_ext słowem product w przypadku FCM dla produktu):
    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",
        ],
    }
  • Zainstaluj moduł w device/manufacturer/device_name/device.mk. Przykład:
    PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml

Aby wygenerować pliki XML macierzy zgodności platformy, wykonywane są te polecenia (w systemie kompilacji, zmodyfikowane w celu pominięcia szczegółów implementacji):

# 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

W czasie działania obiekt VINTF łączy podzbiór macierzy zgodności systemu i macierzy zgodności produktu jako macierz zgodności platformy. Szczegóły znajdziesz w macierzy zgodności platform.

Przykład: Wygeneruj plik manifestu dostawcy z fragmentów

Podczas kompilacji można połączyć wiele fragmentów pliku manifestu dostawcy. Przykład:

<!-- 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

Następnie assemble_vintf dodaje IR HAL do manifestu dostawcy, jeśli zdefiniowano parametr BOARD_ENABLE_IR, i pomija go, jeśli parametr BOARD_ENABLE_IR nie jest zdefiniowany. Aby wygenerować plik manifestu dostawcy, wykonaj te polecenia (zmodyfikowane w celu pominięcia szczegółów implementacji):

# 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

Szczegółowe informacje znajdziesz w następujących artykułach:

assemble_vintf --help

Testowanie

Projekt platform/system/libvintf używa GTest do serializacji, deserializacji i sprawdzania zgodności.

Licencjonowanie

  • tinyxml2 (external/tinyxml2) do serializacji i deserializacji obiektu do/z XML. licencji podobnej do BSD.
  • libselinux (external/selinux/libselinux) do pobierania wersji policydb. Licencja domeny publicznej.
  • libz (external/zlib) do dekompresji/proc/config.gz. licencji podobnej do BSD.
  • libvintf projekt korzysta z licencji Apache 2.0 (z odpowiednimi plikami MODULE_LICENSE_APACHE2 i NOTICE);