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.