Android SDK 版本属性

Android 应用可以在其 build.gradle 文件中设置许多 SDK 版本属性。Android build.gradle 文档说明了这些属性对应用一般而言的含义。本文档解释了这些属性如何影响 NDK 构建。

compileSdkVersion

此属性对 NDK 构建没有影响。NDK 的 API 可用性由 minSdkVersion 控制。这是因为 C++ 符号在库加载时就会立即解析,而不是像 Java 那样在首次调用时才延迟解析。使用在 minSdkVersion 中不可用的任何符号会导致库在不具有新 API 的操作系统版本上加载失败,无论是否调用这些 API。

对于新应用,选择最新的可用版本。对于现有应用,在方便时更新到最新版本。

targetSdkVersion

与 Java 类似,应用的 targetSdkVersion 可以改变原生代码的运行时行为。系统中的行为更改,在可行的情况下,仅应用于 targetSdkVersion 大于或等于引入该更改的操作系统版本的应用。

对于新应用,选择最新的可用版本。对于现有应用,在方便时更新到最新版本(更新 compileSdkVersion 之后)。

虽然应用开发者通常知道他们应用的 targetSdkVersion,但此 API 对于无法知道其用户将选择哪个 targetSdkVersion 的库开发者非常有用。

在运行时,您可以通过调用 android_get_application_target_sdk_version() 获取应用使用的 targetSdkVersion。此 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 级别。您可以通过调用 android_get_device_api_level() 获取应用运行的设备的 API 级别。此函数具有以下签名

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

build.gradle 文件中设置的 minSdkVersion 决定了构建时可用的 API(请参阅compileSdkVersion 以了解这与 Java 构建为何不同),并决定了您的代码兼容的最低操作系统版本。

NDK 使用 minSdkVersion 来确定在编译你的代码时可以使用哪些特性。例如,这个属性决定了在 libc 中使用哪些 FORTIFY 特性,并且对于与旧版本 Android 不兼容的你的二进制文件,还可以启用性能或大小方面的改进 (例如,GNU hashesRELR)。即使你没有使用任何新的 API,这个属性仍然决定着你的代码支持的最低操作系统版本。

对于新应用,请参阅 Android Studio 新建项目向导或 apilevels.com 中的用户分布数据。在潜在市场份额和维护成本之间进行权衡。minSdkVersion 越低,您将花费越多时间来处理旧 bug 并为尚未实现的功能添加回退行为。

对于现有应用,当旧 API 级别的维护成本不再划算时,提高您的 minSdkVersion;如果您的用户需要并且值得付出新的维护成本,则可以降低它。Play 控制台提供了特定于您的应用用户分布的指标。

您应用的 minSdkVersion 可通过 __ANDROID_MIN_SDK_VERSION__ 宏(旧版 __ANDROID_API__ 相同,但首选前者,因为其含义更清晰)提供给预处理器。此宏由 Clang 自动定义,因此无需包含任何头文件即可使用。对于 NDK 构建,此宏始终定义。