Propriétés de version du SDK Android

Les applications Android peuvent définir plusieurs propriétés de version du SDK dans leur fichier build.gradle. La documentation Android build.gradle explique la signification de ces propriétés pour l'application en général. Cet article explique comment ces propriétés affectent les builds du NDK.

compileSdkVersion

Cette propriété n'a aucun effet sur les builds du NDK. La disponibilité des API pour le NDK est régie par minSdkVersion. En effet, les symboles C++ sont résolus rapidement au moment du chargement de la bibliothèque, et non pas en différé lors de leur premier appel (comme c'est le cas en Java). L'utilisation de symboles non disponibles dans minSdkVersion empêche le chargement de la bibliothèque sur les versions d'OS qui ne disposent pas de l'API la plus récente, que ces API soient appelées ou non.

Pour une nouvelle application, choisissez la dernière version disponible. Pour une application existante, installez la dernière version quand vous en avez l'occasion.

targetSdkVersion

Comme pour Java, la targetSdkVersion de votre application peut modifier le comportement d'exécution du code natif. Quand cela est possible, les changements de comportement dans le système ne sont répercutés que sur les applications dont la targetSdkVersion est supérieure ou égale à la version de l'OS qui a introduit ce changement.

Pour une nouvelle application, choisissez la dernière version disponible. Pour une application existante, installez la dernière version quand vous en avez l'occasion (après avoir mis à jour compileSdkVersion).

Bien que les développeurs d'applications connaissent généralement la targetSdkVersion de leur application, cette API est utile pour les développeurs de bibliothèques qui ne savent pas quelle targetSdkVersion leurs utilisateurs choisiront.

Au moment de l'exécution, vous pouvez obtenir la targetSdkVersion utilisée par une application en appelant android_get_application_target_sdk_version(). Cette API est disponible à partir du niveau d'API 24. Cette fonction a la signature suivante :

/**
 * 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);

D'autres changements de comportement peuvent dépendre du niveau d'API de l'appareil. Pour obtenir le niveau d'API de l'appareil sur lequel votre application s'exécute, appelez android_get_device_api_level(). Cette fonction a la signature suivante :

/**
 * 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

Cette propriété n'a aucun effet sur les builds du NDK.

minSdkVersion

La minSdkVersion définie dans le fichier build.gradle détermine les API disponibles au moment de la compilation (consultez compileSdkVersion pour comprendre en quoi cela diffère des builds Java) et identifie la version minimale de l'OS avec laquelle votre code sera compatible.

La minSdkVersion sert à déterminer les fonctionnalités pouvant être utilisées lors de la compilation de votre code. Par exemple, cette propriété détermine les fonctionnalités FORTIFY utilisées dans libc et contribue également à améliorer les performances ou la taille (telles que les hachages GNU ou RELR) pour vos binaires non compatibles avec les anciennes versions d'Android. Même si vous n'utilisez pas de nouvelles API, cette propriété régit toujours la version minimale compatible de l'OS de votre code.

Pour une nouvelle application, consultez les données de répartition des utilisateurs dans le nouvel assistant de projet d'Android Studio ou sur apilevels.com. Choisissez l'équilibre entre la part de marché potentielle et les coûts de maintenance. Plus votre minSdkVersion est basse, plus vous passerez de temps à contourner d'anciens bugs et à ajouter des comportements alternatifs pour les fonctionnalités qui n'ont pas encore été implémentées.

Pour une application existante, définissez une minSdkVersion plus élevée chaque fois que les coûts de maintenance ne sont plus justifiés pour les anciens niveaux d'API, ou plus basse si vos utilisateurs le demandent et que les nouveaux coûts de maintenance sont justifiés. La Play Console dispose de métriques spécifiques à la répartition des utilisateurs de votre application.

La minSdkVersion de votre application est mise à la disposition du préprocesseur via la macro __ANDROID_MIN_SDK_VERSION__ (l'ancienne macro __ANDROID_API__ est identique, mais privilégiez la nouvelle, car sa signification est plus claire). Cette macro étant définie automatiquement par Clang, aucun en-tête n'est nécessaire pour l'utiliser. Pour les builds du NDK, cette macro est toujours définie.