Vendor API level refers to the version of the interface supported by the vendor partition. The interface is bidirectional; it describes the API that the vendor partition provides to the system partition (the hardware abstraction layer or HAL interface), and also the API that the vendor partition requires from the system partition (the low-level native developers kit or LLNDK interface).
Vendor API level is also used to determine the Vendor Software Requirements (VSRs), which is a collection of functional and nonfunctional requirements that the software in the vendor partition must satisfy.
The remainder of this page explains how system properties are used, depending on your Android version, to determine the vendor API level.
Vendor freeze
Android lets a vendor to freeze the vendor partition at a specific version of the VSR. The set of features that Android expects from the vendor partition is determined by the vendor API level associated with the vendor partition. At runtime, the behavior of the software running in the system partition adjusts to accommodate the vendor API level of the vendor partition. For example, the software in the system partition might not exercise new features if they aren't supported by the API level of the vendor partition.
A vendor freeze is available only if you're creating an Android-compatible device.
Determine vendor API level (Android 14-QPR3 and later)
For Android 14-QPR3 and later, the vendor API level is released separately, meaning the SDK API level and vendor API level are out of sync.
Because of the separate release schedules, for Android 14-QPR3 and later, the vendor API level is completely decoupled from the SDK API level. To ensure this decoupling is clear, the format of the vendor API level is a date formatted as YYYYMM (year and month) while the SDK level is an integer.
Android 14-QPR3 and later contains the following system
properties related to vendor API level (ro.vendor.api_level
):
System property | Format | Description | Initial setting |
---|---|---|---|
ro.board.api_level |
YYYYMM | The vendor API level that a chipset's software supports. This property is set for all chipsets. | This is set by the build system automatically. |
ro.board.first_api_level |
YYYYMM | The vendor API level that a chipset's software was first released with. This property is a function of chipset only and is set by SoC vendors if the SoC chipset is qualified for vendor freeze. After initial setting, it must not be modified. | SoC vendors set this setting using BOARD_SHIPPING_API_LEVEL . |
ro.product.first_api_level |
Integer | The SDK API level that the device is initially launched with. | This property is set by the OEM and then never updated, even after OS upgrades. |
ro.vendor.api_level |
YYYYMM | The vendor API level that the device as a whole must conform to. | Described after this table. |
ro.board.api_frozen |
boolean | This property is set to true if the vendor API level that ro.board.api_level represents is finalized. |
If this property isn't set, it defaults to false . |
ro.llndk.api_level |
YYYYMM | The vendor API level of YYYYMM format that the current LLNDK in the system partition provides. The LLNDK is backward compatible, so any vendor image that is less than or equal to this API level can be flashed with this system image. | This property is set by the system partition. |
The ro.vendor.api_level
property is derived in one of the two following ways:
If the chipset has qualified for vendor freeze:
ro.vendor.api_level = min( ro.board.api_level, AVendorSupport_getVendorApiLevelOf(ro.product.first_api_level))
If the chipset isn't under vendor freeze:
ro.vendor.api_level = AVendorSupport_getVendorApiLevelOf(ro.product.first_api_level)
The AVendorSupport_getVendorApiLevelOf()
method determines the corresponding
vendor API level from an SDK API level. For example
AVendorSupport_getVendorApiLevelOf(35)
, where 35
is the SDK API level of the
major Android release in 2024 returns 202404
, which is the rough date for
Android 14-QPR3 when the current Vendor API level was
set.
Determine vendor API level (Android 13)
The vendor API level follows the SDK API level, which is for the app-OS interface and is updated once a year when the new Android platform is released to AOSP.
Android 13 contains the following system
properties related to vendor API level (ro.vendor.api_level
):
System property | Format | Description | Initial setting |
---|---|---|---|
ro.board.first_api_level |
Integer | The vendor API level that a chipset's software was first released with. This is a function of chipset only, and can't be modified by either SoC vendors or OEMs. This property is set only for chipsets that qualify for the vendor freeze | Value is established by setting BOARD_SHIPPING_API_LEVEL in the device.mk file. |
ro.board.api_level |
Integer | The vendor API level that a chipset's software supports. This property is set only for the chipsets that qualify for vendor freeze. This property is set for all chipsets. | Initially, this property's value is set by the build system to the same value as ro.board.first_api_level , but can be updated if the vendor partition is upgraded. |
ro.product.first_api_level |
Integer | The SDK API level that the device is initially launched with. | This property is set by the OEM and then never updated, even after OS upgrades. |
ro.vendor.api_level |
Integer | The vendor API level that the device as a whole must conform to. | Described after this table. |
ro.vndk.version |
Integer | The version of VNDK that the vendor partition is built against. | This property is set by the system partition. |
ro.vendor.build.version.sdk |
Integer | The SDK API level of the source tree where the vendor partition was built. | |
ro.vendor.build.version.release |
Integer | The platform version of the source tree where the vendor partition was built. | |
ro.vendor.build.version.release_or_codename |
Integer | The code name of the source tree where the vendor partition was built. |
The ro.vendor.api_level
property is automatically set to the minimum of ro.board.api_level
(or ro.board.first_api_level
if ro.board.api_level
isn't defined) and
ro.product.first_api_level
.