VINTF オブジェクトは、デバイス マニフェストおよびフレームワーク マニフェストのファイル(XML)からデータを取得します。この 2 つのマニフェストは同じ形式を持ちますが、すべての要素が両方に共通するわけではありません(スキーマの詳細については、マニフェスト ファイルのスキーマをご覧ください)。
デバイス マニフェスト
デバイス マニフェスト(デバイスが提供)は、ベンダー マニフェストと ODM マニフェストで構成されます。
- ベンダー マニフェストでは、SoC に共通する HAL や SELinux ポリシー バージョンなどを指定します。
device/VENDOR/DEVICE/manifest.xml
の Android ソースツリーに配置することが推奨されますが、複数のフラグメント ファイルを使用することもできます。詳細については、マニフェスト フラグメントとフラグメントから DM を生成するをご覧ください。 - ODM マニフェストの ODM パーティションには、プロダクトに固有の HAL のリストが含まれます。VINTF オブジェクトは、次の順序で ODM マニフェストを読み込みます。
SKU
(SKU
はプロパティro.boot.product.hardware.sku
の値)が定義されている場合は、/odm/etc/vintf/manifest_SKU.xml
/odm/etc/vintf/manifest.xml
SKU
が定義されている場合は、/odm/etc/manifest_SKU.xml
/odm/etc/manifest.xml
- ベンダー マニフェストのベンダー パーティションには、プロダクトに固有の HAL のリストが含まれます。VINTF オブジェクトは、次の順序でベンダー マニフェストを読み込みます。
SKU
(SKU
はプロパティro.boot.product.vendor.sku
の値)が定義されている場合は、/vendor/etc/vintf/manifest_SKU.xml
/vendor/etc/vintf/manifest.xml
- VINTF オブジェクトは、次の順序でデバイス マニフェストを読み込みます。
- ベンダー マニフェストが存在する場合は、以下を結合します。
- ベンダー マニフェスト
- オプションのベンダー マニフェスト フラグメント
- オプションの ODM マニフェスト
- オプションの ODM マニフェスト フラグメント
- 上記以外の場合は、ODM マニフェストが存在していれば、ODM マニフェストとオプションの ODM マニフェスト フラグメントを結合します。
/vendor/manifest.xml
(レガシー、フラグメントなし)- 最後に、ベンダー APEX のマニフェスト フラグメントを結合します。マニフェスト フラグメントは、各 APEX(
/apex/<apex name>/etc/vintf
など)のetc/vintf
ディレクトリから読み込まれます。
以下の点にご注意ください。
- レガシー デバイスでは、レガシーのベンダー マニフェストと、ODM マニフェストが使用されます。ODM マニフェストは、レガシーのベンダー マニフェストを完全にオーバーライドできます。
- Android 9 でリリースするデバイスでは、ODM マニフェストはベンダー マニフェストと結合されます。
- マニフェストのリストを結合する際に、リスト内の後続のマニフェストのタグに
override="true"
属性があれば、後続のマニフェストは先行のマニフェストのタグをオーバーライドできます。たとえば、ODM マニフェストは、ベンダー マニフェストの一部の<hal>
タグをオーバーライドできます。下記のoverride
属性のドキュメントをご覧ください。
- ベンダー マニフェストが存在する場合は、以下を結合します。
この設定では、同じボードの複数のプロダクトで同じベンダー イメージ(共通の HAL を提供する)を共有しつつ、異なる ODM イメージ(プロダクト固有の HAL をそれぞれ指定する)を持つことができます。
ベンダー マニフェストの例を次に示します。
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="2.0" type="device" target-level="1"> <hal> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.4</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> <instance>proprietary/0</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.0</version> <version>2.0</version> <interface> <name>INfc</name> <instance>nfc_nci</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <fqname>@2.0::INfc/default</fqname> </hal> <hal> <name>android.hardware.drm</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ICryptoFactory</name> <instance>default</instance> </interface> <interface> <name>IDrmFactory</name> <instance>default</instance> </interface> <fqname>@1.1::ICryptoFactory/clearkey</fqname> <fqname>@1.1::IDrmFactory/clearkey</fqname> </hal> <hal format="aidl"> <name>android.hardware.light</name> <version>1</version> <fqname>ILights/default</fqname> </hal> <hal format="aidl"> <name>android.hardware.power</name> <version>2</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> <hal format="native"> <name>EGL</name> <version>1.1</version> </hal> <hal format="native"> <name>GLES</name> <version>1.1</version> <version>2.0</version> <version>3.0</version> </hal> <sepolicy> <version>25.0</version> </sepolicy> </manifest>
ODM マニフェストの例を次に示します。
<?xml version="1.0" encoding=<"UTF-8"?> !-- Comments, Legal <notices, etc. here --> manifest version<="1.0" type="device"> !-- <camera 3.4 in vendor manifest< is ignored --> hal o<verride="t<rue"> < name>android.<hardware.ca<mera/name> < transport>hwbind<er/transport> < version>3.5</version> < interface> < name&<gt;ICamera<Provider/name> instance>l<egacy/0/instance> </interface> /hal&g<t; !-- NFC <is declared to be <disabled --> < hal ov<erride="<true"> name<>android.har<dware.nfc/name>< transport&g<t;hwbinder/<transport> </hal> hal> < name&<gt;android.hardware<.power/name> < transport&g<t;hwbinder/trans<port&g<t; version>1.1/version> interface> name>IPower/name> instance>default/instance> /interface> /hal> /manifest>
OTA パッケージ内のデバイス マニフェストの例を次に示します。
<?xml version="1.0" encoding=<"UTF-8"?> !-- Comments, Legal <notices, etc. here --> manifest version="1.0" <type="device" t<arget-level="1"> <!-- hals ommited --&<gt; kernel ver<sion="4.4.176<"&<gt; conf<ig> < key>CONFIG_ANDR<OID/key> < value>y</value&<gt; /con<fig> < config> key>C<ONFIG_ARM<64/key> value>y/value> /config> !-- other configs ommited --> /kernel> /manifest>
詳細については、デバイス マニフェストの開発をご覧ください。
フレームワーク マニフェスト
フレームワーク マニフェスト ファイルは、システム マニフェスト、プロダクト マニフェスト、system_ext マニフェストで構成されます。
- システム マニフェスト(Google が提供)は、手動で生成され、
/system/libhidl/manifest.xml
の Android ソースツリーに配置されます。 - プロダクト マニフェスト(デバイスが提供)は、プロダクト パーティションにインストールされたモジュールによって提供される HAL を一覧表示します。
- system_ext マニフェスト(デバイスが提供)には、次のリストがあります。
- system_ext パーティションにインストールされているモジュールによって提供される HAL。
- VNDK のバージョン。
- システム SDK のバージョン。
デバイス マニフェストと同様に、複数のフラグメント ファイルを使用できます。詳細については、マニフェスト フラグメントをご覧ください。
フレームワーク マニフェストの例を次に示します。
<?xml version="1.0" encoding=<"UTF-8"?> !-- Comments, Legal <notices, etc. here --> manifest version=&q<uot;1.0"< type="framework"<> hal><; name><android.hidl.allocat<or/name>< transport<>hwbinder/transport&<gt; ver<sion>1.0/version<> in<terface> < name>IAl<locator/na<me> < instance>ashmem</instance> < /interface> /hal>< hal> < name>an<droid.hidl.memory/<name> transp<ort arch=&qu<ot;32+64">p<assthrough/tran<sport> v<ersion>1.0/ve<rsion> < inter<face> name<>IMapper/nam<e> <instance>ashmem/i<nstance>< /interfac<e> /hal> <hal> name<>android.hidl.ma<nager/name> < transport><;hwbinder/transp<ort> < version<>1.0/version> interface<> < name>IService<Manager/name> < in<stance>default/<instance> /i<nterface> /h<al> hal> < name><android.frameworks.<sensorservice/na<me> < transport>hwbinder/<transport> version>1.0/ver<sion> < interface> < name>IS<ensorManage<r/name> < instance>defaul<t/instance> /inter<face> /hal&g<t; hal max-l<evel="5"&<gt; name<>androi<d.frameworks.schedul<erservice/<name> < transport>h<wbinder/transport><; <version>1.0</version> < interface> name>ISchedulingPolicyService/name> instance>default/instance> /interface> /hal> vendor-ndk> version>27/version> /vendor-ndk> system-sdk> version>27/version> /system-sdk> /manifest>
マニフェスト フラグメント
Android 10 以上では、マニフェスト エントリをビルドシステムの HAL モジュールに関連付けることができます。これにより、HAL モジュールをビルドシステムに条件付きで含めることが容易になります。
例
Android.bp
または Android.mk
ファイルで、vintf_fragments
をデバイスに明示的にインストールされている任意のモジュール(cc_binary
、rust_binary
など)に追加します。
たとえば、HAL の実装(my.package.foo@1.0-service-bar
)でモジュールを変更できます。
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
manifest_foo.xml
という名前のファイルで、このモジュール用のマニフェストを作成します。このマニフェストはビルド時にデバイスに追加されます。ここにエントリを追加するのは、デバイスのメイン マニフェストにエントリを追加するのと同じことです。これにより、クライアントはインターフェースを使用できるようになり、VTS はどの HAL 実装がデバイス上にあるかを識別できるようになります。さらに、このマニフェストは、通常のマニフェストと同じ機能も果たします。
以下の例では、vendor
または odm
パーティションにインストールされている android.hardware.foo@1.0::IFoo/default
を実装します。system
、product
、または system_ext
パーティションにインストールされている場合は、device
タイプではなく framework
タイプを使用します。
<manifest version="1.0" type=&quo<t;device"> hal <format="hidl"&g<t; name<>android.hardwa<re.foo/name> < transport>hwbinder</transport><; < fqname>@1.0::IFoo/default/fqname> /hal> /manifest>
HAL モジュールがベンダー APEX にパッケージ化されている場合、その関連付けられた VINTF フラグメントを prebuilt_etc
を使用して同じ APEX 内にパッケージ化してください(VINTF フラグメントを参照)。
マニフェスト ファイルのスキーマ
このセクションでは、下記の XML タグの意味について説明します。「必須」タグの一部は Android ソースツリーのソースファイルに存在せず、ビルド時に assemble_vintf
によって書き込まれる場合があります。必須タグは、デバイス上の対応するファイル内に存在する必要があります。
?xml
- オプション。単に XML パーサーに情報を提供します。
manifest.version
- 必須。このマニフェストのメタバージョン。マニフェストに存在することが期待される要素を記述します。XML バージョンとは無関係です。
manifest.type
- 必須。このマニフェストのタイプ。値は、デバイス マニフェスト ファイルの場合は
device
、フレームワーク マニフェスト ファイルの場合はframework
です。 manifest.target-level
- デバイス マニフェストでは必須。このデバイス マニフェストが互換性を持つ必要があるフレームワーク互換性マトリックス(FCM)バージョンを指定します。デバイスの Shipping FCM バージョンとも呼ばれます。
manifest.hal
- 省略可。繰り返し指定できます。
format
属性に応じた単一の HAL(HIDL HAL、または GL などのネイティブ HAL)。 manifest.hal.format
- オプション。次のいずれかの値を指定できます。
hidl
: HIDL HAL。これがデフォルトです。aidl
: AIDL HAL。マニフェスト メタバージョン 2.0 以降でのみ有効です。native
: ネイティブ HAL。
manifest.hal.max-level
- オプション。フレームワーク マニフェストでのみ有効です。設定した場合、最大レベルがフレームワーク マニフェストのターゲット FCM バージョンよりも低い HAL は無効になります。
manifest.hal.override
- オプション。次のいずれかの値を指定できます。
true
:<name>
とメジャー バージョンが同じである他の<hal>
要素をオーバーライドします。この<hal>
要素に<version>
または<fqname>
がない場合、<hal>
要素はこの HAL を無効と宣言します。false
:<name>
とメジャー バージョンが同じである他の<hal>
要素をオーバーライドしません。
manifest.hal.name
- 必須。HAL の完全修飾パッケージ名。複数の HAL エントリで同じ名前を使用できます。例:
android.hardware.camera
(HIDL または AIDL HAL)GLES
(ネイティブ HAL、名前のみ必要)
manifest.hal.transport
manifest.hal.format == "hidl"
の場合は必須。それ以外の場合は指定不可です。このパッケージのインターフェースがサービス マネージャーからクエリされるときに使用されるトランスポートを指定します。次のいずれかの値を指定できます。hwbinder
: バインダ化モードpassthrough
: パススルー モード
manifest.hal.format == "aidl"
の場合は省略可、それ以外の場合は指定不可です。インターフェースがリモートで配信されるときに使用されるトランスポートを指定します。値には以下を指定する必要があります。inet
: Inet ソケット
manifest.hal.transport.ip
とmanifest.hal.transport.port
を使用する必要があります。manifest.hal.transport.arch
passthrough
モードでは必須、hwbinder
モードでは指定不可です。提供されるパススルー サービスのビットを指定します。次のいずれかの値を指定できます。32
: 32 ビットモード64
: 64 ビットモード32+64
: 両方
manifest.hal.transport.ip
inet
モードでは必須、それ以外では指定不可です。リモート インターフェースの配信元の IP アドレスを指定します。manifest.hal.transport.port
inet
モードでは必須、それ以外では指定不可です。リモート インターフェースの配信元のポートを指定します。manifest.hal.version
- 省略可。繰り返し指定できます。マニフェスト内の
hal
タグのバージョン。
HIDL HAL とネイティブ HAL の形式はMAJOR.MINOR
です。例については、hardware/interfaces
、vendor/${VENDOR}/interfaces
、frameworks/hardware/interfaces
、system/hardware/interfaces
をご覧ください。
HIDL HAL とネイティブ HAL は、重複しないメジャー バージョンを表す複数のバージョン フィールドを使用でき、メジャー バージョンごとにマイナー バージョンを 1 つだけ指定できます。たとえば、3.1 と 3.2 は共存できませんが、1.0 と 3.4 は共存できます。これは、override="true"
でなければ、同じ名前を持つすべてのhal
要素に適用されます。<version>
の値は<fqname>
に関連付けられていません。<fqname>
がバージョンを提供しているためです。
Android 11 以前を搭載したデバイスでは、AIDL HAL で<version>
を指定することはできません。Android 12 以降を搭載しているデバイスでは<version>
は 1 つの整数にする必要があります。(package, interface, instance)
タプルごとに<version>
を 1 つだけ指定できます。指定されていない場合、デフォルトで1
になります。<version>
の値は同じ<hal>
のすべての<fqname>
に関連付けられています。<fqname>
がバージョンを提供していないためです。 manifest.hal.interface
- 必須。重複なしで繰り返し指定できます。インスタンス名を持つパッケージ内のインターフェースを指定します。
<hal>
内に複数の<interface>
要素を記述できますが、重複しない名前にする必要があります。 manifest.hal.interface.name
- 必須。インターフェースの名前。
manifest.hal.interface.instance
- 必須。繰り返し指定できます。インターフェースのインスタンス名。インターフェースごとに複数のインスタンスを指定できますが、
<instance>
要素の重複は不可です。 manifest.hal.fqname
- 省略可。繰り返し指定できます。
manifest.hal.name
という名前の HAL のインスタンスを指定する別の方法。- HIDL HAL の形式は
@MAJOR.MINOR::INTERFACE/INSTANCE
です。 - AIDL HAL の形式は
INTERFACE/INSTANCE
です。
- HIDL HAL の形式は
manifest.sepolicy
- 必須。sepolicy 関連のすべてのエントリを含みます。
manifest.sepolicy.version
- デバイス マニフェストでは必須。SELinux バージョンを宣言します。形式は
SDK_INT.PLAT_INT
です。 manifest.vendor-ndk
- 必須で、繰り返し指定できます。フレームワーク マニフェストでは必要ですが、デバイス マニフェストでは指定不可です。複数の
<vendor-ndk>
エントリは異なる<version>
を持つ必要があります。フレームワークによって提供される VNDK スナップショットのセットを記述します。 manifest.vendor-ndk.version
- 必須。VNDK スナップショットのバージョンを表す正の整数です。
manifest.vendor-ndk.library
- オプション。重複なしで繰り返し指定できます。フレームワークがこの VNDK ベンダー スナップショット用に提供する VNDK ライブラリのセットを記述します。値はライブラリのファイル名(
libjpeg.so
など)で、プレフィックスlib
とサフィックス.so
を含みます。パス コンポーネントは指定できません。 manifest.system-sdk.version
- 省略可。重複なしで繰り返し指定できます。フレームワーク マニフェストでのみ使用されます。フレームワークがベンダーアプリに提供する System SDK バージョンのセットを記述します。
manifest.kernel
- オプション。カーネルに関する静的情報を記述します。
manifest.kernel.target-level
- オプション。カーネル ブランチを記述します。存在しない場合のデフォルト値は
manifest.target-level
です。manifest.target-level
以上の値を指定する必要があります。詳細については、カーネルのマッチング ルールをご覧ください。