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 功能,并且还可以为二进制文件启用性能或大小改进(例如 GNU 哈希RELR),这些改进与旧版 Android 不兼容。即使您不使用任何新 API,此属性仍然控制代码的最低支持操作系统版本。

对于新应用,请在 Android Studio 的新建项目向导中或 apilevels.com 上查看用户分布数据。在潜在市场份额和维护成本之间找到平衡点。您的 minSdkVersion 越低,您就需要花费更多时间来处理旧错误并为尚未实现的功能添加回退行为。

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

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