Android 中arm64-v8a、armeabi-v7a、a
前几天在做ndk这块 会编译so到指定目录下 但是不太清楚 so库对应的文件夹是兼容哪些CPU的 今天来简单整理一下
Android 设备的CPU类型(通常称为”ABIs”)
区别
这三者都表示的是CPU类型,早期的Android系统几乎只支持ARMv5
的CPU架构,但是现在已经有7种了。ARMv5
,ARMv7
(从2010年起),x86
(从2011年起),MIPS
(从2012年起),ARMv8
,MIPS64
和x86_64
(从2014年起),每一种都关联着一个相应的ABI(应用程序二进制接口(ApplicationBinary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库)。Android现在的主流CPU是armeabi-v7a
。armeabi-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
架构的,然后就是x86
和armeabi
了。如果同时包含了 armeabi
,armeabi-v7a
和x86
,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so
,这是较为完美的一种解决方案,但是同时也会导致包变大。
armeabi-v7a
是可以兼容armeabi
的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是armeabi-v7a
了,所以为了性能上的更优,就不要为了兼容放到armeabi
下了。x86也是可以兼容armeabi
平台运行的,另外需要指出的是,打出包的x86
的so
,总会比armeabi
平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so
的时候支持x86
。
放置 .so 文件的正确姿势其实就两句话:
.so 文件的正确姿势
- 为了减小 apk 体积,只保留
armeabi
和armeabi-v7a
两个文件夹,并保证这两个文件夹中 .so 数量一致 - 对只提供
armeabi
版本的第三方 .so,原样复制一份到armeabi-v7a
文件夹即可。