提速安卓支撑鸿蒙?“大杀器”方舟编译器深度解析
8 月 9 日,华为开发者大会鸿蒙os正式发布,这是基于微内核的全场景分布式os。能实现模块化解耦,对应不同设备(智慧屏、穿戴设备、车机、智能音箱、手机)可弹性部署。华为消费者业务 ceo 余承东描述了华为鸿蒙 os 的方方面面。
余承东称,华为方舟编译器,会通过多终端 ide 开发环境来支撑当前的鸿蒙 os。目前方舟编译器支撑鸿蒙内核,“方舟编译器能提升60%的编译性能”,将来鸿蒙微内核能按需扩展,并希望用一个鸿蒙微内核代替全部内核。
今天,我们就聚焦华为的新贵——方舟编译器,这个一发布就引起巨大响动的底层核心技术。方舟编译器究竟是什么?它为什么能够做到“青出于蓝而胜于蓝”,下面就让我们带着疑问去解读。
01 编译器是什么?
首先讲讲编译器是什么东西吧?其实绝大多数用户都不清楚这是什么。程序员们在写好应用的代码之后,在变成我们手机上安装的应用之前,还差最后一步就是编译。
简单来说,编译器就是把编程人员开发的高级语言程序,翻译成机器可执行的机器指令,这就是编译器。它就像一位翻译官,是连接程序员与机器的桥梁。
由此来看,方舟编译器面向的是开发者的,但最终受益的还是消费者。
打个比方,说计算机是汽车,那么软件就像汽车的操控系统一样。编译器则是汽车发动机里最核心的汽油燃烧技术,将软件变成计算机的动力,其编译的效率,直接决定了用户的使用体验。所以了解方舟编译器之前,我们必须得首先了解 android 操作系统中的编译器的运行机制。
安卓系统从2008年1.0到9.0,截至目前安卓系统大小版本超过15个。十年发展安卓手机的体验已经今非昔比。可生活中还有很多人诟病安卓手机没有iphone流畅,那么安卓系统的程序是怎样运行的?下面我们来阐述一下
java的虚拟机的故事
android 1.0刚发布的时候,使用的是一个叫dalvik的虚拟机(virtual machine,简称 vm)里面集成了一个解释器,每次用户在安卓手机上运行app时,就会唤醒解释器,来给安卓的硬件解释app接下来要干什么。
这个问题严重拖了安卓手机的后腿,所以android2.2版本引入了jit机制。jit比较聪明,当用户在安卓手机运行app时,会同时将用户经常使用的功能编译为机器能直接执行的机器码,不用一句一句去翻译。当出现不常用的功能时,再唤醒解释器翻译。
但是每次启动app都要重新编译一次,加上dalvik虚拟机性能比较落后,所以谷歌在android 5.0版本将虚拟机从dalvik替代成art,同时把jit的编译器替代成aot 。aot相比jit的好处,就是不用每次打开app都需要先编译一遍。但是,坏处是安装应用慢和占用内存空间。
在 android 5.0 正式采用 art 之前,android 采用的是解释执行+jit 的方式执行 java 代码。在这个阶段的系统是“边解释边执行”模式,代码效率比较低下,当时android给人的感觉就是卡。
目前的android采用的是解释执行+jit+aot 的模式,但并没有摆脱一个前提,即应用在被打包成apk的时候,采用的还是java代码。
jni接口调度占用额外资源
现在大部分应用都是使用java和c/c++等多种语言混合开发而成。java和c/c++属于两种不同架构的语言,为了使app正常运行,它俩之间需要互通的接口——jni。
这就意味着手机硬件资源要分配一部分给jni去做调度。不仅占用了硬件资源,而且这种机制本身就效率较低。
安卓内存回收机制容易造成卡顿
当手机内存资源不够用的时候,安卓虚拟机就会召唤gc(garbage collection),让所有手机运行的java线程全部暂停,gc机制,无法精确控制内存回收,所以性能较差的手机间歇的出现“抽搐般”的卡顿现象。
以上这几个问题,一直影响着安卓手机的体验。其中最主要的是java 高级语言转换机器能懂的语言,这一转换过程直接导致了android的卡顿。反观ios系统,直接使用clang/llvm来编译出机器码,就没有安卓还要一个中间层,也因为如此,我们感觉ios系统一般更流畅。
02 方舟编译器牛在哪? "干掉"虚拟机
方舟编译器做的就是,将java的所有语句统统翻译成机器码,最后打包成apk安装文件。方舟编译器最大的优势在于它绕过了虚拟机。简单来说,方舟编译器可以将高级语言(java)直接变成机器码,无需再通过 android 系统中内置的编译器。
总之,方舟编译器是完全替代了语言虚拟机的静态编译器,从此不再需要解释器。相比现有的编译机制有以下明显优势:
1、方舟编译器是一种静态的编译方式,而现有的安卓系统,运行一个应用程序首先启动虚拟机,然后读入应用代码逐条解释执行,无法做到100%做到摆脱虚拟机,这也是当前安卓阵营面临的问题。
简单一句话,只要是经过编译器编译的应用,在应用市场上架以后,用户下载的apk 就是编译好的了,方舟编译的应用在开发阶段就已完成了。
2、华为方舟编译器的静态编译方式可将语言里的动态特性直接翻译成机器码,手机安装应用程序后可全速运行程序,彻底干掉了虚拟机,极大提升了系统运行效率。
方舟编译器对于系统在这方面的提升,官方曾这样描述:
一、emui 9.1对系统主要服务system server进行静态编译化,带来了系统流畅度提升24%,系统响应性能提升44%以上的收益。
二、微博极速版实现了静态化编译后,流畅度提升高达60%。通过上方演示视频来看,经过方舟编译优化的app,在流畅度度方面的提升很明显。
03 新的内存垃圾回收机制
此外,方舟编译器还带来了新的系统垃圾回收机制。以往安卓的垃圾回收机制是集中回收,由于java虚拟机的特点,系统会不停的地自动回收内存垃圾,保证内存不会溢出。
更要命的是,当内存低于某个标准值后,它就会自动杀掉优先级低的进程。系统会集中关闭被标记的多余进程,这就造成了随机性的卡顿。相信大家遇到过这种情况,启动游戏时,点按应用瞬间进入前会感觉莫名的卡顿,界面像是迟钝了一下。
而方舟编译器在这方面有什么不同,它的内存回收机制是随用随回收,回收时不需要暂停应用,而是直接回收内存垃圾,这大大提高了系统运行速度和效率。
小结:方舟编译器的优势,可以简单总结为以下五个方面:
1.安卓程序编译效果更好
2.安卓应用安装速度更快
3.app运行速度更快
4.系统内存垃圾随用随清,对手机硬件的要求降低
5.省电
04 十年造方舟,为安卓提速为真,支撑鸿蒙也为实
十年磨一剑,没错,华为方舟编译器准备了十年之久。2009年,华为启动5g基础技术研究的同时,开始创建编译组,第一批海内外研究人员加入。
2013年,华为推出面向基站领域的自研编译器hcc,并正式提出编译器框架构想。
2014年,众多海内外专家加入华为,方舟项目正式启动。同时,编译器领域的*大佬,周志德(fred chow)的加入大大增强了研发实力
2016年,成立编译器与编程语言实验室。2019年,华为方舟编译器正式面世!
方舟编译器既能统一适配安卓机器语言,自然也能适配成自家系统的机器语言——鸿蒙os,方舟编译器为“安卓提速”为真,但能“支撑鸿蒙”也为实,它完全可称为让开发者从安卓到鸿蒙过渡的"诺亚方舟"。
05对外开源 构建生态
据悉,方舟编译器也将开放给第三方合作伙伴。其后续会在 2019 年 11 月的绿盟开发者大会实现完整方舟编译器代码开源,让广大的应用开发者、手机厂商参与,共同构建开发者生态,使安卓体系变得更加完整强大。
未来方舟编译器是否能成功,还要看后续完整生态的搭建。希望开发者积极参与进来,最终给消费者带来更为极致的体验。
总结:
从方舟编译器我们就能看出华为对研发的投入,以及对未来生态搭建的规划,或许,想要做一个操作系统并不难,比如阿里云os,但难的是未来完整生态的构建。
无论怎么看待华为,目前,在国内也只有它有实力去干这件事情,并不只是说说而已,华为的终极目标很明显,就是在未来搭建全方位的生态。我们期待这项技术能够普及开来,促进android体系更加强大,也希望华为能在未来带给我们更多惊喜。