学习手机cpu相关知识,对于开发Android应用程序适应各个机型有一定的辅助作用。当我们了解了背后的原理和逻辑后,在开发过程中或许能达到事半功倍的效果。
手机架构体系分类
指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分
早期的CPU全部是CISC架构,它的设计目的是要用最少的机器语言指令来完成所需的计算任务。比如对于乘法运算,可能只需要这样一条指令:MUL ADDRA, ADDRB就可以将ADDRA和ADDRB中的数相乘并将结果储存在ADDRA中。将ADDRA, ADDRB中的数据读入寄存器,相乘和将结果写回内存的操作全部依赖于CPU中设计的逻辑来实现。这种架构会增加CPU结构的复杂性和对CPU工艺的要求,但对于编译器的开发十分有利。
RISC架构要求软件来指定各个操作步骤。上面的例子如果要在RISC架构上实现,将ADDRA, ADDRB中的数据读入寄存器,相乘和将结果写回内存的操作都必须由软件来实现,比如:MOV A, ADDRA; MOV B, ADDRB; MUL A, B; STR ADDRA, A。这种架构可以降低CPU的复杂性以及允许在同样的工艺水平下生产出功能更强大的CPU,但对于编译器的设计有更高的要求。
简单地说就是,CISC将指令集成,机器理解起来简单,但集成电路的设计复杂度提高,而RISC则恰恰相反,二者各有优劣,有各自适应的场景。
●复杂指令集(CISC)代表架构是x86
●精简指令集(RISC)代表架构是ARM和MIPS
●ARM架构代表手机品牌:高通骁龙、华为海思、NVIDIA Tegra 4(M3)、德州仪器 armeabi-v7a
●MIPS架构的处理器多用在网关、猫、机顶盒等低端小众的产品,我过的“龙芯”使用了这种架构,代表手机品牌有艾诺novo7
●X86的代表手机品牌:联想K800、K900,摩托罗拉MT788、Orange San Diego(Xolo X900)
手机CPU各大厂商
德州仪器、Intel、高通、三星、Marvell(马维尔)、Nvidia(英伟达)、华为、联发科(MTK)、展讯等
相关文章:
https://www.jianshu.com/p/ed0acc4f2af1
开发Android应用时,有时候Java层的编码不能满足实现需求,就需要到C/C++实现后生成SO文件,再用System.loadLibrary()加载进行调用,这里成为JNI层的实现。常见的场景如:加解密算法,音视频编解码等。
在生成SO文件时,需要考虑适配市面上不同手机CPU架构,而生成支持不同平台的SO文件进行兼容。
目前Android共支持七种不同类型的CPU架构,分别是:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起)。
●如何查看手机的CPU架构
adb shell
cat /proc/cpuinfo
如下图,查询的结果中aarch64是arm64-v8a的一种执行状态,也就是说该手机的CPU是arm64-v8a架构
Android系统目前支持的七种不同的CPU架构,每一种都关联着一个相应的ABI。即应用程序二进制接口(Application Binary Interface),其定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上, 可以非常精确地定义应用的机器代码在运行时如何与系统交互。
CPU与SO的兼容
每一个CPU架构对应一个ABI,一个cpu属于某一种架构,如果你要完美兼容所有类型的手机,理论上是要在的libs目录下放置各个架构平台的SO文件,但是apk的体积会变得非常庞大,对于CPU来说,不同的架构并不意味着一定互不兼容,根据目前Android共支持七种不同类型的CPU架构,其兼容特点可总结如下:
●armeabi设备只兼容armeabi;
●armeabi-v7a设备兼容armeabi-v7a、armeabi;
●arm64-v8a设备兼容arm64-v8a、armeabi-v7a、armeabi;
●X86设备兼容X86、armeabi;
●X86_64设备兼容X86_64、X86、armeabi;
●mips64设备兼容mips64、mips;
●mips只兼容mips
根据以上的兼容总结,我们还可以得到一些规律:
●armeabi的SO文件基本上可以说是万金油,它能运行在除了mips和mips64的设备上,但在非armeabi设备上运行性能还是有所损耗;
●]64位的CPU架构总能向下兼容其对应的32位指令集,如:x86_64兼容X86,arm64-v8a兼容armeabi-v7a,mips64兼容mips;
当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。在x86设备上,libs/x86目录中如果存在.so文件的话,会被安装,如果不存在,则会选择armeabi-v7a中的.so文件,如果也不存在,则选择armeabi目录中的.so文件(因为x86设备也支持armeabi-v7a和armeabi)。
安装apk的时候,会把对应的abi目录进行简化,如下图,可以在apk的安装目录进行对比查看。
从目前移动端CPU市场的份额数据看,ARM架构几乎垄断,所以,除非你的用户很特殊,否则几乎可以不考虑单独编译带入X86、X86_64、mips、mips64架构SO文件。
这一部分可以参考以下文章: