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了。如果同时包含了 armeabi,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的忽略!!!

兼容问题可以参考这篇文章:
Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

最新文章

  1. 重建索引提高SQL Server性能
  2. tp框架之函数调用
  3. alexkn android第一行代码-8.sqlite使用
  4. Typescript中的class interface 只是在声明,其实什么也没有干!
  5. HDU3348(贪心求硬币数
  6. 把jqmobi 變成jQuery 的插件 從此使用jQuery
  7. 关于extjs中动态添加TabPanel的tab项并以iframe显示的整理
  8. [AngularJS] Hijacking Existing HTML Attributes with Angular Directives
  9. SSIS 学习(8):事务【转】
  10. [转]Android推送方案分析(MQTT/XMPP/GCM)
  11. PHP APC缓存配置、使用详解
  12. 将网站部署到服务器上出现_STORAGE_WRITE_ERROR_问题
  13. IO流数据读写总结
  14. 将SWF文件用作资源打包
  15. 201521123052《Java程序设计》第3周学习总结
  16. 自学Python2.1-基本数据类型-字符串str(object)
  17. RegExp正则表达式规则以及常用正则表达式
  18. [Mysql]备份同库中一张表的历史记录 insert into ..select
  19. Docker 命令收集
  20. Asp.net 修改已有数据的DataTable中某列的数据类型

热门文章

  1. phpstrom 快速定位到当前编辑文件
  2. Vue 组件&组件之间的通信 之 子组件向父组件传值
  3. archer docker安装部署
  4. Oracle 12 Rman增量备份
  5. export ,export default 和 import 区别 以及用法
  6. 后台启动mysql
  7. LeetCode 05 最长回文子串
  8. oralce问题
  9. MATLAB 符号变量表达式 + 方程求解
  10. 金蝶K3常用数据表