问题提出

在开发过程中我对gradle文件中的这个配置存在疑惑,这些abi是个啥?
x86等等这些不是cpu架构吗?这里的关系到底是啥?

ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }

解答

参考 :https://www.sohu.com/a/395038558_611601

什么是ABI?

ABI是英文Application Binary Interface的缩写,即应用二进制接口。

不同Android设备,使用的CPU架构可能不同,因此支持不同的指令集。

CPU 与指令集的每种组合都有其自己的应用二进制界面(或 ABI),ABI非常精确地定义了应用程序的机器代码应如何在运行时与系统交互。

您必须为要与您的应用程序一起使用的每种CPU架构指定一个ABI(Application Binary Interface)。

ABI 包含以下信息:

可使用的 CPU 指令集(和扩展指令集)。

运行时内存存储和加载的字节顺序。Android 始终是 little-endian。

在应用和系统之间传递数据的规范(包括对齐限制),以及系统调用函数时如何使用堆栈和寄存器。

可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。Android 始终使用 ELF。

如何重整 C++ 名称。

Android目前支持以下7种ABIs:

mips, mips64, X86, X86–64, arm64-v8a, armeabi, armeabi-v7a

ABI有何作用?

当我们想要在项目中使用 native(C/C++) 类库,我们必须对要支持的处理器架构提供对应编译包。每个处理器架构需要我们提供一个或多个包含native代码的.so文件。

默认情况下,为了使APP有更好的兼容性,我们使用Android Studio 或者命令打包时,会默认支持所有的架构,但相应的APK size 会疯狂的增大。

对于用户来说,目标设备只需要其中一个版本,但当用户下载APK时,会全部下载(对用户来说相当的不友好)。

  • 构建的时候使用前文提到的代码事根据不同架构进行打包,节省打包后的大小。

通过过滤实现选择性打包apk,一般arm64-v8a打包可满足最大数的设备需求。

【Android】android手机的cpu架构,gradle构建的ndk到底有啥用_v8