diff options
-rw-r--r-- | libc/Android.bp | 1 | ||||
-rw-r--r-- | libc/bionic/get_device_api_level.cpp | 30 | ||||
-rw-r--r-- | libc/include/android/api-level.h | 57 | ||||
-rw-r--r-- | libc/include/android/get_device_api_level.h | 54 | ||||
-rw-r--r-- | libc/include/android/legacy_get_device_api_level_inlines.h | 38 | ||||
-rw-r--r-- | libc/include/bits/get_device_api_level_inlines.h | 48 | ||||
-rw-r--r-- | libc/libc.arm.map | 1 | ||||
-rw-r--r-- | libc/libc.arm64.map | 1 | ||||
-rw-r--r-- | libc/libc.map.txt | 1 | ||||
-rw-r--r-- | libc/libc.mips.map | 1 | ||||
-rw-r--r-- | libc/libc.mips64.map | 1 | ||||
-rw-r--r-- | libc/libc.x86.map | 1 | ||||
-rw-r--r-- | libc/libc.x86_64.map | 1 | ||||
-rw-r--r-- | tests/Android.bp | 1 | ||||
-rw-r--r-- | tests/android_get_device_api_level.cpp | 40 |
15 files changed, 268 insertions, 8 deletions
diff --git a/libc/Android.bp b/libc/Android.bp index fe65acefa..d7ad117c7 100644 --- a/libc/Android.bp +++ b/libc/Android.bp @@ -1298,6 +1298,7 @@ cc_library_static { "bionic/getpid.cpp", "bionic/getpriority.cpp", "bionic/gettid.cpp", + "bionic/get_device_api_level.cpp", "bionic/grp_pwd.cpp", "bionic/grp_pwd_file.cpp", "bionic/iconv.cpp", diff --git a/libc/bionic/get_device_api_level.cpp b/libc/bionic/get_device_api_level.cpp new file mode 100644 index 000000000..dd955d602 --- /dev/null +++ b/libc/bionic/get_device_api_level.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define __BIONIC_GET_DEVICE_API_LEVEL_INLINE /* Out of line. */ +#include <bits/get_device_api_level_inlines.h> diff --git a/libc/include/android/api-level.h b/libc/include/android/api-level.h index 6ed6c0a05..ebce9000d 100644 --- a/libc/include/android/api-level.h +++ b/libc/include/android/api-level.h @@ -26,39 +26,80 @@ * SUCH DAMAGE. */ -#ifndef ANDROID_API_LEVEL_H -#define ANDROID_API_LEVEL_H +#pragma once + +/** + * @file android/api-level.h + * @brief Functions and constants for dealing with multiple API levels. + */ #include <sys/cdefs.h> -/* - * Magic version number for a current development build, which has - * not yet turned into an official release. - */ #ifndef __ANDROID_API_FUTURE__ +/** + * Magic version number for an Android OS build which has + * not yet turned into an official release, + * for comparisons against __ANDROID_API__. + */ #define __ANDROID_API_FUTURE__ 10000 #endif #ifndef __ANDROID_API__ +/** + * `__ANDROID_API__` is the API level being targeted. For the OS, + * this is `__ANDROID_API_FUTURE__`. For the NDK, this is set by the + * compiler/build system based on the API level you claimed to target. + */ #define __ANDROID_API__ __ANDROID_API_FUTURE__ #else +/** + * `__ANDROID_NDK__` is defined for code that's built by the NDK + * rather than as part of the OS. + */ #define __ANDROID_NDK__ 1 #endif +/** Names the Gingerbread API level (9), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_G__ 9 + +/** Names the Ice-Cream Sandwich API level (14), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_I__ 14 + +/** Names the Jellybean API level (16), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_J__ 16 + +/** Names the Jellybean MR1 API level (17), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_J_MR1__ 17 + +/** Names the Jellybean MR2 API level (18), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_J_MR2__ 18 + +/** Names the KitKat API level (19), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_K__ 19 + +/** Names the Lollipop API level (21), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_L__ 21 + +/** Names the Lollipop MR1 API level (22), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_L_MR1__ 22 + +/** Names the Marshmallow API level (23), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_M__ 23 + +/** Names the Nougat API level (24), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_N__ 24 + +/** Names the Nougat MR1 API level (25), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_N_MR1__ 25 + +/** Names the Oreo API level (26), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_O__ 26 + +/** Names the Oreo MR1 API level (27), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_O_MR1__ 27 + +/** Names the Pie API level (28), for comparisons against __ANDROID_API__. */ #define __ANDROID_API_P__ 28 -#define __ANDROID_API_Q__ 29 -#endif +/** Names the "Q" API level (29), for comparisons against __ANDROID_API__. */ +#define __ANDROID_API_Q__ 29 diff --git a/libc/include/android/get_device_api_level.h b/libc/include/android/get_device_api_level.h new file mode 100644 index 000000000..39609da5c --- /dev/null +++ b/libc/include/android/get_device_api_level.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#pragma once + +/** + * @file android/get_device_api_level.h + * @brief Check the API level of the device we're actually running on. + */ + +#include <sys/cdefs.h> + +__BEGIN_DECLS + +#if __ANDROID_API__ >= __ANDROID_API_Q__ +// This file is implemented as static inlines before API level 29. + +/** + * Returns the API level of the device we're actually running on, or -1 on failure. + * The returned values correspond to the named constants in <android/api-level.h>, + * and is equivalent to the Java `Build.VERSION.SDK_INT` API. + */ +int android_get_device_api_level() __INTRODUCED_IN(29); + +#endif + +__END_DECLS + +#include <android/legacy_get_device_api_level_inlines.h> diff --git a/libc/include/android/legacy_get_device_api_level_inlines.h b/libc/include/android/legacy_get_device_api_level_inlines.h new file mode 100644 index 000000000..b60123c45 --- /dev/null +++ b/libc/include/android/legacy_get_device_api_level_inlines.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#pragma once + +#include <sys/cdefs.h> + +#if __ANDROID_API__ < __ANDROID_API_Q__ + +#define __BIONIC_GET_DEVICE_API_LEVEL_INLINE static __inline +#include <bits/get_device_api_level_inlines.h> + +#endif diff --git a/libc/include/bits/get_device_api_level_inlines.h b/libc/include/bits/get_device_api_level_inlines.h new file mode 100644 index 000000000..8e1781471 --- /dev/null +++ b/libc/include/bits/get_device_api_level_inlines.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#pragma once + +#include <stdlib.h> +#include <sys/cdefs.h> +#include <sys/system_properties.h> + +#if !defined(__BIONIC_GET_DEVICE_API_LEVEL_INLINE) +#define __BIONIC_GET_DEVICE_API_LEVEL_INLINE static __inline +#endif + +__BEGIN_DECLS + +__BIONIC_GET_DEVICE_API_LEVEL_INLINE int android_get_device_api_level() { + char value[PROP_VALUE_MAX] = { 0 }; + if (__system_property_get("ro.build.version.sdk", value) < 1) return -1; + int api_level = atoi(value); + return (api_level > 0) ? api_level : -1; +} + +__END_DECLS diff --git a/libc/libc.arm.map b/libc/libc.arm.map index 8fb07f784..2891925f6 100644 --- a/libc/libc.arm.map +++ b/libc/libc.arm.map @@ -1431,6 +1431,7 @@ LIBC_Q { # introduced=Q android_fdsan_get_tag_value; android_fdsan_get_error_level; android_fdsan_set_error_level; + android_get_device_api_level; pthread_sigqueue; timespec_get; } LIBC_P; diff --git a/libc/libc.arm64.map b/libc/libc.arm64.map index 8c5eb89d4..3e8cea2a0 100644 --- a/libc/libc.arm64.map +++ b/libc/libc.arm64.map @@ -1352,6 +1352,7 @@ LIBC_Q { # introduced=Q android_fdsan_get_tag_value; android_fdsan_get_error_level; android_fdsan_set_error_level; + android_get_device_api_level; pthread_sigqueue; timespec_get; } LIBC_P; diff --git a/libc/libc.map.txt b/libc/libc.map.txt index c5f091076..2770f218e 100644 --- a/libc/libc.map.txt +++ b/libc/libc.map.txt @@ -1456,6 +1456,7 @@ LIBC_Q { # introduced=Q android_fdsan_get_tag_value; android_fdsan_get_error_level; android_fdsan_set_error_level; + android_get_device_api_level; pthread_sigqueue; timespec_get; } LIBC_P; diff --git a/libc/libc.mips.map b/libc/libc.mips.map index fbaf508f6..456e35cf7 100644 --- a/libc/libc.mips.map +++ b/libc/libc.mips.map @@ -1415,6 +1415,7 @@ LIBC_Q { # introduced=Q android_fdsan_get_tag_value; android_fdsan_get_error_level; android_fdsan_set_error_level; + android_get_device_api_level; pthread_sigqueue; timespec_get; } LIBC_P; diff --git a/libc/libc.mips64.map b/libc/libc.mips64.map index 8c5eb89d4..3e8cea2a0 100644 --- a/libc/libc.mips64.map +++ b/libc/libc.mips64.map @@ -1352,6 +1352,7 @@ LIBC_Q { # introduced=Q android_fdsan_get_tag_value; android_fdsan_get_error_level; android_fdsan_set_error_level; + android_get_device_api_level; pthread_sigqueue; timespec_get; } LIBC_P; diff --git a/libc/libc.x86.map b/libc/libc.x86.map index db86e5511..4cbef13a1 100644 --- a/libc/libc.x86.map +++ b/libc/libc.x86.map @@ -1413,6 +1413,7 @@ LIBC_Q { # introduced=Q android_fdsan_get_tag_value; android_fdsan_get_error_level; android_fdsan_set_error_level; + android_get_device_api_level; pthread_sigqueue; timespec_get; } LIBC_P; diff --git a/libc/libc.x86_64.map b/libc/libc.x86_64.map index 8c5eb89d4..3e8cea2a0 100644 --- a/libc/libc.x86_64.map +++ b/libc/libc.x86_64.map @@ -1352,6 +1352,7 @@ LIBC_Q { # introduced=Q android_fdsan_get_tag_value; android_fdsan_get_error_level; android_fdsan_set_error_level; + android_get_device_api_level; pthread_sigqueue; timespec_get; } LIBC_P; diff --git a/tests/Android.bp b/tests/Android.bp index fa66f93b0..d2584b770 100644 --- a/tests/Android.bp +++ b/tests/Android.bp @@ -65,6 +65,7 @@ cc_test_library { defaults: ["bionic_tests_defaults"], srcs: [ "alloca_test.cpp", + "android_get_device_api_level.cpp", "arpa_inet_test.cpp", "async_safe_test.cpp", "assert_test.cpp", diff --git a/tests/android_get_device_api_level.cpp b/tests/android_get_device_api_level.cpp new file mode 100644 index 000000000..5272a489a --- /dev/null +++ b/tests/android_get_device_api_level.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <gtest/gtest.h> + +#if __BIONIC__ +#include <android/get_device_api_level.h> +#endif + +TEST(android_get_device_api_level, smoke) { +#if __BIONIC__ + // This will fail if you run the tests on an old device, but who does that? + ASSERT_GE(29, android_get_device_api_level()); +#endif +} |