A VINTF object aggregates data from device manifest and framework manifest files (XML). Both manifests share a format, although not all elements apply to both (for details on the schema, see Manifest file schema).
Device manifest
The device manifest (provided by the device) consists of the vendor manifest and the ODM manifest.
- The vendor manifest specifies HALs, SELinux policy versions, etc. common to an SoC. It
is recommended to be placed in the Android source tree at
device/VENDOR/DEVICE/manifest.xml
, but multiple fragment files can be used. For details, see Manifest fragments and Generate DM from fragments. - The ODM manifest lists HALs specific to the product in the
ODM partition.
The VINTF object loads the ODM manifest in this order:
- If
SKU
is defined (whereSKU
is the value of the propertyro.boot.product.hardware.sku
),/odm/etc/vintf/manifest_SKU.xml
/odm/etc/vintf/manifest.xml
- If
SKU
is defined,/odm/etc/manifest_SKU.xml
/odm/etc/manifest.xml
- If
- The vendor manifest lists HALs specific to the product in the vendor partition.
The VINTF object loads the vendor manifest in this order:
- If
SKU
is defined (whereSKU
is the value of the propertyro.boot.product.vendor.sku
),/vendor/etc/vintf/manifest_SKU.xml
/vendor/etc/vintf/manifest.xml
- If
- The VINTF object loads the device manifest in this order:
- If the vendor manifest exists, combine the following:
- The vendor manifest
- Optional vendor manifest fragments
- Optional ODM manifest
- Optional ODM manifest fragments
- Otherwise, if the ODM manifest exists, combine the ODM manifest with the optional ODM manifest fragments.
/vendor/manifest.xml
(legacy, no fragments)- Finally, combine manifest fragments from any vendor APEXes.
Note that:
- On legacy devices, the legacy vendor manifest and the ODM manifest are used. The ODM manifest may completely override the legacy vendor manifest.
- On devices launched with Android 9, the ODM manifest is combined with the vendor manifest.
- When combining a list of manifests, manifests that appear later in the list may override
tags in manifests that appear earlier in the list, provided that the tags in the later
manifest have the attribute
override="true"
. For example, the ODM manifest may override some<hal>
tags from the vendor manifest. See the documentation for attributeoverride
below.
- If the vendor manifest exists, combine the following:
This setup enables multiple products with the same board to share the same vendor image (which provides common HALs) yet have different ODM images (which specify product-specific HALs).
Here's an example vendor manifest.
<?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>
Here's an example ODM manifest.
<?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>
Here's an example device manifest in an OTA package.
<?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>
For more details, see Device Manifest Development.
Framework manifest
The framework manifest file consists of the system manifest, the product manifest, and the system_ext manifest.
-
The system manifest (provided by Google) is manually generated and
lives in the Android source tree at
/system/libhidl/manifest.xml
. - The product manifest (provided by the device) lists HALs serviced by modules installed on the product partition.
-
The system_ext manifest (provided by the device) lists the following:
- HALs serviced by modules installed on the system_ext partition;
- VNDK versions;
- System SDK version.
Similar to the device manifest, multiple fragment files can be used. For details, see Manifest fragments.
Here's an example framework manifest.
<?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>
Manifest fragments
In Android 10 and higher, you can associate a manifest entry with a HAL module in the build system. This makes it easier to conditionally include the HAL module in the build system.
Example
In your Android.bp
or Android.mk
file, add
vintf_fragments
to any module. For example, you can modify
the module with your implementation of your HAL
([email protected]
).
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
In a file called manifest_foo.xml
, create the manifest for
this module. At build time, this manifest is added to the device. Adding
an entry here is the same as adding an entry in the device's main manifest.
This allows clients to use the interface and allows VTS to identify which HAL
implementations are on the device. Anything that a regular manifest
does, this manifest also does.
The example below implements
[email protected]::IFoo/default
, which is installed to
the vendor
or odm
partition. If it's installed to the
system
, product
, or system_ext
partition, use type
framework
instead of
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>
If a HAL module is packaged in a vendor APEX,
package its associated VINTF fragments within the same APEX with prebuilt_etc
as
explained in VINTF fragments.
Manifest file schema
This section describes the meaning of these XML tags. Some "required" tags
can be missing from the source file in Android source tree and written by
assemble_vintf
at build time. Required tags must be present in the corresponding files on the
device.
?xml
- Optional. Only provides information to the XML parser.
manifest.version
- Required. Meta-version of this manifest. Describes the elements expected in the manifest. Unrelated to XML version.
manifest.type
- Required. Type of this manifest. It has the value
device
for the device manifest file andframework
for the framework manifest file. manifest.target-level
- Required for the device manifest. Specifies the framework compatibility matrix (FCM) version that this device manifest is targeted to be compatible with. This is also called the shipping FCM version of the device.
manifest.hal
- Optional, can repeat. A single HAL (HIDL or native, such as GL),
depending on the
format
attribute. manifest.hal.format
- Optional. The value can be one of:
hidl
: HIDL HALs. This is the default.aidl
: AIDL HALs. Only valid at manifest meta-version 2.0 and above.native
: Native HALs.
manifest.hal.max-level
- Optional. Only valid on framework manifests. If set, HALs with a max level lower than the Target FCM Version in the framework manifest are disabled.
manifest.hal.override
- Optional. The value can be one of:
true
: Override other<hal>
elements with the same<name>
and major version. If no<version>
or<fqname>
are in this<hal>
element, then the<hal>
element declares this HAL to be disabled.false
: Don't override other<hal>
elements with the same<name>
and major version.
manifest.hal.name
- Required. Fully qualified package name of the HAL. Multiple HAL entries can use
the same name. Examples:
android.hardware.camera
(HIDL or AIDL HAL)GLES
(native HAL, requires name only)
manifest.hal.transport
- Required when
manifest.hal.format == "hidl"
. Must NOT be present otherwise. States what transport is used when an interface from this package is queried from the service manager. The value can be one of:hwbinder
: Binderized modepassthrough
: Passthrough mode
- Optional when
manifest.hal.format == "aidl"
. Must NOT be present otherwise. States what transport is used when an interface is served remotely. The value must be:inet
: Inet socket
manifest.hal.transport.ip
andmanifest.hal.transport.port
must be used to further specify the Inet connection information. manifest.hal.transport.arch
- Required for
passthrough
and must not be present forhwbinder
. Describes the bitness of the passthrough service being provided. The value can be one of:32
: 32-bit mode64
: 64-bit mode32+64
: Both
manifest.hal.transport.ip
- Required for
inet
and must NOT be present otherwise. Describes the IP address from which the remote interface is being served. manifest.hal.transport.port
- Required for
inet
and must NOT be present otherwise. Describes the port from which the remote interface is being served. manifest.hal.version
- Optional, can repeat. A version for the
hal
tags in a manifest.
For HIDL and native HALs, the format isMAJOR.MINOR
. For examples, refer tohardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
, orsystem/hardware/interfaces
.
HIDL and native HALs may use multiple version fields as long as they represent distinct major versions, with only one minor version per major version provided. For example, 3.1 and 3.2 can't coexist, but 1.0 and 3.4 can. This applies to allhal
elements with the same name, unlessoverride="true"
. The values of<version>
are not associated with<fqname>
because a<fqname>
carries a version.
For AIDL HALs,<version>
must not be present on devices running Android 11 and below.<version>
must be a single integer on devices running Android 12 and above. There must at most one<version>
for each(package, interface, instance)
tuple. If not present, default to1
. The value of<version>
is associated with all<fqname>
in the same<hal>
because a<fqname>
does not carry a version. manifest.hal.interface
- Required, can repeat without duplicates. State an interface in the
package that has an instance name. There can be multiple
<interface>
elements in a<hal>
; names must be distinct. manifest.hal.interface.name
- Required. Name of the interface.
manifest.hal.interface.instance
- Required, can repeat. Instance name of the interface. Can have multiple
instances for an interface but no duplicated
<instance>
elements. manifest.hal.fqname
- Optional, can repeat. An alternative way to specify an instance for the HAL
with name
manifest.hal.name
.- For HIDL HALs, the format is
@MAJOR.MINOR::INTERFACE/INSTANCE
. - For AIDL HALs, the format is
INTERFACE/INSTANCE
.
- For HIDL HALs, the format is
manifest.sepolicy
- Required. Contains all sepolicy-related entries.
manifest.sepolicy.version
- Required for the device manifest. Declares the SELinux version. It has the
format
SDK_INT.PLAT_INT
. manifest.vendor-ndk
- Required, can repeat; required for the framework manifest. Must not be present
in the device manifest. Multiple
<vendor-ndk>
entries must have different<version>
s. Describes a set of VNDK snapshots provided by the framework. manifest.vendor-ndk.version
- Required. This is a positive integer representing the version of the VNDK snapshot.
manifest.vendor-ndk.library
- Optional, can repeat, without duplicates. Describes a set of VNDK libraries
provided by the framework for this VNDK vendor snapshot. The value is the
filename of a library, e.g.
libjpeg.so
, including the prefixlib
and the suffix.so
. No path components are allowed. manifest.system-sdk.version
- Optional, can repeat, without duplicates; used only by the framework manifest. Describes a set of system SDK versions provided by the framework to vendor apps.
manifest.kernel
- Optional. Describes static information about the kernel.
manifest.kernel.target-level
- Optional. Describes the kernel branch. Its value defaults to
manifest.target-level
if not present. Must be greater than or equal tomanifest.target-level
. See kernel match rules for details.