Android SDK 版本属性

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

compileSdkVersion

此属性对 NDK 构建没有影响。NDK 的 API 可用性由 minSdkVersion 控制。这是因为 C++ 符号在库加载时会急切解析,而不是在首次调用时延迟解析(就像在 Java 中一样)。使用 minSdkVersion 中不可用的任何符号都会导致库在没有较新 API 的 OS 版本上无法加载,而无论是否调用这些 API。

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

targetSdkVersion

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

对于新应用,请选择可用的最新版本。对于现有应用,在方便时将其更新到最新版本(在更新 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 构建的不同之处),并确定代码兼容的 OS 的最低版本。

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 构建,始终定义此宏。