Android 中arm64-v8a、armeabi-v7a、armeabi、x86 使用探究

前几天在做ndk这块 会编译so到指定目录下 但是不太清楚 so库对应的文件夹是兼容哪些CPU的 今天来简单整理一下
Android 设备的CPU类型(通常称为”ABIs”)

区别

这三者都表示的是CPU类型,早期的Android系统几乎只支持ARMv5的CPU架构,但是现在已经有7种了。ARMv5ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8MIPS64x86_64 (从2014年起),每一种都关联着一个相应的ABI(应用程序二进制接口(ApplicationBinary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库)。Android现在的主流CPU是armeabi-v7aarmeabi-v7a是针对有浮点运算或高级扩展功能的ARMv7 CPU

在 Android 系统中 ndk 默认会生成如下 7 种 .so

Android 系统中 ndk 默认生成的库

在 apk 文件中带这么多版本的 .so 是一种很实用的做法,一般也基本没人这么干,会造成包体积很大:

  • mips / mips64: 极少用于手机可以忽略

  • x86 / x86_64: x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现 对 arm .so 的兼容,再考虑 x86 1% 以下的市场占有率,x86 相关的两个 .so 也是可以忽略的

  • armeabi: ARM v5 这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈

  • armeabi-v7a: ARM v7 目前主流版本

  • arm64-v8a: 64位支持 这是在MIPS64架构上增加了ARMv7架构中已经拥有的的TrustZone技术、虚拟化技术及NEON advanced SIMD技术等特性,研发成的。

适配不同的平台

目前主流的Android设备是armeabi-v7a架构的,然后就是x86armeabi了。如果同时包含了 armeabiarmeabi-v7ax86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,但是同时也会导致包变大。
   armeabi-v7a是可以兼容armeabi的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是armeabi-v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi下了。x86也是可以兼容armeabi平台运行的,另外需要指出的是,打出包的x86so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86
放置 .so 文件的正确姿势其实就两句话:

.so 文件的正确姿势

  • 为了减小 apk 体积,只保留 armeabiarmeabi-v7a 两个文件夹,并保证这两个文件夹中 .so 数量一致
  • 对只提供 armeabi 版本的第三方 .so,原样复制一份到 armeabi-v7a文件夹即可。

你可能感兴趣的:(Android 中arm64-v8a、armeabi-v7a、armeabi、x86 使用探究)