資訊清單

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 清單(由設備提供)列出了以下內容:
    • HAL 由安裝在 system_ext 分割區上的模組提供服務;
    • 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分區,請使用類型framework而不是類型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
必需的。此清單的類型。它具有設備清單檔案的值device和框架清單檔案的framework
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位元模式
  • 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 及更低版本的裝置上。在運行 Android 12 及更高版本的裝置上, <version>必須是單一整數。每個(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 。有關詳細信息,請參閱內核匹配規則