android开发中经常会遇到so库放在哪个目录下的问题,今天就简单分析一下,各个架构的cpu的区别,读者只要能大致了解这些目录的含义就可以了,不必深究。

首先讲一下32位处理器与64位处理器区别

64位和32位是指CPU的通用寄存器数据宽度。

  操作系统设计初衷不同,64位操作系统的设计初衷是满足机械设计和分析、三维动画、视频编辑和创作,以及科学计算和高性能计算应用程序等领域中需要大量内存和浮点性能的客户需求,主要考虑的是运行一些比较特殊的行业性应用软件,而32位操作系统是为普通用户设计的,主要考虑的是运行日常的应用软件。

  区别:

处理器有所不同

  所谓64位处理器的“位数”,这个位数指的是CPU的GPRs(General-Purpose Registers通用寄存器)的数据宽度为64位,一次能够处理64bit的数据(32位是32bit),而寄存器是CPU中用来种暂时存放数据和地址的,是CPU构成的一部分。

软件有所区别

  64位操作系统主要考虑是运行一些比较特殊的行业性应用软件,而这些软件都是采用64位计算,所以这些软件只能运行在64位操作系统下。32位应用软件主要是一些日常软件,比如QQ、MSN等,但32位应用软件也可以兼容运行在64位操作系统下,不过这也是出于过渡上的考虑。

对内存的控制不同

  32位操作系统实际可识别的内存为3.5GB,而64位操作系统实际可支持128GB内存,这也是64位和32位在表面上以及实际价值上最主要的不同。

一. lib和libs是否一样? 
放在lib中的是被reference的,放在libs中的是被include的。 
放在libs中的文件会自动被Eclipse所include。所以不要把API放到libs里去。 
lib的内容是不会被打包到APK中,libs中的内容是会被打包进APK中

二. .so库又是什么鬼? NDK编译出来的动态链接库。 
一些重要的加密算法或者核心协议一般都用c写然后给java调用。这样可以避免反编译后查看到应用的源码。

三. .so库又该如何存放? 
放置 .so 文件的正确姿势其实就两句话: 
• 为了减小 apk 体积,只保留 armeabi 和 armeabi-v7a 两个文件夹,并保证这两个文件夹中 .so 数量一致 
• 对只提供 armeabi 版本的第三方 .so,原样复制一份到 armeabi-v7a 文件夹

BUT,处理.so文件时有一条简单却并不知名的重要法则。

你应该尽可能的提供专为每个ABI优化过的.so文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个ABI目录提供对应的.so文件。

四. libs下armeabi等的作用是什么? 
存放.so库,主要针对不同的设备兼容,也可以说是专门针对不同Android手机下CPU架构的兼容。 
下面就来扯一下安卓cpu 
Android 设备的CPU类型(通常称为”ABIs”)

早期的Android系统几乎只支持ARMv5的CPU架构,你知道现在它支持多少种吗?7种! 
Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。 
应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。

如下图所示:

各版本分析如下: 
• mips / mips64: 极少用于手机可以忽略 
• x86 / x86_64: x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现 对 arm .so 的兼容,再考虑 x86 1% 以下的市场占有率,x86 相关的两个 .so 也是可以忽略的 
• armeabi: ARM v5 这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈 
• armeabi-v7a: ARM v7 目前主流版本 
• arm64-v8a: 64位支持

所谓的ARMv8架构,就是在MIPS64架构上增加了ARMv7架构中已经拥有的的TrustZone技术、虚拟化技术及NEON advanced SIMD技术等特性,研发成的。

64位ARMv8架构中包含两个执行状态:AArch32(也就是我们常说的ARMv7)和AArch64(ARMv8)。AArch64执行状态针对64位处理技术,引入了一个全新指令集A64(也就是基于收购的MIPS64架构),而AArch32执行状态将支持现有的ARM指令集。所以64位的ARM处理器中同时包含着32位的ARMv7和64位的ARMv8两种架构。因此:

看到这里,你一定明白了,ARM64位处理器和电脑的64位处理器是两个截然不容的概念,他并不是64位就能原生向下兼容32位程序,而是通过64位处理器中集成的32位架构来运行32位程序。说得通俗点,它不是以64位形态来运行32位程序,却是以32位的形态运行32位程序的。

由于目前新出的64位处理器包含两个架构,而且制程技术没有提升(28nm),同时在手机与平板上,芯片面积有着严格的限定,不能过分增加,这导致64位ARM处理器平均分配到每个架构的晶体管数量锐减,也就是说从64位处理器中的32位架构方面,对于同规格的32位处理器而言,不但没有提高,性能反而是一定规模下降的。但处理器厂家又必须给消费者一个交代,以更好的推广64位,所以厂家就必须在其他方面提升性能,以弥补CPU的晶体管数量减少带来的损失。比如:更换性能更强的GPU、提升内存带宽、多核心虚拟单颗核心提升单核性能、联合跑分软件商修改跑分权重(提升GPU分数,降低CPU分数的权重)等等。这样,扬长避短,最终到达消费者手里,用跑分软件一跑,确实有提升,用户开心,厂家腰包也鼓了。

综上所述,ARM64位处理器从严格意义来说,叫它ARM32+64更加贴切,他相对于ARM32位处理器,有倒退的地方,也有进步的余地,但正因为倒退激起了ARM进取的决心,让它大刀阔斧的向前变革,不得不说也算一种进步。但ARM64在的手机上真的有用吗?我只能说,目前确实没啥用,但今后或许有。(其他地方搜罗的)

真正的64位手机并不止单纯停留在处理器上,如果只因为它的处理器是64位,就称其为64位手机的话,我们可以毫不犹疑的说这可能是虚假宣传,好在联想很聪明,在发布A678t和A805e宣传的时候,只说64位处理器手机。

“64位处理器手机”与“64位手机”是两种天壤之别的概念:只要是处理器包含64架构位的,就可以称“64位处理器手机”,这种手机也许还运行不了64位程序,只是用来抢占市场,和32位手机比起来优势并不明显。

“64位手机”就不同了:它包含着64位处理器、64位标准系统、64位安卓虚拟机、以及64位程序,这才是真正意义上的64位手机!

谷歌官方曾说,安卓很早前就支持64位了,这话不假,从Android4.0到Android4.4,安卓系统都支持64位的硬件,但是这仅仅表示底层驱动支持64位,能运行在64位的硬件之上,仅此而已。然而,上层运行软件的,无论是Dalvik的虚拟机,还是ART虚拟机都是32位的。也就是说,只要你的手机系统是Android4.0—4.4,即便你的处理器是64位,也只能在32位虚拟机下运行32位程序,就算真的64位程序摆在你眼前,也无法安装。

Android L开始才真正支持32位和64位的ART虚拟机,配合上64位处理器,名正言顺的运行64位软件。但是问题又来了,没有软件商 愿意开发64位程序。 
ARMv8是一套不错的指令集,它既支持未来的64位程序,也向下兼容现有32位程序。有了ARMv8的支撑,以后的64位手机操作系统,如Android L 64bit都可以简单、高效地支持现有的32位App,你不用担心兼容性问题。

PS:

在2011年11月,ARM公司发布了新一代处理器64位架构ARMv8的部分技术细节(也就是我们常说的Cortex-A57A53),代表着未来移动处理器迈入64位行列。我们得明确一点,ARM公司自己本身并没有64位芯片设计技术,他是通过了收购MIPS64处理器架构的部分技术使用权,再结合ARM的一些特性设计出来的。也就是说:MIPS、ARM、X86三大架构中,唯一没有64位技术的ARM,通过收购MIPS的形式得到了64位。

对Android中arm64-v8a、armeabi-v7a、armeabi、x86认识,看完这个就全明白了相关推荐

  1. 怎样知道android的手机号码,如何查询自己的手机号码?看完这三种方法,再也不用担心了...

    原标题:如何查询自己的手机号码?看完这三种方法,再也不用担心了 导语:现在智能手机如此盛行的时代,相信很多人有不止一部手机,这样就会出现自己的手机号码记不住的情况,身边经常有朋友遇到过自己的号码也记不 ...

  2. 对Android中arm64-v8a、armeabi-v7a、armeabi、x86认识

    android开发中经常会遇到so库放在哪个目录下的问题,今天就简单分析一下,各个架构的cpu的区别,读者只要能大致了解这些目录的含义就可以了,不必深究. 首先讲一下32位处理器与64位处理器区别 6 ...

  3. Android 中arm64-v8a、armeabi-v7a、armeabi、x86简介~

    转自:https://blog.csdn.net/u012400885/article/details/52923765 版权声明:本文为博主原创文章,转载请注明出处. https://blog.cs ...

  4. Android中arm64-v8a、armeabi-v7a、armeabi是什么?

    ------<怎么利用Android Studio查看Android-SDK源码> 前言 正题 ABI是如何工作的 ABI具体适配流程 项目中该如何适配 打包配置 split分包 ndk{ ...

  5. Android中使用自定义的VideoController和MediaPlayer实现视频的窗口和全屏播放

    基于MediaPlayer的能窗口和全屏切换的视屏播放器 之前在一个项目中做了一个能窗口化和全屏切换的播放器,做之前在网上也看了很多的demo,今天为了记录下自己的学习成果,特意将它写下来供自己以后参 ...

  6. Android 适配Dark Theme(暗黑模式),看完跪了

    Force Dark自动适配 Android 10 提供 Force Dark 功能.此功能可让开发者快速实现深色主题背景,只需要在 style.xml 中的应用主题中添加这一行代码android:f ...

  7. Android 如何实现气泡选择动画,食堂大妈看完都会了

    有锯齿的圆 解决方案是 smoothstep.它根据到 texture 与背景的变换起始点的距离平滑的从0到1变化.因此距离 0 到 0.49 时 texture 的透明度为 1,大于等于 0.5 时 ...

  8. 2021我的Android大厂面试之旅!看完这篇彻底明白了

    本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注 面试官: 组件化如何实现,组件化与插件化的差别在哪里,该怎么选型 心理分析:面试官从架构层次 了解求职者是否用过 模块化 组 ...

  9. 后端:Java中如何更优雅的处理空值,看完你就懂了!

    导语 在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当前的业务逻辑并没有关系.但它会让你很头疼. 有时候,更可怕的是系统因为这些空值的 ...

最新文章

  1. NodeAsp——像开发NodeJS应用一样玩转ASP
  2. 转载OleDb操作Access数据库:新增记录时获取自动编号的主键值
  3. 1.2.3 算法的空间复杂度
  4. 高清 网络摄像机 华为海思3510芯片
  5. 用户 'NT AUTHORITY/NETWORK SERVICE' 登录失败 的解决方法(转)
  6. Activity service 通信
  7. OpenVX, 运算加速库, NVIDIA
  8. stream() 求和_Java教程:Java8统计list中指定属性的最大、最小、平均值、求和
  9. 双极型三极管共集电极、共基极放大电路
  10. “腾讯也感受到危机了!”
  11. Linux 在线扫描热添加的SCSI设备
  12. 初识阿里云环境搭建:无法远程连接,入过的坑:服务器ping不通,FTP搭建,服务器搭建数据库,远程连接服务器数据库
  13. 代码调用SPSS功能执行分析
  14. 我要偷偷的学Python,然后惊呆所有人(第二天)
  15. Docker教程(1)Docker 入门
  16. 在Mac OS X苹果lion系统上制作USB启动盘
  17. 静电场点电荷matlab,基于MATLAB的点电荷的静电场模拟
  18. 服务器渲染技术jsp
  19. 笔记(十):redis集群
  20. GDOI2016 退役记

热门文章

  1. 北京英汉口译翻译工每小时多少钱?
  2. ABC 246: E - Bishop 2——Flood Fill + 记忆化方向
  3. 计算机网络原理 自考(五)
  4. 基于ProXmoX VE的虚拟化家庭服务器(篇一)—ProXmoX VE 安装及基础配置
  5. iOS FTP客户端的见解
  6. 在windows中ohmyzsh 的powerlevel10k主题及插件推荐
  7. Windows、Mac chrome 谷歌 浏览器 恢复 上次浏览网页
  8. IIR 数字滤波器全极点格型的MATLAB实现
  9. linux 文件修复工具,技术|在 Linux 系统下使用 PhotoRec TestDisk 工具来恢复文件
  10. [JavaSE](static关键字、继承、super关键字、this关键字、多态、(成员变量、静态成员方法、实例成员方法)在多态中的调用情况)