以下内容转载于:http://blog.csdn.net/liumou111/article/details/52949156

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是针对有浮点运算或高级扩展功能的ARMv7CPU。

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库怎么处理

关于.so文件之前有一个坑,svn会把提交的so文件过滤掉,在接第三方SDK的时候通过SVN更新了文档,但是没有注意到少了几个so文件,浪费了一天的时间去找原因,SVN如何提交so文件(http://blog.csdn.net/wds1181977/article/details/40373373)。第三方的类库只提供了armeabi下的.so文件,我们项目里适配了armeabi-v7a和x86,如果不在对应的文件下放对应的.so文件,就可能导致某些Android设备会出一些问题,我们可以复制armeabi下得.so文件到不同的文件夹下。如果第三方提供了不同平台的.so文件,则复制不同平台的.so文件到项目中对应的文件夹下即可。

最新文章

  1. CSS中使用text-transform实现首字母大写
  2. #1094 : Lost in the City
  3. ASP.NET MVC 提示there was error getting the type的解决方法
  4. char wchar 互转 多字符 宽字符 的N种方式
  5. idea让字体更圆滑
  6. php读取大文件的方法
  7. Spring学习总结三——SpringIOC容器三
  8. Understanding the Router
  9. 我的VIM.rc
  10. SSE && WebSockets
  11. Progit Update Check Page
  12. leetcode415---字符串大数相加
  13. Android使用Sugar ORM创建数据库报no such table:...的解决方法
  14. 自动化运维工具——ansible详解(一)
  15. 前端安全之XSS攻击及防御
  16. Canvas-自由绘制
  17. 创建ndarray
  18. Percona XtraBackup 关于 MySQL备份还原的详细测试
  19. Python模拟接口登录
  20. 转载:如何在Ubuntu 18.04上使用UFW设置防火墙

热门文章

  1. 洛谷4316 绿豆蛙的归宿(DAG递推/概率dp)
  2. throw new Error('Cyclic dependency' + nodeRep)
  3. 论文阅读笔记五十六:(ExtremeNet)Bottom-up Object Detection by Grouping Extreme and Center Points(CVPR2019)
  4. EA添加流程图
  5. 工具类_IsNull
  6. springmvc接收各种参数
  7. mpdf Could not find image file (http://local.com/xxxxx)
  8. Git钩子设置自动构建Jenkins
  9. java——并查集 UnionFind
  10. JS判断所有IE浏览器所有版本