マニフェスト

VINTF オブジェクトは、デバイス マニフェストおよびフレームワーク マニフェストのファイル(XML)からデータを取得します。この 2 つのマニフェストは同じ形式を持ちますが、すべての要素が両方に共通するわけではありません(スキーマの詳細については、マニフェスト ファイルのスキーマをご覧ください)。

デバイス マニフェスト

デバイス マニフェスト(デバイスが提供)は、ベンダー マニフェストと ODM マニフェストで構成されます。

  • ベンダー マニフェストでは、SoC に共通する HAL や SELinux ポリシー バージョンなどを指定します。device/VENDOR/DEVICE/manifest.xml の Android ソースツリーに配置することが推奨されますが、複数のフラグメント ファイルを使用することもできます。詳細については、マニフェスト フラグメントフラグメントから DM を生成するをご覧ください。
  • ODM マニフェストの ODM パーティションには、プロダクトに固有の HAL のリストが含まれます。VINTF オブジェクトは、次の順序で ODM マニフェストを読み込みます。
    1. SKUSKU はプロパティ ro.boot.product.hardware.sku の値)が定義されている場合は、/odm/etc/vintf/manifest_SKU.xml
    2. /odm/etc/vintf/manifest.xml
    3. SKU が定義されている場合は、/odm/etc/manifest_SKU.xml
    4. /odm/etc/manifest.xml
  • ベンダー マニフェストのベンダー パーティションには、プロダクトに固有の HAL のリストが含まれます。VINTF オブジェクトは、次の順序でベンダー マニフェストを読み込みます。
    1. SKUSKU はプロパティ ro.boot.product.vendor.sku の値)が定義されている場合は、/vendor/etc/vintf/manifest_SKU.xml
    2. /vendor/etc/vintf/manifest.xml
  • VINTF オブジェクトは、次の順序でデバイス マニフェストを読み込みます。
    1. ベンダー マニフェストが存在する場合は、以下を結合します。
      1. ベンダー マニフェスト
      2. オプションのベンダー マニフェスト フラグメント
      3. オプションの ODM マニフェスト
      4. オプションの ODM マニフェスト フラグメント
    2. 上記以外の場合は、ODM マニフェストが存在していれば、ODM マニフェストとオプションの ODM マニフェスト フラグメントを結合します。
    3. /vendor/manifest.xml(レガシー、フラグメントなし)

    以下の点にご注意ください。

    • レガシー デバイスでは、レガシーのベンダー マニフェストと、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 override="true">
        <name>android.hardware.camera</name>
        <transport>hwbinder</transport>
        <version>3.5</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>legacy/0</instance>
        </interface>
    </hal>
    <!-- NFC is declared to be disabled -->
    <hal override="true">
        <name>android.hardware.nfc</name>
        <transport>hwbinder</transport>
    </hal>
    <hal>
        <name>android.hardware.power</name>
        <transport>hwbinder</transport>
        <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" target-level="1">
    <!-- hals ommited -->
    <kernel version="4.4.176">
        <config>
            <key>CONFIG_ANDROID</key>
            <value>y</value>
        </config>
        <config>
            <key>CONFIG_ARM64</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="1.0" type="framework">
    <hal>
        <name>android.hidl.allocator</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IAllocator</name>
            <instance>ashmem</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hidl.memory</name>
        <transport arch="32+64">passthrough</transport>
        <version>1.0</version>
        <interface>
            <name>IMapper</name>
            <instance>ashmem</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hidl.manager</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IServiceManager</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal>
        <name>android.frameworks.sensorservice</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>ISensorManager</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal max-level="5">
        <name>android.frameworks.schedulerservice</name>
        <transport>hwbinder</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 を任意のモジュールに追加します。たとえば、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 を実装します。systemproduct、または system_ext パーティションにインストールされている場合は、device タイプではなく framework タイプを使用します。

<manifest version="1.0" type="device">
    <hal format="hidl">
        <name>android.hardware.foo</name>
        <transport>hwbinder</transport>
        <fqname>@1.0::IFoo/default</fqname>
    </hal>
</manifest>

マニフェスト ファイルのスキーマ

このセクションでは、下記の 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 ソケット
Inet 接続情報をさらに指定するには、manifest.hal.transport.ipmanifest.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/interfacesvendor/${VENDOR}/interfacesframeworks/hardware/interfacessystem/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 です。
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 以上の値を指定する必要があります。詳細については、カーネルのマッチング ルールをご覧ください。