資訊清單

VINTF 物件匯總來自裝置、 資訊清單架構資訊清單檔案 (XML)。兩者皆有 資訊清單會共用一種格式,但並非所有元素都適用於這兩個元素 (詳情請參閱 請參閱資訊清單檔案結構定義)。

裝置資訊清單

裝置資訊清單 (由裝置提供) 包含供應商資訊清單 和 ODM 資訊清單

  • 供應商資訊清單指定了與 SoC 共用的 HAL 和 SELinux 政策版本等。這項服務 建議放在 device/VENDOR/DEVICE/manifest.xml,但多個片段 檔案。詳情請參閱資訊清單片段產生 來自片段的即時訊息
  • ODM 資訊清單會列出 ODM 分區。 VINTF 物件會以下列順序載入 ODM 資訊清單:
    1. 如果已定義 SKU (其中 SKUro.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 (其中 SKUro.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 結合在一起 資訊清單片段
    3. /vendor/manifest.xml (舊版,無片段)
    4. 最後,合併來自任何供應商 APEX 的資訊清單片段。

    請注意:

    • 在舊版裝置上,則會使用舊版供應商資訊清單和 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
  • 產品資訊清單 (由裝置提供) 會列出 產品劃分。
  • 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 分區。如果安裝 ID 是 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>

如果 HAL 模組封裝在供應商 APEX 中, 將相關 VINTF 片段封裝在與 prebuilt_etc 相同的 APEX 中, 相關說明請參閱 VINTF 片段

資訊清單檔案結構定義

本節說明這些 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
選用。僅適用於架構資訊清單。如已設定,最高等級的 HAL 版本資訊清單中的目標 FCM 版本已停用。
manifest.hal.override
選用。該值可以是下列其中一個:
  • true:使用以下項目覆寫其他 <hal> 元素: 請務必使用相同的 <name> 和主要版本如果答案為「否」 <version><fqname>已加入 <hal> 元素,然後是 <hal> 元素 宣告要停用這個 HAL。
  • false:不要覆寫其他 <hal> 元素 並搭配相同的 <name> 和主要版本。
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:64 位元模式
  • 32+64:兩者皆是
manifest.hal.transport.ip
inet 為必要欄位,不得用於其他用途。說明 IP 位址 取得該來源的遠端介面內容
manifest.hal.transport.port
inet 為必要欄位,不得用於其他用途。說明通訊埠 遠端介面的可用性
manifest.hal.version
選用,可以重複播放。以下項目中的 hal 標記版本: 資訊清單。

如果是 HIDL 和原生 HAL,則格式為 MAJOR.MINOR。適用對象 範例,請參閱 hardware/interfaces vendor/${VENDOR}/interfaces, frameworks/hardware/interfaces,或 system/hardware/interfaces

HIDL 和原生 HAL 可以使用多個版本欄位,只要它們代表 不同的主要版本,每個主要版本只有一個子版本 版本。舉例來說,3.1 和 3.2 無法同時存在,但 1.0 和 3.4 可以。 這項設定會套用至所有同名的 hal 元素,除非是 override="true"<version> 的值不是 與 <fqname> 相關聯,因為<fqname> 都有一個版本

如果是 AIDL HAL,<version> 不得包含在執行中的裝置上 Android 11 以下版本。<version>必須是 單一整數。 每個項目最多只能有一個 <version> (package, interface, instance) 元組。如未顯示,則預設為 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
必要。內含所有與這項政策相關的項目。
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。詳情請見 核心比對規則