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

时间:2018-11-26 07:57:41

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

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

我一直在尝试使构建基础结构现代化,其中一部分是使用更新的SDK和NDK版本,这些版本不再支持NDK平台9(现在的最低版本为16)。

更新我们针对其构建的目标NDK和/或不更新至最新的NDK平台级别(当前为28)是否有任何优势,或者始终更新它是一个好主意?新的NDK发布时,NDK目标平台级别是什么?

2 个答案:

答案 0 :(得分:1)

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

  • 不再支持GCC。在NDK r18中已将其删除。
  • 已删除了对ARMv5(armeabi),MIPS和MIPS64的支持。从r17开始,尝试构建任何这些ABI都会导致错误。

此外,每个新修订版几乎总是存在一些错误修复和安全性增强。就我个人而言,坚持使用旧版本的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-14 android-15 的平台。

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

  • ANDROID_PLATFORM CMake变量:此变量用于指定目标Android平台的名称。例如,android-18指定Android 4.3(API级别18)。您有两个选项来配置要构建的android平台,一个是此CMake变量,另一个是miniSdkVersion。还要注意,CMake具有选择最佳平台版本的逻辑,不一定等于所说的minSdkVersion

      
        
    1. 如果ABI的平台版本等于minSdkVersion,则CMake使用该版本。
    2.   
    3. 否则,如果ABI的平台版本低于minSdkVersion,则CMake将使用这些平台中的最高版本。这是一个合理的选择,因为缺少平台版本通常意味着自从先前的可用版本以来,本机平台API一直没有更改。
    4.   
    5. 否则,CMake将使用高于minSdkVersion的下一个可用平台版本。
    6.   

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

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

答案 1 :(得分:1)

增加NDK API级别的唯一缺点是,这等效于您的minSdkVersion。如果您增加minSdkVersion,那么您将放弃对旧设备的支持。

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

升级minSdkVersion优点是,您可以使用更多的API,并且要测试的配置更少(假设较旧的设备可能会遇到更多问题,这可能是由于大大减少了所需的工程工作量。

正确的API级别会因应用程序而异(尽管有趣的是有twitter account that gives a reasonable suggestion)。检查您的使用次数,查看您的用户所在的位置,并与支持较旧版本带来的困难进行权衡。如果您的应用程序像是高保真游戏,Jelly Bean设备很可能无法以任何合理的性能运行您的应用程序,因此没有必要支持这些设备。