Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

清單

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
  • VINTF對象按以下順序加載設備清單:
    1. 如果存在/vendor/etc/vintf/manifest.xml ,請結合以下內容:
      1. /vendor/etc/vintf/manifest.xml
      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>
        <fqname>ILights/default</fqname>
    </hal>
    <hal format="aidl">
        <name>android.hardware.power</name>
        <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>
    <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
需要。此清單的類型。它具有價值device的設備清單文件和framework該框架清單文件。
manifest.target-level
設備清單必需。指定此設備清單要與之兼容的框架兼容性矩陣(FCM)版本。這也稱為設備的出廠FCM版本。
manifest.hal
可選,可以重複。單個HAL(HIDL或本地語言,例如GL),具體取決於format屬性。
manifest.hal.format
可選的。該值可以是以下之一:
  • hidl :HIDL HAL。這是默認值。
  • aidlAIDL HAL 。僅在manifest meta-version 2.0及更高版本中有效。
  • native :本地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.transport.arch
所需的passthrough ,必須不存在對hwbinder 。描述所提供的直通服務的位數。該值可以是以下之一:
  • 32位模式
  • 64位模式
  • 32+64 :兩者
manifest.hal.version
可選,可以重複。清單中hal標籤的版本。格式為MAJOR . MINOR 。有關示例,請參閱hardware/interfacesvendor/${VENDOR}/interfacesframework/hardware/interfacessystem/hardware/interfaces

HIDL和本機HAL可以使用多個版本字段,只要它們表示不同的主要版本 (每個主要版本僅提供一個次要版本)即可。例如,3.1和3.2不能共存,但是1.0和3.4可以共存。這適用於所有具有相同名稱的hal元素,除非override="true"

對於AIDL HAL不能存在。使用<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 。有關詳細信息,請參見內核匹配規則