Propiedades de la versión del SDK de Android

Las aplicaciones para Android pueden establecer varias propiedades de la versión del SDK en su archivo build.gradle. En la documentación de build.gradle para Android, se explica el significado de esas propiedades para la aplicación en general. En este documento, se explica cómo esas propiedades afectan las compilaciones del NDK.

compileSdkVersion

Esta propiedad no tiene efecto en las compilaciones del NDK. En cambio, la disponibilidad de la API para el NDK se rige por minSdkVersion. Esto se debe a que los símbolos de C++ se resuelven con éxito durante el tiempo de carga de la biblioteca, en lugar de hacerlo de manera diferida cuando se los llama por primera vez (como están en Java). El uso de símbolos que no estén disponibles en minSdkVersion hará que la biblioteca no se cargue en versiones de SO que no tienen la API más nueva, independientemente de si se llamará o no a esas API.

targetSdkVersion

Al igual que en Java, la targetSdkVersion de tu app puede cambiar el comportamiento del entorno de ejecución de código nativo. Los cambios de comportamiento en el sistema se aplican, cuando es posible, solo a apps con una targetSdkVersion mayor o igual que la versión del SO que introdujo el cambio.

Si bien los desarrolladores de aplicaciones suelen conocer la targetSdkVersion de su app, esta API es útil para los desarrolladores de bibliotecas que no pueden saber qué targetSdkVersion elegirán sus usuarios.

En el entorno de ejecución, puedes obtener la targetSdkVersion que usa una aplicación si llamas a android_get_application_target_sdk_version(). Esta API está disponible en el nivel de API 24 y versiones posteriores. Esta función tiene la siguiente firma:

/**
 * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if
 * there is no known target SDK version (for code not running in the context of
 * an app).
 *
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
 *
 * See also android_get_device_api_level().
 *
 * Available since API level 24.
 */
int android_get_application_target_sdk_version() __INTRODUCED_IN(24);

Otros cambios de comportamiento pueden depender del nivel de API del dispositivo. Puedes llamar a android_get_device_api_level() para obtener el nivel de API del dispositivo en el que se ejecuta tu aplicación. Esta función tiene la siguiente firma:

/**
 * 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.
 *
 * See also android_get_application_target_sdk_version().
 */
int android_get_device_api_level();

maxSdkVersion

Esta propiedad no tiene efecto en las compilaciones del NDK.

minSdkVersion

La minSdkVersion configurada en tu archivo build.gradle determina qué API están disponibles en el tiempo de compilación (consulta compileSdkVersion para comprender por qué esto difiere de las compilaciones de Java) y la versión mínima del SO que admitirá tu código.

La minSdkVersion de tu aplicación está disponible para el preprocesador mediante la macro __ANDROID_API__. Esta macro se define automáticamente mediante Clang, por lo que no es necesario incluir encabezados para usarla. Para compilaciones de NDK, esta macro siempre está definida.

El NDK usa el objeto minSdkVersion para determinar las funciones que se pueden usar cuando compilas tu código. Por ejemplo, esta propiedad determina qué funciones FORTIFY se usan en libc y también puede habilitar mejoras de rendimiento o tamaño (como hashes de GNU o RELR) para los objetos binarios que no sean compatibles con versiones anteriores de Android. Incluso si no usas ninguna API nueva, esta propiedad rige la versión mínima del SO compatible de tu código. A pesar de esto, es posible que las bibliotecas se carguen en una versión anterior del SO. No dependas de esto, ya que puede variar en distintas versiones del NDK, versiones de SO o dispositivos individuales.