1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #pragma once 30 31 /** 32 * @defgroup apilevels API Levels 33 * 34 * Defines functions for working with Android API levels. 35 * @{ 36 */ 37 38 /** 39 * @file android/api-level.h 40 * @brief Functions for dealing with multiple API levels. 41 * 42 * See also 43 * https://developer.android.com/ndk/guides/using-newer-apis 44 * for more tutorial information on dealing with multiple API levels. 45 * 46 * See also 47 * https://android.googlesource.com/platform/bionic/+/main/docs/defines.md 48 * for when to use which `#define` when writing portable code. 49 */ 50 51 #include <sys/cdefs.h> 52 53 __BEGIN_DECLS 54 55 /** 56 * Magic version number for an Android OS build which has not yet turned 57 * into an official release, for comparison against `__ANDROID_API__`. See 58 * https://android.googlesource.com/platform/bionic/+/main/docs/defines.md. 59 */ 60 #define __ANDROID_API_FUTURE__ 10000 61 62 /* This #ifndef should never be true except when doxygen is generating docs. */ 63 #ifndef __ANDROID_API__ 64 /** 65 * `__ANDROID_API__` is the [API 66 * level](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels) 67 * this code is being built for. The resulting binaries are only guaranteed to 68 * be compatible with devices which have an API level greater than or equal to 69 * `__ANDROID_API__`. 70 * 71 * For NDK and APEX builds, this macro will always be defined. It is set 72 * automatically by Clang using the version suffix that is a part of the target 73 * name. For example, `__ANDROID_API__` will be 24 when Clang is given the 74 * argument `-target aarch64-linux-android24`. 75 * 76 * For non-APEX OS code, this defaults to __ANDROID_API_FUTURE__. 77 * 78 * The value of `__ANDROID_API__` can be compared to the named constants in 79 * `<android/api-level.h>`. 80 * 81 * The interpretation of `__ANDROID_API__` is similar to the AndroidManifest.xml 82 * `minSdkVersion`. In most cases `__ANDROID_API__` will be identical to 83 * `minSdkVersion`, but as it is a build time constant it is possible for 84 * library code to use a different value than the app it will be included in. 85 * When libraries and applications build for different API levels, the 86 * `minSdkVersion` of the application must be at least as high as the highest 87 * API level used by any of its libraries which are loaded unconditionally. 88 * 89 * Note that in some cases the resulting binaries may load successfully on 90 * devices with an older API level. That behavior should not be relied upon, 91 * even if you are careful to avoid using new APIs, as the toolchain may make 92 * use of new features by default. For example, additional FORTIFY features may 93 * implicitly make use of new APIs, SysV hashes may be omitted in favor of GNU 94 * hashes to improve library load times, or relocation packing may be enabled to 95 * reduce binary size. 96 * 97 * See android_get_device_api_level(), 98 * android_get_application_target_sdk_version() and 99 * https://android.googlesource.com/platform/bionic/+/main/docs/defines.md. 100 */ 101 #define __ANDROID_API__ __ANDROID_API_FUTURE__ 102 #endif 103 104 /** Deprecated name for API level 9. Prefer numeric API levels in new code. */ 105 #define __ANDROID_API_G__ 9 106 107 /** Deprecated name for API level 14. Prefer numeric API levels in new code. */ 108 #define __ANDROID_API_I__ 14 109 110 /** Deprecated name for API level 16. Prefer numeric API levels in new code. */ 111 #define __ANDROID_API_J__ 16 112 113 /** Deprecated name for API level 17. Prefer numeric API levels in new code. */ 114 #define __ANDROID_API_J_MR1__ 17 115 116 /** Deprecated name for API level 18. Prefer numeric API levels in new code. */ 117 #define __ANDROID_API_J_MR2__ 18 118 119 /** Deprecated name for API level 19. Prefer numeric API levels in new code. */ 120 #define __ANDROID_API_K__ 19 121 122 /** Deprecated name for API level 21. Prefer numeric API levels in new code. */ 123 #define __ANDROID_API_L__ 21 124 125 /** Deprecated name for API level 22. Prefer numeric API levels in new code. */ 126 #define __ANDROID_API_L_MR1__ 22 127 128 /** Deprecated name for API level 23. Prefer numeric API levels in new code. */ 129 #define __ANDROID_API_M__ 23 130 131 /** Deprecated name for API level 24. Prefer numeric API levels in new code. */ 132 #define __ANDROID_API_N__ 24 133 134 /** Deprecated name for API level 25. Prefer numeric API levels in new code. */ 135 #define __ANDROID_API_N_MR1__ 25 136 137 /** Deprecated name for API level 26. Prefer numeric API levels in new code. */ 138 #define __ANDROID_API_O__ 26 139 140 /** Deprecated name for API level 27. Prefer numeric API levels in new code. */ 141 #define __ANDROID_API_O_MR1__ 27 142 143 /** Deprecated name for API level 28. Prefer numeric API levels in new code. */ 144 #define __ANDROID_API_P__ 28 145 146 /** Deprecated name for API level 29. Prefer numeric API levels in new code. */ 147 #define __ANDROID_API_Q__ 29 148 149 /** Deprecated name for API level 30. Prefer numeric API levels in new code. */ 150 #define __ANDROID_API_R__ 30 151 152 /** Deprecated name for API level 31. Prefer numeric API levels in new code. */ 153 #define __ANDROID_API_S__ 31 154 155 /** Deprecated name for API level 33. Prefer numeric API levels in new code. */ 156 #define __ANDROID_API_T__ 33 157 158 /** Deprecated name for API level 34. Prefer numeric API levels in new code. */ 159 #define __ANDROID_API_U__ 34 160 161 /** Deprecated name for API level 35. Prefer numeric API levels in new code. */ 162 #define __ANDROID_API_V__ 35 163 164 /* This file is included in <features.h>, and might be used from .S files. */ 165 #if !defined(__ASSEMBLY__) 166 167 /** 168 * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if 169 * there is no known target SDK version (for code not running in the context of 170 * an app). 171 * 172 * The returned values correspond to the named constants in `<android/api-level.h>`, 173 * and is equivalent to the AndroidManifest.xml `targetSdkVersion`. 174 * 175 * See also android_get_device_api_level(). 176 * 177 * Available since API level 24. 178 */ 179 #if __BIONIC_AVAILABILITY_GUARD(24) 180 int android_get_application_target_sdk_version() __INTRODUCED_IN(24); 181 #endif /* __BIONIC_AVAILABILITY_GUARD(24) */ 182 183 184 #if __ANDROID_API__ < 29 185 186 /* android_get_device_api_level is a static inline before API level 29. */ 187 #define __BIONIC_GET_DEVICE_API_LEVEL_INLINE static __inline 188 #include <bits/get_device_api_level_inlines.h> 189 #undef __BIONIC_GET_DEVICE_API_LEVEL_INLINE 190 191 #else 192 193 /** 194 * Returns the API level of the device we're actually running on, or -1 on failure. 195 * The returned values correspond to the named constants in `<android/api-level.h>`, 196 * and is equivalent to the Java `Build.VERSION.SDK_INT` API. 197 * 198 * See also android_get_application_target_sdk_version(). 199 * 200 * Available since API level 29. 201 */ 202 int android_get_device_api_level() __INTRODUCED_IN(29); 203 204 #endif 205 206 #endif /* defined(__ASSEMBLY__) */ 207 208 __END_DECLS 209 210 /** @} */ 211