不更新目标 NDK 平台有什么好处吗?

Is there any advantage to not updating target NDK platform?

我正在维护一个(相对)旧的 Android 应用程序,它使用 NDK 构建的库来实现某些功能。它最初是为 NDK 平台级别 9 构建的。

我一直在努力实现构建基础设施的现代化,作为其中的一部分,我正在使用更新的 SDK 和 NDK 版本,这放弃了对 NDK 平台 9 的支持(最低版本现在是 16)。

更新我们构建的目标 NDK,and/or不更新到最新的 NDK 平台级别(当前为 28),有什么好处吗?在发布新的 NDK 时更新 NDK 目标平台级别总是一个好主意吗?

可能,使用 "proper" NDK 版本是更好的选择,而不是坚持使用太旧的 NDK 版本。使用 "catching the time" NDK 版本的优势之一是 适应 Android ABI 更改 以及编译器更改的改进以及 Android API 版本进化。例如。

  • 不再支持 GCC。它在 NDK r18 中被删除。
  • 已删除对 ARMv5 (armeabi)、MIPS 和 MIPS64 的支持。自 r17 以来,尝试构建这些 ABI 中的任何一个都将导致错误。

此外,每个新修订版几乎总是有一些错误修复和安全性增强。我个人认为坚持使用旧版本的 NDK 没有太多附加值。

Is there any advantage to not updating the target NDK we build against

也许不更新NDK版本的好处是让你的项目兼容那些即将消失的历史设备

您可以查看 NDK 的发行说明以了解其演变。 https://developer.android.com/ndk/downloads/revision_history

对于大家对armeabi-v7a的关注,官方是这样说的https://developer.android.com/ndk/guides/abis#v7a


-- 编辑 --

澄清一些事情:

  • NDK 修订版:每个修订版通常 add/remove 功能和支持的平台。目前最新版本是r18b。相比r16b,去掉了android-14android-15.

    [平台=69=]
  • minSdkVersion:在模块级 [=14] 的 defaultConfigproductFlavors 块中设置 minSdkVersion 属性 =] 文件。这确保您的库仅供安装在设备上的应用程序使用 运行 Android.

  • 的适当版本
  • ANDROID_PLATFORM CMake变量:该变量用于指定目标Android平台的名称。例如,android-18 指定 Android 4.3(API 级别 18)。你有两个选项来配置你正在构建的android平台,一个是这个CMake变量,另一个是miniSdkVersion。还要注意,CMake 有自己的逻辑来选择 best 平台版本,不一定等于所说的 minSdkVersion

    1. If there exists a platform version for the ABI equal to minSdkVersion, CMake uses that version.
    2. Otherwise, if there exists platform versions lower than minSdkVersion for the ABI, CMake uses the highest of those platform versions. This is a reasonable choice because a missing platform version typically means that there were no changes to the native platform APIs since the previous available version.
    3. Otherwise, CMake uses the next available platform version higher than minSdkVersion.

因此,当您升级 NDK 修订版 并仔细检查您所需的 android 平台是否存在于 NDK 平台目录中时,例如android-ndk-r16b/platforms

参考文献:https://developer.android.com/ndk/guides/cmake

提高您的 NDK API 级别的唯一缺点是这相当于您的 minSdkVersion。如果您增加 minSdkVersion,您将放弃对旧设备的支持。

NDK 本身仅在用户数量很少时才会放弃对 API 级别的支持。 API 16 级及以上用户占所有用户的 99% 以上。如果出于某种原因,您的应用程序的使用数字显示姜饼或 ICS 上有大量用户,您将需要坚持使用较旧的 NDK 以继续支持这些设备。

升级 minSdkVersion 优势 是您可以访问更多 API 并且可以测试的配置更少(假设较旧的设备可能会有更多问题,这可能会大大减少所需的工程工作量)。

正确的 API 级别因应用程序而异(尽管有趣的是 twitter account that gives a reasonable suggestion)。检查您的使用数量并查看您的用户在哪里,并平衡它与支持旧版本所带来的困难。如果您的应用程序类似于高保真游戏,那么 Jelly Bean 设备很可能无法 运行 您的应用程序以任何合理的性能运行,因此支持这些设备毫无意义。