Android cpu架构兼容so库问题
2018-01-30 本文已影响0人
小风小雨
1. Android 目前支持的7中cpu类型
设备类型 | 支持so库 | 说明 |
---|---|---|
ARMv5 设备 | 只支持armeabi | 早期 |
ARMv7 设备 | 支持 armeabi 和 armeabi-v7a | 从2010年起 |
ARMv8 设备 | 支持 armeabi-v7a、armeabi 和 arm64-v8a | 2014年起 |
X86 设备 | 支持 armeabi(性能有所损耗) 和 x86 | 主要是运用在平板上 |
x86_64 设备 | 支持 x86 和 x86_64、armeabi | 主要是运用在平板上 |
mips 设备 | 支持 mips | 较少 |
mips_64 设备 | 支持 mips 和 mips_64 | 较少 |
2. CPU架构简介
CPU架构 | 简介 | 说明 |
---|---|---|
armeabi | ARM架构的默认选项,支持软浮点运算,但不支持硬件辅助浮点运算,支持所有的 ARM* 设备,目前只支持该armeabi的机型极少。 | 缺点:不支持硬件浮点,性能较差。优点:兼容所有机型(建议接入第三方sdk,支持该so文件) |
armeabi-v7a | armeabi-v7a 向下兼容,在兼容 armeabi 的基础上,支持基于 ARM* v7 的设备,支持硬件 FPU 指令,支持硬件浮点运算,目前大部分机器都属于armeabi-v7a | 目前市面机型较多,且兼容和性能综合性最好(建议接入第三方sdk,必须支持该so文件) |
arm64-v8a | 向下兼容支持 armeabi-v7a、armeabi 和 arm64-v8a | 向下兼容armeabi-v7a、armeabi 和 arm64-v8a。(接入第三方sdk,支持该so文件最好) |
X86 | 向下兼容支持 armeabi(性能有所损耗) 和 x86 | PC,平板领域,兼容armeabi,无x86的so文件,兼容armeabi性能有所损耗 |
x86_64 | 向下兼容支持 x86 和 x86_64、armeabi | Pc,平板领域 |
mips | 支持 mips | 高性能的嵌入式CPU构架,其出发点是高性能,主要用于路由器、猫等 |
mips_64 | 支持 mips 和 mips_64 | 高性能的嵌入式CPU构架,其出发点是高性能,主要用于路由器、猫等 |
3. Android中设备加载so策略
-
不同CPU架构的android手机加载时会在libs下找自己对应的目录,从对应的目录下寻找需要的.so文件;
-
如果没有对应的目录,就会去armeabi下去寻找,如果已经有对应的目录,却没有找到对应的.so文件,也不会去armeabi下去寻找了(这种情况会抛异常);
以armeabi-v7a设备为例,该Android设备当然优先寻找libs目录下的armeabi-v7a文件夹,同样,如果只有armeabi-v7a文件夹而没有 so也是会报错的;如果找不到armeabi-v7a文件夹,则寻找armeabi文件夹,兼容运行该文件夹下的so,但是不能兼容运行x86的so。所以项目中如果只含有x86的so,在armeabi和armeabi-v7a也是无法运行的。以上就是不同CPU架构运行时加载so的策略。
4. Android设备So兼容方案
方案编号 | 方案 | gradle配置 | 优缺点 | App举例 |
---|---|---|---|---|
N01 | 只适配 armeabi-v7a | ndk { abiFilters 'armeabi-v7a' } | 因为目前主流机型是 ARMv7,并且 ARMv8 设备也向下兼容了armeabi-v7a | Facebook、WhatsApp、王者荣耀等 |
N02 | 只适配 armeabi | ndk { abiFilters 'armeabi' } | 因为 ARMv7 、ARMv8 还是 x86 都兼容 armeabi,但是性能都会有些损耗 | 微信 |
N03 | 同时适配 armeabi-v7a 和 armeabi | ndk { abiFilters 'armeabi-v7a' , ‘armabi'} | 既能够支持所有 ARM 架构,同时又能具有 ARMv7 支持硬件浮点运算等特性 | Line |
N04 | 同时适配 x86 和 armeabi | ndk { abiFilters 'armeabi' , ‘x86’} | 既能支持所有 ARM 架构,又能支持x86架构,唯一的缺点就是没有了ARMv7 支持硬件浮点运算等一系列特性 | |
N05 | 同时适配 armeabi, armeabi-v7a 和 x86 | ndk { abiFilters 'armeabi' , ‘x86’, 'armeabi-v7a' } | 在性能方面来说是较为完美的方案,只是APK的大小也会随之的变大 | ... |
5.gradle配置ndk配置
image.png文章内容来源:
1.Android CPU架构及so库兼容问题总结
2. Android SO文件的兼容和适配
感谢原作者额分享。。。
其他分享:kotlin入门实例