diff --git a/libvendorsupport/include_llndk/android/llndk-versioning.h b/libvendorsupport/include_llndk/android/llndk-versioning.h index b375a2fa7..b5001491d 100644 --- a/libvendorsupport/include_llndk/android/llndk-versioning.h +++ b/libvendorsupport/include_llndk/android/llndk-versioning.h @@ -32,18 +32,25 @@ __BEGIN_DECLS "call with '#if (__ANDROID_VENDOR_API__ >= " #vendor_api_level ")'."))) \ _Pragma("clang diagnostic pop") -// For the vendor libraries, __INTRODUCED_IN must be ignored because they are only for NDKs but not -// for LLNDKs. -#undef __INTRODUCED_IN -#define __INTRODUCED_IN(x) +// Use this macro as an `if` statement to call an API that are available to both NDK and LLNDK. +// This returns true for the vendor modules if the vendor_api_level is less than or equal to the +// ro.board.api_level. +#define API_LEVEL_AT_LEAST(sdk_api_level, vendor_api_level) \ + constexpr(__ANDROID_VENDOR_API__ >= vendor_api_level) #else // __ANDROID_VENDOR__ -// For non-vendor libraries, __INTRODUCED_IN_LLNDK must be ignored because it must not change -// symbols of NDK or the system side of the treble boundary. It leaves a no-op annotation for ABI -// analysis. +// __INTRODUCED_IN_LLNDK is for LLNDK only but not for NDK. Ignore this for non-vendor modules. +// It leaves a no-op annotation for ABI analysis. +#if !defined(__INTRODUCED_IN_LLNDK) #define __INTRODUCED_IN_LLNDK(vendor_api_level) \ __attribute__((annotate("introduced_in_llndk=" #vendor_api_level))) +#endif + +// For non-vendor modules, API_LEVEL_AT_LEAST is replaced with __builtin_available(sdk_api_level) to +// guard the API for __INTRODUCED_IN. +#define API_LEVEL_AT_LEAST(sdk_api_level, vendor_api_level) \ + (__builtin_available(android sdk_api_level, *)) #endif // __ANDROID_VENDOR__