智东西(公众号:zhidxcom)
文 | 轩窗

智东西4月25日报道,两周前华为年度第一款旗舰机P30,同时宣布将操作系统升级为EMUI9.1。在发布会上,华为推出了方舟编译器和超级文件系统EROFS两大创新亮点。由于发布会时间限制,当时华为仅仅用两页PPT粗略地介绍了这两项技术作用。据华为方面表示,自发布会后,华为软件OpenLab团队的电话几乎要被打爆了,很多开发者都想要了解方舟编译器更多的信息。

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

▲华为CBG软件部总裁 王成录

今天,智东西与少数媒体参与了华为EMUI软件沟通会,会上华为CBG软件部总裁王成录详细介绍了方舟编译器和超级文件系统EROFS两项技术的原理以及研发背后的细节,以及EMUI未来的主攻方向。

一、什么是方舟编译器?

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

分享会一开始,王成录博士先介绍了EMUI演进过程以及近几年来,华为在系统软件上针对用户使用中的痛点问题进行的有针对性的优化。比如EMUI5.0主要解决安卓系统卡顿问题,EMUI8.2上线了GPU Turbo主攻游戏性能受限问题,EMUI9.0上线了Link Turbo主攻网络覆盖不均问题,EMUI9.1则上线了方舟编译器和超级文件系统EROFS,针对安卓流畅度不足问题。

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

当前安卓平台的绝大多数应用是使用Java写的,但在底层,最终真正能让计算机“听懂”并执行的其实是机器语言,也就是由0和1组成的二进制代码。所以,这中间必须存在着由高级语言到机器语言的转化。

一般来说有两种办法:

(1)引入一个中间层,其工作的方式是,理解一句Java语句就将其翻译为机器码,让硬件执行一下,称之为解释执行。这种方式对代码不加筛选,执行效率非常低。

(2)直接把高级语言翻译成机器语言。这又有两种方式:一是在程序运行之前,把高级语言编译为机器语言,称之为 AOT(Ahead of time)编译;二是,在程序运行后,实时地把高级语言编译为机器语言并执行,称之为 JIT(Just in time) 编译。

在安卓5.0之前,安卓采用的是解释执行 + JIT 的方式执行高级语言代码,属于边解释边执行模式,但效率非常低。随后安卓版本不断迭代,在安卓6.0 阶段推出了虚拟机 ART。

目前安卓采用的就是解释执行 +  JIT + AOT 的综合模式。

那么,编译器又是什么呢?编译器就是将计算机高级编程语言转化为机器可执行的机器语言的工具,也就是直接转化为二进制代码。可以说是一步到位的编译。

用方舟编译器做出来的APK,下载到手机上直接就是机器语言,也就是二进制代码,机器直接就可以运行,不需要再做编译了,这是方舟编译器最本质的技术突破。

编译器的研发难不难?编译器开发是需要长期大量研发积累,王成录博士也坦言需要“板凳要坐十年冷”。同时,开发编译器需要研发人员既精通高级语言,对各种框架等非常熟悉,又要对机器语言了如指掌,对研究人员要求非常高。谷歌生态建立了这么久,其规模非常庞大,其上的框架和、应用等非常多,想要重新做一个适配谷歌生态的编译器,工作量可想而知,是非常巨大的。

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

华为是如何作出方舟编译器呢?据王博士介绍,华为在编译器研发上的积累,可以追溯到2009年,华为海思研发起步时,当时吸引了第一批海内外研究人员加入,创建了编译组。2013年,华为自研并推出了用于基站的编译器HCC,这也是华为编译器框架构想的正式提出,也是方舟编译器的前身。

2014年,Fred Chow( 周志德)加入华为并担任华为编译器技术首席科学家,建立了方舟编译器的主架构。2015年华为推出自研编程语言CM,2016年成立编译器与编程语言实验室,2019年华为正式推出方舟编译器。前前后后共计十年时间,经过了几百位研究人员的努力,投入的资金也有几亿美元了。

王成录博士表示,有了方舟编译器优化的安卓系统在DNA上与苹果iOS系统接近了。华为下一步要做的工作就是推动生态建立,不断将系统进行优化,让用户用上更纯净的安卓软件。

方舟编译器的四大技术亮点:

1、是一种多语言联合优化编译器,消除了跨语言调用的开销

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

据王成录博士介绍,当前Top级的应用95%以上都采用混合语言模式,涉及多种开发语言。具体来说是程序的逻辑部分采用Java语言编写,但为了增强安全性、可靠性、兼容性等能力,应用开发者可能会用C语言写库,供Java调用。Java和C语言之间调用,是一定要通过接口去使用,这就会形成额外的性能开销,而且相比于不需要调用的情况开销很大。

而方舟编译器则可以让不同语言代码在程序开发环境中环境中编译成一套语言统一的可执行文件,在硬件的运行环境高效执行。也就是说,方舟编译器中吸纳了现在安卓生态中的各种主流框架和库,对不同语言做了统一的程序优化,直接编译成机器指令。

2、程序运行时无需依赖虚拟机,减少资源占用,并且建立了高效的内存回收机制

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

Java语言有非常多的优势,包括跨平台、分布式,安全性高等。Java语言在设计之初,有一个Java语言开发包,其中有一个非常重要的东西,就是虚拟机。虚拟机的作用是,无论使用什么样的硬件,都可以将其抽象成Java的运行环境,因此可以实现跨平台,无论是X86、ARM架构,还是CPU的机器都没问题。虚拟机的出现则带来了一个问题,只要把Java语言开发包装上,虚拟机就一定会分配好,占用额外的系统资源。

那么ART虚拟机的作用是什么呢?就是运行之前先把编译准备好了,是一种静态编译。通过引入了JIT编译和AOT编译能解决一部分效率问题,但是对于Java动态特性的部分仍做不到直接编译,还是要解释执行。Java动态特性是为了降低开发难度,不需要开发者把所有的程序都写好,只要能够运行时实现调用就可以了。这部分往往只能在运行时进行处理。

方舟编译器最大的突破就在这里,把动态的部分全部变为静态编译,其核心是一定要对Java语言动态特性非常深入理解。“就像一个优秀的翻译官一定对汉语言文学理解的非常到位,然后再对英语理解非常到位。”Java是非常庞大的,需要对安卓现有的应用,可能会用到哪些库,这些库之间怎么用理解,需要大量的分析运行状态,才能够将这些动态特性完成提前的编译。同时由于方舟编译器统一将程序编译为机器语言,所以也是跨硬件平台的。

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

早期C/C++需要开发者自己管理程序对系统内存的使用和释放,影响开发效率。Java的虚拟机模式提供了内存GC(垃圾回收)机制,在内存进行全局回收时,所有部分都要停下来,等待回收完成,这是产生随机卡顿的重要原因。

方舟编译器则是在编译时,为程序配备及时回收的内存处理机制。在程序运行的过程中都在实施处理,这是方舟编译器又一个非常重要的技术突破。

3、可针对不同应用灵活编译优化,翻译出性能更佳的机器指令

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

一个翻译器做得好不好,重要的衡量标准是能不能给程序带来性能提升。“编译器和翻译人类语言是一样的,翻译出来不太难,但是要翻译的又快又好就太难了。”

所以,当方舟编译器整套逻辑通了之后,还需要做大量的优化和调整。一方面需要对Java语言的了解再深入再细致再重建;另一方面对机器指令顺序结构理解要更清楚。这两个匹配的方法越准确,编译器效率越高。王成录博士表示,“一个好的编译器,开发者一行代码都不需要修改,性能能提升10%到20%”。

现有的安卓编译,大部分代码在虚拟机环境运行,其创建遵循同一套“模板”,所以难以作深度的优化。

方舟编译器可针对不同应用灵活编译优化,每个应用编译优化方案由开发者自己来定,分别形成不同应用优化后的机器码。

王成录博士表示,方舟编译器从立项之初最理想的目标就是不需要开发者更改业务代码,大家只需要通过华为的方舟编译器做重新编译就足够了。现在可能还需要开发者作一些对接,但很快随着一些应用进入,这个目标很快就能实现。

4、开发者学习和使用成本低,打包时即编译

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

方舟编译器的又一亮点是,在应用开发构建的阶段为开发者提供快速的集成编译环境。而现行安卓系统则是在用户将应用下载后,在终端上实现编译的。

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

据王成录博士介绍,在同一硬件平台上,方舟编译器让系统操作流畅度提升了24%,系统响应速度提升44%,第三方应用操作流畅度提升60%。在内存回收机制上方舟编译器已经赶超了苹果iOS系统。

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

方舟编译器在今年4月随着华为P30系列发布并宣布开源,华为接下已经为方舟编译器制定好了上市计划。今年8月,在华为终端开发者大会上,华为将开源方舟编译框架代码,供开发者研究参考,11月的绿盟开发者大会上,华为将完整方舟编译器代码开源,让开发者可编译使用。

二、什么是超级文件系统EROFS?

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

随着存储介质的进步,文件系统也在被驱动着演进。文件系统对磁盘读写效率有着重要影响。此前,华为曾推出过F2FS,2016年就在华为P9上应用了,而这个是面向用户分区的。今天要提的超级文件系统EROFS,则是针对系统分区的。

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

安卓系统采用的模式是EXT4,文件块定长输入,变长输出,导致同一个文件块的内容可能会出现在不同的磁盘块中,读取时造成了浪费。

超级文件系统EROFS的特点是:1、随机读写的性能提升了20%;2、采用先进的压缩算法,减少了2GB;3、采用只读模式,让系统更安全。目前,EROFS文件系统已经开源,并已经合入Linux内核主线,在4.19版本发布。

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

据王成录博士介绍,这一系统是华为研发人员一行行写出来,100%原创。其中,王成录博士特别提到了压缩算法,也是华为申请了专利的一项技术。

而EROFS文件系统的压缩算法采用的则是文件块变长输入,磁盘块定长输出。也就是说,将不同长度的文件块压缩成为统一大小的磁盘块,这样做的好处是不存在无效的读取。

这样做的好处是,随机读性能平均提升20%。升级包大小下降约5%-10%,升级时间缩短了约20%。

三、EMUI未来演进的四大方向

在分享会上,智东西问到王博士,未来EMUI的优化方向有哪些时,王博士回答说主要集中在四个方面:

第一,基础的性能仍然会持续投资,随着硬件的变化,软件的变化,上面应用的变化,对系统资源的应用永远没有够的那一天,所以这个投资还会持续。

第二,体验,虽然很多消费者对于华为UI吐槽非常多,但确实众口难调。王博士认为UI的背后一定有科学依据。“我们现在找到的方向就是人因,我们在使用一个设备的时候一定要考虑设备本身的因素,环境因素和人的因素,这三个因素都考虑全了,在给消费者不同场景下恰当的反馈,这才是最好的体验。”

什么是好的体验?就是手的操作和眼睛看到的,跟大脑期望是协调的这就是好的操作。现在很多的体验设计是缺少建模的,一定要根据不同的人群年龄段,性别去构建人的模型,看多大的字体更合适,多大的对比度,对这一类的人群是合适的,所以这种模型会构建的越来越完善,变成系统里面UI的算法,在不同场景下就会不一样,这一块华为努力在做。

第三,创新,这个创新指的是,随着应用的不一样,场景的不同,没有必要让所有的应用严格的按照这个软件的过程,一步一步都走完。打个比方,有个应用运行了无数次了,已经证明是一个非常高质量、安全的应用,就没有必要每次都做那么复杂的处理。

第四,中国在软件工程领域非常缺人。软件开发人员经验的积累,能不能沉淀为工具和平台很关键,在中国没有出现过一个非常优秀的软件工具平台。

在会上,王博士还特意提到了生态构建的重要性。目前,在终端生态构建上,华为已建立三大开发者生态:以HiAI平台建立AI开发者生态;以Link Turbo和方舟编译器建立应用生态;以HiLink和 HiCar建立连接生态。

华为王成录:解密方舟编译器和EMUI未来四大演进方向!

此外,王成录介绍说,今年Link Turbo将有突破,升级到2.0版本,将带来对更多华为终端与更多应用的支持,让更多用户能享受极速流畅的网络体验。

结语:华为EMUI正在从系统底层进行优化

无论是方舟编译器还是超级文件系统EROFS,都是华为在系统底层进行优化的重要一步。无论是方舟编译器还是超级文件系统EROFS,都是华为在系统底层进行优化的重要一步。当然,安卓开发生态建立多年,其优势在于开源和自由,而其劣势则也正是由此带来的无序性发展,导致了终端运行效率低下。而作为头部的智能手机厂商,华为推出这个内容的初心是想进一步提升安卓系统的流畅性,也是出于自身发展和产品性能和体验提升的考虑。

不过,也正如王成录博士所说的那样,华为做方舟编译器是想要帮安卓阵营解决实际问题的,仅仅华为一家之力是不够的,还需要终端厂商、开发者等一起努力。