資訊清單

VINTF 物件會匯總來自裝置資訊清單架構資訊清單檔案 (XML) 的資料。兩個資訊清單共用相同格式,但並非所有元素都適用於兩者 (如需瞭解架構的詳細資訊,請參閱「資訊清單檔案架構」)。

裝置資訊清單

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

  • 供應商資訊清單會指定 SoC 常見的 HAL、SELinux 政策版本等。建議將其放在 device/VENDOR/DEVICE/manifest.xml 的 Android 來源樹狀結構中,但也可以使用多個區塊檔案。詳情請參閱「資訊清單片段」和「從片段產生 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 (舊版,無片段)
    4. 最後,請將任何供應商 APEX 的資訊清單片段合併。資訊清單片段會從每個 APEX 的 etc/vintf 目錄 (例如 /apex/<apex name>/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 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.bpAndroid.mk 檔案中,將 vintf_fragments 新增至裝置上明確安裝的任何模組,例如 cc_binaryrust_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 實作項目。這個資訊清單可執行一般資訊清單的所有功能。

以下範例會導入 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>

如果 HAL 模組已封裝在供應商 APEX 中,請使用 prebuilt_etc 在同一個 APEX 中封裝相關的 VINTF 片段,如VINTF 片段所述。

資訊清單檔案架構

本節將說明這些 XML 標記的意義。在 Android 來源樹狀結構的來源檔案中,可能會缺少部分「必要」標記,並在建構時由 assemble_vintf 寫入。裝置上的對應檔案必須包含必要標記。

?xml
選用。僅向 XML 剖析器提供資訊。
manifest.version
必填。這個資訊清單的元資料版本。說明資訊清單中預期的元素。與 XML 版本無關。
manifest.type
必填。這個資訊清單的類型。這個值的值為 device (裝置資訊清單檔案) 和 framework (架構資訊清單檔案)。
manifest.target-level
裝置資訊清單必填屬性。指定這個裝置資訊清單指定的架構相容性矩陣 (FCM) 版本。這也稱為裝置的 FCM 出貨版本。
manifest.hal
選用,可重複。視 format 屬性而定,單一 HAL (HIDL 或原生,例如 GL)。
manifest.hal.format
選用。值可以是下列其中一個:
  • hidl:HIDL HAL。這是預設值。
  • aidlAIDL HAL。僅適用於資訊清單元資料版本 2.0 以上。
  • native:原生 HAL。
manifest.hal.max-level
選用。僅適用於架構資訊清單。如果設為啟用,則會停用 HAL,因為其最高層級低於架構資訊清單中的目標 FCM 版本。
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:Binderized 模式
  • 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/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
選用,可重複。指定名為 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
選用,可重複,但不得重複;僅供架構資訊清單使用。說明架構提供給供應商應用程式的一組系統 SDK 版本。
manifest.kernel
選用。說明核心的靜態資訊。
manifest.kernel.target-level
選用。說明核心分支。如未提供,則預設值為 manifest.target-level。必須大於或等於 manifest.target-level。詳情請參閱核心比對規則