参考情報

以下のリソースでは、コードの場所、ツール、テスト、ライセンスの詳細情報を掲載しています。

クエリ可能なコードの場所

クエリ可能なベンダー インターフェース オブジェクトのコードは system/libvintf に送信されます。

マニフェスト ファイルと互換性マトリックスを手動で作成するのは容易ではありません。以下のツールを使用すると、ボイラープレートのマニフェスト / 互換性マトリックスを生成して作業を開始できます。

LSHAL

LSHAL は、デバイス上の hwservicemanager および使用可能なすべてのパススルー実装(android.hardware.foo@1.0-impl.so など)に登録済み HAL をリストする、デバイス側のツールです。リストに基づいてデバイス マニフェスト ファイルを生成することもできます。

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

注:

  1. パッケージが hwservicemanager に登録され、かつパススルー HAL として検出された場合、<transport>hwbinder に設定されます。
  2. SELinux バージョンはマニフェストに書き込まれないため、下記で説明するように、assemble_vintf を使用して挿入することをおすすめします。
  3. 生成される HAL マニフェスト ファイルは不正確な場合があります。デバイス マニフェストと、vendor.img が実際に提供するものとの不整合を修正するには、人による確認が必要です。

ASSEMBLE_VINTF

assemble_vintf は、以下の機能を持つホスト側ツールです。

  1. 互換性マトリックスまたはマニフェスト ファイルが有効かどうかを検証します。
  2. ビルド時に使用可能なマニフェスト / 互換性マトリックスに変数を挿入して、デバイスにインストールする必要がある新しいファイルを生成します。
  3. 生成されたファイルと、それと対になるファイルの互換性をチェックします。
  4. マニフェスト ファイルがある場合は、必要であればそのマニフェスト ファイルに対応したボイラープレートの互換性マトリックスを生成します。

例: フレームワーク マニフェスト ファイルからデバイス互換性マトリックスを生成する

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 ファイルを含む)を使用します。