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

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

компиляцияSdkVersion

Это свойство не влияет на сборки 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();

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 этот макрос всегда определен.