在项目的app module中的build.gradle文件中,我们经常看到下面的配置:
defaultConfig {
ndk {
abiFilters "armeabi", "armeabi-v7a"
}
}
- 问题:为什么要在build.gradle文件中配置abiFilters?
答案:.so文件有多种类型,如果所有类型都引入,项目就太大了。所以需要过滤。 - 问题:.so是干啥的?
答案:.so的全程是Shared Object,所以有翻译为共享库,so文件相当于windows上的dll文件(Dynamic Link Library,动态链接库),只可以在Linux系统运行。so文件是二进制文件,与exe相似,但是不能执行。二进制文件在cpu上运行需要一套规范,这个规范就是abi(Application Binary Interface),abi包含了指令集、内存对齐、可用的系统函数库等。不同的cpu就有不同的CPU架构,也就有了不同的abi类型。 - so文件有哪些类型?abiFilter关so文件什么事?
android系统支持7中cpu架构,就有7种abi类型。适配7种类型,就需要引入7份so文件,项目过大,也没有必要。所以需要设置abiFilter。 - 问题:android项目什么时候需要用到so文件?
答案:开发Android应用时,有时候Java层的编码不能满足实现需求,常见的场景如:加解密算法,音视频编解码等。这就需要用C/C++实现后生成SO文件,再用System.loadLibrary()加载进行调用,这就是JNI层的实现。
例如集成百度地图sdk,需要从百度地图开放平台下载必要的jar文件和so文件。 - 问题:abiFilters的功能是什么?
答案:设置需要支持的CPU架构,上面的代码就表示,必须支持armeabi和armeabi-v7a这两种CPU架构。 - 问题:abiFilters外层包裹着ndk,这个和ndk有什么关系?
答案:android开发中,生成so文件的方式之一就是通过ndk生成,所以要事先配置ndk,那么abiFilters被包裹在ndk内部就不奇怪了。ndk开发本来就需要定义生成的so文件的类型。
参考1:关于abi
参考2:abiFilter配置
参考:jar文件与so文件的区别
参考:android so文件详细介绍
参考:so文件与abi的关系
参考:ARM架构与X86架构的区别