Свойства версии Android SDK

Приложения Android могут задавать ряд свойств версии SDK в файле build.gradle . В документации Android build.gradle объясняется, что эти свойства означают для приложения в целом. В этом документе объясняется, как эти свойства влияют на сборки NDK.

compileSdkVersion

Это свойство не влияет на сборки NDK. Доступность API для NDK определяется параметром minSdkVersion . Это связано с тем, что символы C++ обрабатываются автоматически во время загрузки библиотеки, а не лениво при первом вызове (как в Java). Использование любых символов, отсутствующих в minSdkVersion , приведёт к сбою загрузки библиотеки в версиях ОС, не имеющих нового API, независимо от того, будут ли вызываться эти API.

Для нового приложения выберите последнюю доступную версию. Для существующего приложения обновите его до последней версии, когда вам будет удобно.

targetSdkVersion

Как и в Java, значение targetSdkVersion вашего приложения может изменить поведение нативного кода во время выполнения. Изменения поведения в системе, когда это возможно, применяются только к приложениям, у которых значение targetSdkVersion больше или равно версии ОС, в которой было внесено изменение.

Для нового приложения выберите самую последнюю доступную версию. Для существующего приложения обновите его до последней версии, когда вам будет удобно (после обновления compileSdkVersion ).

Хотя разработчики приложений обычно знают targetSdkVersion своего приложения, этот API полезен для разработчиков библиотек, которые не могут знать, какую targetSdkVersion выберут их пользователи.

Во время выполнения вы можете получить версию targetSdkVersion , используемую приложением, вызвав функцию android_get_application_target_sdk_version() . Этот API доступен начиная с уровня API 24. Эта функция имеет следующую сигнатуру:

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

Другие изменения в поведении могут зависеть от уровня API устройства. Вы можете получить уровень API устройства, на котором запущено ваше приложение, вызвав функцию android_get_device_api_level() . Эта функция имеет следующую сигнатуру:

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

Получение уровней API устройства позволяет коду NDK динамически отслеживать изменения поведения платформы. Поскольку второстепенные уровни API не привязаны к изменениям поведения, и у нас нет текущих планов по добавлению новых функций NDK в второстепенные уровни API, невозможно получить полный уровень API устройства напрямую из вызова NDK.

Вы можете использовать dlopen() / dlsym() или слабые ссылки API для вызова более новых API, чем указано в minSdkVersion .

maxSdkVersion

Это свойство не влияет на сборки NDK.

minSdkVersion

Параметр minSdkVersion , заданный в файле build.gradle , определяет, какие API доступны во время сборки (см. compileSdkVersion , чтобы понять, почему это отличается от сборок Java), а также определяет минимальную версию ОС, с которой будет совместим ваш код.

Свойство minSdkVersion используется NDK для определения функций, которые могут быть использованы при компиляции вашего кода. Например, это свойство определяет, какие функции FORTIFY используются в libc, а также может включать улучшения производительности или размера (например, GNU-хэши или RELR ) для ваших двоичных файлов, несовместимых со старыми версиями Android. Даже если вы не используете новые API, это свойство по-прежнему определяет минимальную поддерживаемую версию ОС для вашего кода.

Для нового приложения ознакомьтесь с данными о распределении пользователей в мастере создания проектов Android Studio или на сайте apilevels.com . Выберите баланс между потенциальной долей рынка и затратами на поддержку. Чем ниже значение minSdkVersion , тем больше времени вы потратите на исправление старых ошибок и добавление резервных вариантов поведения для функций, которые ещё не реализованы.

Для существующего приложения увеличивайте значение minSdkVersion , когда старые уровни API перестают оправдывать затраты на обслуживание, или уменьшайте его, если ваши пользователи этого требуют и новые затраты на обслуживание оправданы. В консоли Play есть метрики, характерные для распределения пользователей вашего приложения.

Значение minSdkVersion вашего приложения предоставляется препроцессору через макрос __ANDROID_MIN_SDK_VERSION__ (старый макрос __ANDROID_API__ идентичен, но предпочтительнее первый, поскольку его значение понятнее). Этот макрос определяется Clang автоматически, поэтому для его использования не требуется включать заголовок. Для сборок NDK этот макрос всегда определён.