Provide a new LLNDK for the vendor api level handling

The library provides mapping functions between SDK versions and
vendor api levels.

Bug: 315056516
Test: atest libvendorsupport-tests
Change-Id: I4a4eae0456ebf756badcc80f09a2946f741843c5
This commit is contained in:
Justin Yun 2024-01-03 16:50:25 +09:00
parent 004187aced
commit a68aa85624
8 changed files with 213 additions and 0 deletions

View file

@ -0,0 +1,35 @@
// Copyright (C) 2024 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
cc_library {
name: "libvendorsupport",
native_bridge_supported: true,
llndk: {
symbol_file: "libvendorsupport.map.txt",
},
srcs: ["version_props.c"],
cflags: [
"-Wall",
"-Werror",
],
local_include_dirs: ["include/vendorsupport"],
export_include_dirs: ["include"],
shared_libs: [
"liblog",
],
}

2
libvendorsupport/OWNERS Normal file
View file

@ -0,0 +1,2 @@
jiyong@google.com
justinyun@google.com

View file

@ -0,0 +1,7 @@
{
"postsubmit": [
{
"name": "libvendorsupport-tests"
}
]
}

View file

@ -0,0 +1,51 @@
// Copyright (C) 2024 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include <android/api-level.h>
#define __ANDROID_VENDOR_API_MAX__ 1000000
#define __INVALID_API_LEVEL -1
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Find corresponding vendor API level from an SDK API version.
*
* @details
* SDK API versions and vendor API levels are not compatible and not
* convertible. However, this function can be used to compare the two versions
* to know which one is newer than the other.
*
* @param sdk_api_level The SDK version int. This must be less than 10000.
* @return The corresponding vendor API level of the SDK version. -1 if the SDK
* version is invalid or 10000.
*/
int vendor_api_level_of(int sdk_api_level);
/**
* @brief Find corresponding SDK API version from a vendor API level.
*
* @param vendor_api_level The vendor API level int.
* @return The corresponding SDK API version of the vendor API level. -1 if the
* vendor API level is invalid.
*/
int sdk_api_level_of(int vendor_api_level);
#ifdef __cplusplus
}
#endif

View file

@ -0,0 +1,7 @@
LIBVENDORSUPPORT {
global:
vendor_api_level_of; # llndk systemapi
sdk_api_level_of; # llndk systemapi
local:
*;
};

View file

@ -0,0 +1,33 @@
// Copyright (C) 2024 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
cc_test {
name: "libvendorsupport-tests",
srcs: [
"version_props_test.cpp",
],
cflags: [
"-Wall",
"-Werror",
],
shared_libs: [
"libvendorsupport",
],
test_suites: ["general-tests"],
}

View file

@ -0,0 +1,37 @@
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <gtest/gtest.h>
#include <vendorsupport/api_level.h>
using namespace std;
namespace {
TEST(vendorsupport, get_corresponding_vendor_api_level) {
ASSERT_EQ(__ANDROID_API_U__, vendor_api_level_of(__ANDROID_API_U__));
ASSERT_EQ(202404, vendor_api_level_of(__ANDROID_API_V__));
ASSERT_EQ(__INVALID_API_LEVEL, vendor_api_level_of(__ANDROID_API_FUTURE__));
}
TEST(vendorsupport, get_corresponding_sdk_api_level) {
ASSERT_EQ(__ANDROID_API_U__, sdk_api_level_of(__ANDROID_API_U__));
ASSERT_EQ(__ANDROID_API_V__, sdk_api_level_of(202404));
ASSERT_EQ(__INVALID_API_LEVEL, sdk_api_level_of(__ANDROID_VENDOR_API_MAX__));
ASSERT_EQ(__INVALID_API_LEVEL, sdk_api_level_of(35));
}
} // namespace

View file

@ -0,0 +1,41 @@
// Copyright (C) 2024 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "api_level.h"
#include <log/log.h>
int vendor_api_level_of(int sdk_api_level) {
if (sdk_api_level < __ANDROID_API_V__) {
return sdk_api_level;
}
// In Android V, vendor API level started with version 202404.
// The calculation assumes that the SDK api level bumps once a year.
if (sdk_api_level < __ANDROID_API_FUTURE__) {
return 202404 + ((sdk_api_level - __ANDROID_API_V__) * 100);
}
ALOGE("The SDK version must be less than 10000: %d", sdk_api_level);
return __INVALID_API_LEVEL;
}
int sdk_api_level_of(int vendor_api_level) {
if (vendor_api_level < __ANDROID_API_V__) {
return vendor_api_level;
}
if (vendor_api_level >= 202404 && vendor_api_level < __ANDROID_VENDOR_API_MAX__) {
return (vendor_api_level - 202404) / 100 + __ANDROID_API_V__;
}
ALOGE("Unexpected vendor api level: %d", vendor_api_level);
return __INVALID_API_LEVEL;
}