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

Posted

技术标签:

【中文标题】不更新目标NDK平台有啥好处吗?【英文标题】:Is there any advantage to not updating target NDK platform?不更新目标NDK平台有什么好处吗? 【发布时间】:2019-04-27 20:14:17 【问题描述】:

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

我一直在尝试对构建基础架构进行现代化改造,作为其中的一部分,我正在使用更新的 SDK 和 NDK 版本,它们不再支持 NDK 平台 9(最低版本现在是 16)。

更新我们构建的目标 NDK 和/或不更新到最新的 NDK 平台级别(当前为 28)是否有任何优势,或者更新新 NDK 发布时的 NDK 目标平台级别?

【问题讨论】:

【参考方案1】:

可能,使用“正确”的 NDK 版本是一个更好的选择,而不是坚持使用太旧的 NDK 版本。使用“赶上时间”NDK 版本的优点之一是适应 Android ABI 更改,以及随着 Android API 版本演变而改进编译器更改。例如。

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

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

更新我们构建的目标 NDK 有什么好处

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

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

对于您对 armeabi-v7a 的关注,这是它的官方说法https://developer.android.com/ndk/guides/abis#v7a。


-- 编辑 --

澄清几点:

NDK 修订版:每个修订版通常会添加/删除功能和支持的平台。目前最新版本是 r18b。与 r16b 相比,移除了 android-14android-15 的平台。

minSdkVersion:在模块级build.gradle 文件的defaultConfigproductFlavors 块中设置minSdkVersion 属性。这可确保您的库仅被安装在运行适当版本 Android 的设备上的应用使用。

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

    如果存在等于 minSdkVersion 的 ABI 平台版本,CMake 将使用该版本。 否则,如果 ABI 存在低于minSdkVersion 的平台版本,CMake 将使用这些平台版本中的最高版本。这是一个合理的选择,因为缺少平台版本通常意味着自上一个可用版本以来原生平台 API 没有任何更改。 否则,CMake 将使用高于 minSdkVersion 的下一个可用平台版本。

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

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

【讨论】:

关于:“与那些即将消失的历史设备兼容”-您的意思是过时的构建架构,而不是操作系统版本,对吗?我仍然应该支持较旧的操作系统版本(至少 Lollipop 仍然是一个要求),所以我想绝对确定使用较新的 NDK 不会阻止应用程序成功安装并在较旧的操作系统上运行(安装在支持架构(例如 ARMv7)上运行的设备上)。 是的,例如使用较新的 NDK 将不会构建 armeabi 库,如果您错过此 abi 将导致 UnsatisfiedLinkError。但是,你真的不需要维护这么旧的 NDK 版本,即 r9。对于 armeabi-v7a,它仍然会存在一段时间,即使您使用最新的 NDK,您仍然可以编译它并在旧设备上正常运行。 虽然这是个好建议,但它并不能回答问题。问题不在于是否建议更新 NDK,而是是否建议更新您的 NDK API 级别。这两件事是不一样的。【参考方案2】:

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

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

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

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

【讨论】:

以上是关于不更新目标NDK平台有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章

目标x86_64的NDK构建导致错误

更新到 watchOS 6 后,滚动视图停止工作,有啥变化吗?

go语言到底有啥好处

冗余限定符有啥缺点吗?有啥好处吗?

使用不返回任何内容的 return 语句有啥好处吗?

目标平台在 Xamarin Studio 中被禁用?