安卓应用开发时需要注意的一些基本硬件知识
指令集
CISC和RISC
CISC指令集指令数量多且复杂,每条指令长度不同,运行时间也较长,但每条指令能处理的工作较为丰富。即慢而多能,常用于桌面级计算机。其通用寄存器较少,32位有8个,64位有16个。
RISC指令集指令精简且运行时间短,但每条指令可以完成的动作较为简单,复杂工作需要更多的指令组合。即快而简单,常用于手机等移动设备。RISC指令集可以有上百个寄存器,故可以更有效缓存中间结果,减少内存访问次数,从而性能更高。
常见指令集
-
x86 = IA-32,Intel开发,32位CISC指令集; x86_64 = amd64 = x64,AMD开发,64位CISC指令集; IA64,Intel开发,64位CISC指令集,并不向下兼容,很失败几乎没人用; arm,ARM(Advanced RISC Machine)公司开发,RISC指令集; MIPS,MIPS公司开发,RISC指令集,MIPS32是32位,MIPS64是64位;
指令集和CPU架构的关系
CPU架构实际上就是在物理层面实现指令集所规定的各种操作和运算,就是说指令集决定了CPU架构,具体设计可以有多种,因此指令集与CPU架构是一对多的关系。
CPU架构
-
实现32位x86和64位x86_64指令集的CPU架构均被称作x86架构,最常见两大厂商就是Intel和AMD。x86架构下的CPU,64位都是向下兼容32位的,也就是说可以在64位的CPU上运行32位程序。 ARMv7-A架构,实现arm指令集的32位CPU架构,ARM公司发布,如ARM Cortex-A5、ARM Cortex-A7; ARMv8架构,实现arm指令集的64位CPU架构,ARM公司发布,有AArch32和AArch64两种执行模式,因此同时兼容32位和64位;
ABI
应用程序二进制接口(Application Binary Interface,ABI)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集、内存对齐到可用的系统函数库。
Android系统目前支持以下七种不同的CPU架构:ARMv5、ARMv7 (从2010年起)、ARMv8、x86 (从2011年起)、x86_64 (从2014年起)、MIPS (从2012年起)、MIPS64,每一种CPU架构都关联着一个相应的ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。
其中armeabi针对所有的arm cpu,只要支持arm指令集的CPU都可以运行。v7a、v8a则是后来推出的ABI,分别适用于ARMv7和ARMv8架构的CPU。armeabi-v7a是针对有浮点运算或高级扩展功能的arm v7 cpu,32位ARM设备使用的ABI。arm64-v8a,用于64位ARM设备,有AArch32和AArch64两种执行模式,因此同时兼容32位和64位应用程序。
安卓上有一个应用可以查看安装的应用中使用了哪些.so文件。
很多设备都支持多于一种的ABI。例如ARM64和x86设备可以同时运行armeabi-v7a和armeabi的二进制包。但最好是针对特定平台提供相应平台的二进制包,这种情况下运行时就少了一个模拟层(例如x86设备上模拟arm的虚拟层),从而得到更好的性能(归功于最近的架构更新,例如硬件fpu、更多的寄存器、更好的向量化等)。
真正的64位
了解到对于一个安卓应用,称其为64位实际上包括下列几个层次:
-
CPU架构和指令集是64位的(硬件层面); 其Linux内核也需要支持64位(内核层面,ABI); 运行在内核上的安卓虚拟机也需要支持64位(虚拟机层面,ABI); 应用程序是64位的(应用层)