参考链接
思维导图
一、cpu三大架构:MIPS、ARM、X86
1. 用途分布:
armeabi系列:属于ARM (A7、A9、A15、A53、A57) 包含:高通、麒麟(华为海思)、澎湃(小米)、联发科、猎户座(三星Exynos)
mips系列:属于MIPS ,多用在网关、猫、机顶盒等。代表:中国“龙芯”
x86系列:pc模拟器、Intel Atom系列处理器(英特尔放弃应用于手机、PC、平板以及可穿戴设备的Atom处理器)
2. 详细分类:
arm:armeabi(arm v5 cpu 32位)、armeabi-v7a(针对有浮点运算或高级扩展功能的arm v7 cpu 32位)、arm64-v8a(同时包含着32位的ARMv7和64位的ARMv8两种架构)
mips:mips(32位)、mis64(64位)
x86:x86(32位)、x86_64(64位)
3. 架构与目录的对应关系
二、应用
1. 错误分析
UnsatisfiedLinkError:找不到对应的so包
分析:很多设备都支持多于一种的ABI。例如ARM64和x86设备也可以同时运行armeabi-v7a和armeabi的二进制包。当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。在x86设备上,libs/x86目录中如果存在.so文件的话,会被安装,如果不存在,则会选择armeabi-v7a中的.so文件,如果也不存在,则选择armeabi目录中的.so文件(因为x86设备也支持armeabi-v7a和armeabi)。
举例:现有一台x86设备,有a,b,c三个so文件,x86只放置a,b,其余目录都放a,b,c。则在安装apk时会安装x86目录下的so文件,即a,b,没有c。则在运行到c功能时会报UnsatisfiedLinkError错误。
解决办法:尽可能的提供专为每个ABI优化过的.so文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个ABI目录提供对应的.so文件。
2. 开发技巧
三、疑问
1. 只提供armeabi架构的.so文件而忽略其他ABIs来减小apk大小?
所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件,因此似乎移除其他ABIs的.so文件是一个减少APK大小的好技巧。但事实上并不是:这不只影响到函数库的性能和兼容性。x86设备能够很好的运行ARM类型函数库,但并不保证100%不发生crash,特别是对旧设备。64位设备(arm64-v8a, x86_64, mips64)能够运行32位的函数库,但是以32位模式运行,在64位平台上运行32位版本的ART和Android组件,将丢失专为64位优化过的性能(ART,webview,media等等)。
如有问题,麻烦指出