【问题标题】: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 目标平台级别?

【问题讨论】:

    标签: android android-ndk android-api-levels


    【解决方案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

      1. 如果存在等于 minSdkVersion 的 ABI 平台版本,CMake 将使用该版本。
      2. 否则,如果 ABI 存在低于minSdkVersion 的平台版本,CMake 将使用这些平台版本中的最高版本。这是一个合理的选择,因为缺少平台版本通常意味着自上一个可用版本以来原生平台 API 没有任何更改。
      3. 否则,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 设备很可能无法以任何合理的性能运行您的应用程序,因此支持这些设备是没有意义的。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2011-06-01
      • 2019-01-18
      • 2020-10-29
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多