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 hashes 或 RELR)。即使你没有使用任何新的 API,这个属性仍然决定着你的代码支持的最低操作系统版本。
对于新应用,请参阅 Android Studio 新建项目向导或 apilevels.com 中的用户分布数据。在潜在市场份额和维护成本之间进行权衡。minSdkVersion
越低,您将花费越多时间来处理旧 bug 并为尚未实现的功能添加回退行为。
对于现有应用,当旧 API 级别的维护成本不再划算时,提高您的 minSdkVersion
;如果您的用户需要并且值得付出新的维护成本,则可以降低它。Play 控制台提供了特定于您的应用用户分布的指标。
您应用的 minSdkVersion
可通过 __ANDROID_MIN_SDK_VERSION__
宏(旧版 __ANDROID_API__
相同,但首选前者,因为其含义更清晰)提供给预处理器。此宏由 Clang 自动定义,因此无需包含任何头文件即可使用。对于 NDK 构建,此宏始终定义。