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.
Narzędzia
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:
- Jeśli pakiet jest zarejestrowany w
hwservicemanageri znajduje się w HAL-u przekazywania, wartość<transport>jest ustawiona nahwbinder. - W pliku manifestu nie ma informacji o wersji SELinux. Zalecamy wstawianie elementu za pomocą
assemble_vintfw sposób opisany poniżej. - 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:
- Sprawdza, czy macierz zgodności lub plik manifestu są prawidłowe.
- 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.
- Sprawdza zgodność wygenerowanego pliku z jego odpowiednikiem.
- 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
W 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.libvintfprojekt korzysta z licencji Apache 2.0 (z odpowiednimi plikami MODULE_LICENSE_APACHE2 i NOTICE);