libvendorsupport provides an API to replace vndk version

ro.vndk.version cannot be simply replaced with ro.board.api_level with
the vndk deprecation. Even with the latest system updates, devices may
still run on old vendor images that do not define ro.board.api_level,
but define ro.vndk.version.
To provide the replacement of ro.vndk.version, provide a platform API
AVendorSupport_getVendorApiLevel() to return the expected vendor
version.

Bug: 312311458
Bug: 312315580
Test: manual test for AVendorSupport_getVendorApiLevel()
Change-Id: Id7c04483956d95fd49414cebde41d7cc4d2fb1d1
This commit is contained in:
Justin Yun 2024-04-30 10:43:45 +09:00
parent 67027efd06
commit c0659f0107
3 changed files with 34 additions and 1 deletions

View file

@ -23,7 +23,7 @@ cc_library {
llndk: {
symbol_file: "libvendorsupport.map.txt",
},
srcs: ["version_props.c"],
srcs: ["version_props.cpp"],
cflags: [
"-Wall",
"-Werror",
@ -32,6 +32,7 @@ cc_library {
export_include_dirs: ["include"],
shared_libs: [
"liblog",
"libbase",
],
}

View file

@ -44,4 +44,22 @@ int AVendorSupport_getVendorApiLevelOf(int sdkApiLevel);
*/
int AVendorSupport_getSdkApiLevelOf(int vendorApiLevel);
#if !defined(__ANDROID_VENDOR__)
/**
* @brief Provide vendor API level to system modules.
*
* @details
* Before deprecating VNDK, system modules read ro.vndk.version to find the
* API level that vendor image had implemented. With the VNDK deprecation, this
* must be replaced with ro.board.api_level. However, there still are devices
* keeping old vendor partitions with the new system upgraded. In this case, the
* VNDK version can be used as before.
* This API is for platform only.
*
* @return ro.vndk.version if exist. Otherwise fallback to ro.board.api_level.
* 0 if none of these properties are found. This is unexpected, though.
*/
int AVendorSupport_getVendorApiLevel();
#endif // __ANDROID_VENDOR__
__END_DECLS

View file

@ -16,6 +16,10 @@
#include <log/log.h>
#if !defined(__ANDROID_VENDOR__)
#include <android-base/properties.h>
#endif
int AVendorSupport_getVendorApiLevelOf(int sdkApiLevel) {
if (sdkApiLevel < __ANDROID_API_V__) {
return sdkApiLevel;
@ -39,3 +43,13 @@ int AVendorSupport_getSdkApiLevelOf(int vendorApiLevel) {
ALOGE("Unexpected vendor api level: %d", vendorApiLevel);
return __INVALID_API_LEVEL;
}
#if !defined(__ANDROID_VENDOR__)
int AVendorSupport_getVendorApiLevel() {
int vendorApiLevel = android::base::GetIntProperty("ro.vndk.version", 0);
if (vendorApiLevel) {
return vendorApiLevel;
}
return android::base::GetIntProperty("ro.board.api_level", 0);
}
#endif // __ANDROID_VENDOR__