以下のリソースでは、コードの場所、ツール、テスト、ライセンスの詳細情報を掲載しています。
クエリ可能なコードの場所
クエリ可能なベンダー インターフェース オブジェクトのコードは system/libvintf
にあります。
ツール
マニフェスト ファイルと互換性マトリックスを手動で作成するのは容易ではありません。以下のツールを使用すると、ボイラープレートのマニフェスト / 互換性マトリックスを生成して作業を開始できます。
LSHAL
LSHAL は、デバイス上の hwservicemanager
に登録されているすべての HAL と、使用可能なすべてのパススルー実装(android.hardware.foo@1.0-impl.so
など)をリストするデバイス側のツールです。リストに基づいてデバイス マニフェスト ファイルを生成することもできます。
adb shell su 0 /system/bin/lshal --init-vintf
注:
- パッケージが
hwservicemanager
に登録され、かつパススルー HAL として検出された場合、<transport>
はhwbinder
に設定されます。 - SELinux バージョンはマニフェストに書き込まれないため、下記で説明するように、
assemble_vintf
を使用して挿入することをおすすめします。 - 生成される HAL マニフェスト ファイルは不正確な場合があります。デバイス マニフェストと、
vendor.img
が実際に提供するものとの不整合を修正するには、人による確認が必要です。
ASSEMBLE_VINTF
assemble_vintf
は、以下の機能を持つホスト側ツールです。
- 互換性マトリックスまたはマニフェスト ファイルが有効かどうかを検証します。
- ビルド時に使用可能な変数をマニフェスト / 互換性マトリックスに挿入して、デバイスにインストールする必要がある新しいファイルを生成します。
- 生成されたファイルと、それと対になるファイルの互換性をチェックします。
- マニフェスト ファイルがある場合は、必要であればそのマニフェスト ファイルに対応したボイラープレートの互換性マトリックスを生成します。
例: フレームワーク マニフェスト ファイルからデバイス互換性マトリックスを生成する
assemble_vintf -m --hals-only \ -i system/libhidl/manifest.xml \ -o device/manufacturer/device_name/compatibility_matrix.xml
すべての HAL が optional="true"
に設定されることにご注意ください。
例: デバイス マニフェスト ファイルからフレームワーク互換性マトリックスのスケルトンを生成する
assemble_vintf -m --hals-only \ -i device/foo/bar/manifest.xml \ -o path/to/place/output/compatibility_matrix.xml
すべての HAL が optional="true"
に設定されることにご注意ください。
例: 変数からデバイス マニフェストの XML ファイルを生成する
ビルド時に、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
この場合、以下のコマンドが実行され(ビルドシステムで、実装の詳細は省略するように変更されています)、デバイス マニフェストの XML ファイルを生成します。
# 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
実行時に、VINTF オブジェクトは、ベンダー マニフェストと ODM マニフェストをデバイス マニフェストとして結合します。詳しくは、デバイス マニフェストをご覧ください。
例: 変数からデバイス互換性マトリックスの XML ファイルを生成する
ビルド時に、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
この場合、以下のコマンドが実行され(ビルドシステムで、実装の詳細は省略するように変更されています)、デバイス互換性マトリックスの XML ファイルを生成します。
# 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
実行時に、VINTF オブジェクトは、ベンダー互換性マトリックスをデバイス互換性マトリックスとして使用します。詳しくは、デバイス互換性マトリックスをご覧ください。
例: 変数からフレームワーク マニフェストの XML ファイルを生成する
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
この場合、以下のコマンドが実行され(ビルドシステムで、実装の詳細は省略するように変更されています)、フレームワーク マニフェストの XML ファイルを生成します。
# 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
実行時に、VINTF オブジェクトは、システム マニフェスト、システム マニフェスト フラグメント、プロダクト マニフェスト、プロダクト マニフェスト フラグメントをフレームワーク マニフェストとして結合します。詳しくは、フレームワーク マニフェストをご覧ください。
例: 変数からフレームワーク互換性マトリックスの XML ファイルを生成する
device/manufacturer/device_name/BoardConfig.mk
で次の変数を定義して、プロダクト FCM とデバイス固有のシステム FCM を定義できます。
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
system_ext FCM は Soong モジュールとともにインストールする必要があります。プロダクト FCM は Soong モジュールとともにインストールすることもできます。このメソッドを使用する場合は、DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE
を定義しないでください。さらに、複数のプロダクト FCM バージョンと system_ext FCM バージョンを Soong モジュールとともにインストールできます。以下の内容を定義します。
-
device/manufacturer/device_name/Android.bp
でモジュールを定義します。例(system_ext をプロダクト FCM のプロダクトに置き換えます):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", ], }
-
モジュールを
device/manufacturer/device_name/device.mk
にインストールします。次に例を示します。PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml
この場合、以下のコマンドが実行され(ビルドシステムで、実装の詳細を省略するように変更されます)、フレームワーク互換性マトリックスの XML ファイルを生成します。
# 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
実行時に、VINTF オブジェクトは、システム互換性マトリックスとプロダクト互換性マトリックスのサブセットをフレームワーク互換性マトリックスとして結合します。詳しくは、フレームワーク互換性マトリックスをご覧ください。
例: フラグメントからベンダー マニフェストを生成する
ビルド時に、複数のベンダー マニフェスト フラグメントをバンドルできます。次に例を示します。
<!-- 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
この場合、assemble_vintf
は、BOARD_ENABLE_IR
が定義されていればベンダー マニフェストに IR HAL を追加し、BOARD_ENABLE_IR
が定義されていなければそれを省略します。以下のコマンドが実行され(実装の詳細は省略するように変更されています)、ベンダー マニフェストを生成します。
# 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
詳しくは以下のページをご覧ください:
assemble_vintf --help
テスト
platform/system/libvintf
プロジェクトは、GTest を使用してシリアル化、シリアル化解除、互換性チェックを行います。
ライセンス
tinyxml2
(external/tinyxml2): オブジェクトを XML にシリアル化または XML からシリアル化解除します。BSD に似たライセンスです。libselinux
(external/selinux/libselinux): policydb バージョンを取得します。パブリック ドメインのライセンスです。libz
(external/zlib):/proc/config.gz
を解凍します。BSD に似たライセンスです。libvintf
プロジェクトは Apache 2.0 ライセンス(適切な MODULE_LICENSE_APACHE2 および NOTICE ファイルを含む)を使用します。