Android NDK开发详解之编写C/C++代码中的Android SDK 版本属性)

本文详细解释了AndroidNDK开发中compileSdkVersion、targetSdkVersion、maxSdkVersion和minSdkVersion的作用,强调了它们对C++代码兼容性和API可用性的影响,以及如何根据应用市场和维护成本选择合适的SDK版本。
摘要由CSDN通过智能技术生成

Android NDK开发详解之编写C/C++代码中的Android SDK 版本属性

本部分将讨论如何使用 NDK 提供的库。
注意:有关导入预构建库(未包含在 NDK 中的库)的指南已移至各个构建系统的相关部分。请根据您的项目需求参阅 CMake 或 ndk-build 指南。

文中说明了 NDK 提供的 C ++ 运行时,并介绍了 NDK 提供的其他库(例如 OpenGL ES 和 OpenSL ES)以及支持这些库所需的最低 Android API 级别。

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,此属性仍然决定您的代码支持的最低操作系统版本。
警告:即使您的原生库使用较新的 minSdkVersion 构建,您的应用仍有可能可以在较旧设备上运行。请勿依赖此行为。因为无法保证此行为能够正常工作,而且此行为可能不适用于其他 NDK 版本、操作系统版本或具体设备。

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

对于现有应用,请在旧的 API 级别不再值得维护的时候提高 minSdkVersion 级别;或者在您的用户要求降低 API 级别且降低后的级别值得维护时降低 API 级别。Play 管理中心会针对您的应用提供用户分布指标。
注意:NDK 有其自己的 minSdkVersion(在 /meta/platforms.json 中定义)。这是此 NDK 支持的最低 API 级别。 请勿将应用的 minSdkVersion 设置为低于此值。Play 可能会允许您的应用安装在旧版设备上,但 NDK 代码可能无法正常运行。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值