最近项目中遇到了要使用opencv的状况,涉及到了abi兼容的选择。由于若是所有都适配的话,包很大,这样兼容那些用户数极少的cpu就很不划算,因此我只适配了armeabi-v7a这一个。可是今天在x64-v8a的模拟器上看的时候,提示个人library.so文件找不到,我记得这个应该是向下兼容的,可是出现这种状况很奇怪,因而我就在网上找了找答案。架构
在app的gradle的defaultConfig里面加上这么一句app
ndk { abiFilters "armeabi-v7a" // 指定要ndk须要兼容的架构(这样其余依赖包里mips,x86,armeabi,arm-v8之类的so会被过滤掉) }
这句话的意思就是指定ndk须要兼容的架构,把除了v7a之外的兼容包都过滤掉,只剩下一个v7a的文件夹。用了这个方法以后,确实解决了问题。这就是解决方法。框架
其实这个方法我开始是很奇怪的,我明明没有指定其余的兼容框架,为何会须要一个过滤。我打来了apk的包,找到了里面的lib目录,发现里面有不少的兼容目录,而后看到里面目录里面的是一个fresco的.so文件。也就是说,fresco作了各个平台的兼容,因此它建立了各个兼容平台的目录。由于只要出现了这个目录,系统就只会在这个目录里找.so文件而不会遍历其余的目录,因此就出现了以前找不到.so文件的状况(由于其余目录没有个人.so文件)。性能
为了决定最后适配的abi版本,我下载了排行前几名的app,而后打开以后发现,他们基本上只适配了一个armeabi,少数会再加上v7a。我了解到的状况是armeabi性能较差,可是兼容性最好,v7a对于浮点计算的cpu来讲性能更好,不兼容不支持浮点运算的cpu。我想到的是目前的手机cpu绝大多数应该是支持浮点运算的,并且安卓从2.2开始就支持v7a,因此v7a的兼容性应该也不是问题。不管如何,abiFilters仍是应该添加的。gradle