Android SDK 版本属性

Android 应用可在其 build.gradle 文件中设置多项 SDK 版本属性。Android build.gradle 文档说明了这些属性对于应用的一般含义。本文档介绍了这些属性如何影响 NDK build。

compileSdkVersion

此属性对 NDK 构建没有任何影响。NDK 的 API 可用性受 minSdkVersion 约束。这是因为 C++ 符号应在库加载时被即时解析,而不是延迟到首次调用时解析(像在 Java 中一样)。如果在 minSdkVersion 中使用任何不可用的符号,将会导致库在不具备新 API 的操作系统版本上加载失败,无论这些 API 是否被调用都是如此。

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

targetSdkVersion

与 Java 类似,应用的 targetSdkVersion 可以改变原生代码的运行时行为。系统中的行为变更仅会在可行情况下影响满足以下条件的应用:targetSdkVersion 高于或等于引入相应变更的操作系统版本。

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

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

在运行时,您可以通过调用 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 build 没有任何影响。

minSdkVersion

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

NDK 使用 minSdkVersion 来确定在编译代码时可以使用哪些功能。例如,此属性决定 libc 中使用的 FORTIFY 功能,如果您的二进制文件与旧版 Android 系统不兼容,此属性还可能会为这些二进制文件启用性能或大小改进(例如 GNU 哈希RELR)。即使您不使用任何新的 API,此属性仍然决定您的代码支持的最低操作系统版本。

对于新应用,请参阅 Android Studio 的 New Project 向导中或 apilevels.com 上的用户分布数据。请在潜在市场份额和维护成本之间做出权衡。minSdkVersion 越低,您就需要花费越多时间来解决旧 bug,并为当时尚未实现的功能添加回退行为。

对于现有应用,请在旧的 API 级别不再值得维护的时候提高 minSdkVersion 级别;或者在您的用户要求降低 API 级别且降低后的级别值得维护时降低 API 级别。Play 管理中心会针对您的应用提供用户分布指标。

您的应用的 minSdkVersion 会通过 __ANDROID_MIN_SDK_VERSION__ 宏提供给预处理器(旧版 __ANDROID_API____ANDROID_MIN_SDK_VERSION__ 完全相同,倾向于使用 __ANDROID_MIN_SDK_VERSION__ 是因为其含义更清晰)。此宏由 Clang 自动定义,因此无需添加头文件即可使用它。对于 NDK build,系统始终会定义此宏。