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.

Para una app nueva, elige la versión más reciente disponible. Para una app existente, actualiza a la versión más reciente cuando sea conveniente.

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.

Para una app nueva, elige la versión más reciente disponible. En el caso de una app existente, actualiza a la versión más reciente cuando sea conveniente (después de actualizar compileSdkVersion).

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é APIs 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.

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.

Para una app nueva, consulta los datos de distribución del usuario en el asistente de proyectos nuevos de Android Studio o en apilevels.com. Elige el equilibrio entre la participación de mercado potencial y los costos de mantenimiento. Cuanto más bajo sea tu minSdkVersion, más tiempo pasarás solucionando errores antiguos y agregando comportamientos de resguardo para funciones que aún no se implementaron.

En el caso de una app existente, aumenta el valor de minSdkVersion cuando los niveles de API anteriores ya no compensan los costos de mantenimiento o disminúyelo si los usuarios lo exigen y vale la pena pagar los nuevos costos de mantenimiento. Play Console tiene métricas específicas para la distribución de usuarios de tu app.

El minSdkVersion de tu aplicación está disponible para el preprocesador mediante la macro __ANDROID_MIN_SDK_VERSION__ (la __ANDROID_API__ heredada es idéntica, pero se prefiere la primera porque su significado es más claro). 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.