• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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