说说Android项⽬中的armeabi,armeabi-v7a和x86
so.png
1.区别
这三者都表⽰的是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。
2.Android设备如何加载.so⽂件
当⼀个应⽤安装在设备上,只有该设备⽀持的CPU架构对应的.so⽂件会被安装。不同CPU架构的Android⼿机加载时会在libs下⾃⼰对应的⽬录,从对应的⽬录下寻需要的.so⽂件;如果没有对应的⽬录,就会去armeabi下去寻,如果已经有对应的⽬录,但是如果没有到对应的.so⽂件,也不会去armeabi下去寻了。
以x86设备为例,x86设备会在项⽬中的 libs⽂件夹寻是否含有x86⽂件夹,如果含有x86⽂件夹,则默认为该项⽬有x86对应的so可运⾏⽂件,只有x86⽂件夹⽽⽂件夹下没有so,程序运⾏也是会出现findlibrary returned null的错误的;如果⼯程本⾝不含有x86⽂件夹,则会寻armeabi或者armeabi-v7a⽂件夹,兼容运⾏。以armeabi-v7a设备为例,该Android设备当然优先寻libs⽬录下的armeabi-v7a⽂件夹,同样,如果只有armeabi-v7a⽂件夹⽽没有 so也是会报错的;如果不到armeabi-v7a⽂件夹,则寻armeabi⽂件夹,兼容运⾏该⽂件夹下的so,但是不能兼容运⾏x86的so。所以项⽬中如果只含有x86的so,在armeabi和armeabi-v7a也是⽆法运⾏的。以上就是不同CPU架构运⾏时加载so的策略。
3.适配不同的平台
⽬前主流的Android设备是armeabi-v7a架构的,然后就是x86和armeabi了。如果同时包含了 armeab
i,armeabi-v7a和x86,所有设备都可以运⾏,程序在运⾏的时候去加载不同平台对应的so,这是较为完美的⼀种解决⽅案,但是同时也会导致包变⼤。
armeabi-v7a是可以兼容armeabi的,⽽v7a的CPU⽀持硬件浮点运算,⽬前绝⼤对数设备已经是armeabi-v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi下了。x86也是可以兼容armeabi平台运⾏的,另外需要指出的是,打出包的x86的so,总会⽐armeabi平台的体积更⼩,对于性能有洁癖的童鞋们,还是建议在打包so的时候⽀持x86。
4.第三⽅平台的.so库怎么处理
第三⽅的类库只提供了armeabi下的.so⽂件,我们项⽬⾥适配了armeabi-v7a和x86,如果不在对应的⽂件下放对应的.so⽂件,就可能导致某些Android设备会出⼀些问题,我们可以复制armeabi下得.so⽂件到不同的⽂件夹下。如果第三⽅提供了不同平台的.so⽂件,则复制不同平台的.so⽂件到项⽬中对应的⽂件夹下即可。
关于.so⽂件之前有⼀个坑,svn会把提交的so⽂件过滤掉,在接第三⽅SDK的时候通过SVN更新了⽂档,但是没有注意到少了⼏个so⽂件,浪费了⼤把的时间去原因。记得去掉svn对so的忽略
Subversion忽略设置.png
x86架构和arm架构区别兼容问题可以参考这篇⽂章:
Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so⽂件兼容问题
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论