清單

VINTF 對象聚合來自設備清單框架清單文件 (XML) 的數據。兩個清單共享一種格式,但並非所有元素都適用於兩者(有關架構的詳細信息,請參閱清單文件架構)。

設備清單

設備清單(由設備提供)由供應商清單和 ODM 清單組成。

  • 供應商清單指定 SoC 通用的 HAL、SELinux 策略版本等。建議放在 Android 源碼樹device/ VENDOR / DEVICE /manifest.xml中,但可以使用多個片段文件。有關詳細信息,請參閱清單片段從片段生成 DM
  • ODM 清單列出了特定於ODM 分區中產品的 HAL。 VINTF 對象按以下順序加載 ODM 清單:
    1. 如果定義了SKU SKU屬性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. 如果定義了SKU SKU屬性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 提供)是手動生成的,位於 Android 源代碼樹的/system/libhidl/manifest.xml中。
  • 產品清單(由設備提供)列出了安裝在產品分區上的模塊所服務的 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.bpAndroid.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 實現。常規清單所做的任何事情,此清單也可以。

下面的示例實現了android.hardware.foo@1.0::IFoo/default ,它被安裝到vendorodm分區。如果它安裝到systemproductsystem_ext分區,請使用 type framework而不是 type device

<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
必需的。此清單的類型。它具有設備清單文件的價值deviceframework清單文件的框架。
manifest.target-level
設備清單所必需的。指定此設備清單旨在與之兼容的框架兼容性矩陣 (FCM) 版本。這也稱為設備的發貨 FCM 版本。
manifest.hal
可選,可以重複。單個 HAL(HIDL 或本機,例如 GL),具體取決於format屬性。
manifest.hal.format
可選的。該值可以是以下之一:
  • hidl :HIDL HAL。這是默認設置。
  • aidlAIDL 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.ipmanifest.hal.transport.port必須用於進一步指定 Inet 連接信息。
manifest.hal.transport.arch
passthrough是必需的,並且不能出現在hwbinder中。描述所提供的直通服務的位數。該值可以是以下之一:
  • 32 : 32 位模式
  • 64位模式
  • 32+64 : 兩者
manifest.hal.transport.ip
對於inet是必需的,否則不得存在。描述提供遠程接口的 IP 地址。
manifest.hal.transport.port
對於inet是必需的,否則不得存在。描述提供遠程接口的端口。
manifest.hal.version
可選,可以重複。清單中hal標記的版本。

對於 HIDL 和本機 HAL,格式為MAJOR . MINOR的。例如,請參閱hardware/interfacesvendor/${VENDOR}/interfacesframeworks/hardware/interfacessystem/hardware/interfaces

HIDL 和本機 HAL 可以使用多個版本字段,只要它們代表不同的主要版本,每個主要版本只提供一個次要版本。例如,3.1 和 3.2 不能共存,但 1.0 和 3.4 可以。這適用於所有同名的hal元素,除非override="true"<version>的值與<fqname>沒有關聯,因為<fqname>帶有版本。

對於 AIDL HAL, <version>不得出現在運行 Android 11 及更低版本的設備上。 <version>在運行 Android 12 及更高版本的設備上必須是單個整數。每個(package, interface, instance)元組最多只能有一個<version> 。如果不存在,則默認為1<version>的值與同一<hal>中的所有<fqname>相關聯,因為<fqname>不攜帶版本。
manifest.hal.interface
必需,可以重複而不重複。在包中聲明一個具有實例名稱的接口。 <hal>中可以有多個<interface>元素;名稱必須不同。
manifest.hal.interface.name
必需的。接口名稱。
manifest.hal.interface.instance
必填,可以重複。接口的實例名稱。一個接口可以有多個實例,但不能有重複的<instance>元素。
manifest.hal.fqname
可選,可以重複。為 HAL 指定名稱為manifest.hal.name的實例的另一種方法。
  • 對於 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
可選,可重複,不重複;僅由框架清單使用。描述框架提供給供應商應用的一組系統 SDK 版本。
manifest.kernel
可選的。描述有關內核的靜態信息。
manifest.kernel.target-level
可選的。描述內核分支。如果不存在,其值默認為manifest.target-level 。必須大於或等於manifest.target-level 。有關詳細信息,請參閱內核匹配規則