早期的android 系统几乎只支持ARMv5的cpu架构,现在android平台支持7种不同的cpu架构,分别是:
ARMv5,ARMv7(2010起),x86(2011年起),MIPS(2012年起),ARMv8,MIPS64和x86_64(2014年起),没一种都关联相应的ABI(application binary Interface)。
应用程序二进制接口(abi)定义了二进制文件(尤其是.so)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在android系统上,每一个cpu架构对应一个abi:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64.
一、关于arm(Advanced RISC Machine)架构
是一个32位精简指令集RISC(Reduced Instruction Set Computing)处理器架构,其广泛地使用在许多嵌入式系统设计。但在其他领域上也有很多作为,由于节能的特点,ARM处理器非常适用于移动通信领域,匹配其主要设计目标为低成本、高性能、低耗电的特性。ARM的优势不在于性能强大而在于效率,ARM采用RISC流水线指令集,在完成综合性工作方面根本就处于劣势,而在一些任务相对固定的应用场合其优势就能发挥得淋漓尽致。ARM结构的电脑是通过专用的数据接口使CPU与数据存储设备进行连接,所以ARM的存储、内存等性能扩展难以进行(一般在产品设计时已经定好其内存及数据存储的容量),所以采用ARM结构的系统,一般不考虑扩展。基本奉行“够用就好”的原则。
二、关于x86架构
是一个复杂指令集CISC(Complex Instruction Set Computer)处理器架构。X86结构的电脑无论如何都比ARM结构的系统在性能方面要快得多、强得多。X86的CPU随便就是1G以上、双核、四核。X86结构的电脑采用“桥”的方式与扩展设备(如:硬盘、内存等)进行连接,而且x86结构的电脑出现了近30年,其配套扩展的设备种类多、价格也比较便宜,所以x86结构的电脑能很容易进行性能扩展,如增加内存、硬盘等。
对于64位手机跟64位处理器
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在的手机上真的有用吗?我只能说,目前确实没啥用,但今后或许有。(其他地方搜罗的) 综上所述,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位程序摆在你眼前,也无法安装。
对于cpu架构分包:
项目要求->为了满足公司自动化测试要求,需要打支持x86架构的apk,因为自动化测试都是在电脑上跑的,电脑都是x86的构架,手艺genymotion等模拟器都是x86架构的。有使genymotion支持arm架构的插件,但是导入这个插件;我们的莹莹还是跑不起来。所以只好加x86的支持,以为百度的so库比较多,导致apk过大,而现在的手机基本都是arm的,所以为了大小,线上包不能打x86的so库。所以需要打两个包,一个用于自动化测试支持x86的包,一个用于线上不支持x86的包。
首先是splits命令,这个命令可以按照各种规则去分包,比如按照abi,屏幕密度(即ldpi,hdpi等)分包。
语法如下:
splits {
abi {
enable true
reset()
include 'x86'
exclude 'armeabi', 'armeabi-v7a', "arm64-v8a"
universalApk true
}
}
include就是包括,exclude就是不包括。包括的配置每一个项都会生成一个apk包。
即
include 'x86','armabi'
如果这样配置,会生成两个包,一个只包含x86的so库,一个只包含armabi的so库。不能满足项目的要求,项目要求的是一个只包含x86的库,一个包含armabi,armabi-v7a,armabi64-v8a这3个的库文件。
这个指令可以配置只打包你配置的so库,没有配置的就不打包,很灵活。
//过滤x86的so库
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
}
这样配置会将armeabi,armeabi-v71,arm64-v8a这3个包下的so库都打包到一个apk,而不像splits会每一个包打一个apk.
//过滤x86的so库
ndk {
abiFilters 'x86'
}
这样配的话就只会打包x86的so库。