这个改造了Android的华为方舟编译器,厉害不?
2019-05-05 14:13:08 评论 全民
在前不久华为P30系列新品发布会上,华为消费者事业群 CEO余承东提到过一项很厉害的技术,但被他一嘴带过,这项技术就是方舟编译器。
他提到,方舟编译器可以提升Android系统内应用的编译效率,过去Android应用一边编译一边执行,而方舟编译器将转变为全程机器预编译然后高效执行。华为宣布,使用方舟编译器最终将提升24%的系统操作流畅度,提升44%的系统响应能力,以及提升60%的三方应用操作流畅度,“Android系统将比iOS系统还要流畅”。这一技术将正式开源给开发者,让所有人都可以使用方舟编译器对应用预编译。
据华为消费者事业群软件部总裁王成录向包括PingWest品玩在内的媒体介绍,自发布会结束后,华为软件内部团队的电话几乎被打爆,很多开发者都想了解方舟编译器更多的信息。
这个技术到底厉害在哪?
它哪里厉害?
在了解方舟编译器的同时,我们需要先了解一下Android的编译流程。
编译器的定义为:将“一种语言(通常为高级语言)”翻译成能直接被计算机或虚拟机执行的目标代码,编译器的效率将直接影响程序运营性能/效率。
而Android系统内部绝大多数应用的逻辑部分都使用Java来编写,但为了保证安全性、可靠性、兼容性等不同的需求,很多开发者会使用不同的语言来编写其他的库,最终供Java调用。也就是说在Android系统内部,不同模块可能采用了不同的语言编写,而为了达对各个模块的互相理解,相互调用则会带来系统资源上的内耗。
编译器充当的是“翻译”功能。将不同计算机的高级语言转化为机器可以理解、可以执行的机器语言,由不同的代码替换为机器可读懂的“0101”。这体现在软件开发的部分。
而编写应用的Java代码能够如何被Android系统理解,直接影响了程序的执行效率。编译器的性能体现在是否可以将一种语言完美地解释为可执行的高级语言。
比如说,一个中英文翻译,她既能理解中文成语的博大精深,也可以谱写出英文语境中优美的句子。
乍一看,只要有一个非常好的“翻译官/编译器”就可以解决所有的问题。其实在编写Android系统的Java语言内部,还引入了虚拟机的机制。
从Android系统诞生那天起,就选择了使用Java作为基础的编写语言。据王成录介绍,Java语言有非常多的优势,比如说它跨平台、分布式,安全性做得都很好。而Java语言设计当初就有一个JDK,叫Java语言的开发包,开发包中就包含了一项重要的功能,称之为虚拟机。
虚拟机主要针对硬件环境。有了这个虚拟机以后,接下来无论是什么样的硬件,Java语言不需要管了,它的功能是将其抽象成Java的运行环境,因此Java实现了跨平台——不管是X86机器,ARM机器,还是其他CPU的机器都没有问题。但这也导致了新的问题:无论任何一个机器,虚拟机资源必须分配好,所以占用了额外的系统资源。
也就是说,一个应用先由Java编写成可执行文件(Dex码),再进入系统由虚拟机虚拟环境解释执行为机器可读的二进制码。两道工序的执行效率也就是应用在系统内被执行使用的执行效率。
打开使用一个软件应用,快不快,体验好不好,就在于这两道工序效率如何。
实际上Android的演进解释了这套编译逻辑上带来的效率问题。王成录提到,Android 1.0的时候,基本完全使用Dalvik虚拟机,逻辑就是解释一句执行一句,效率非常慢。Android 2.2的时候,当系统发现应用内有有一段代码频繁执行的时候,系统将直接编译解释,下次调用就不用重复解释,直接执行上次解释出的机器指令,这叫JIT(即时,Just In Time)编译。但是这个应用一退出了以后, 这段机器指令也消失了。
Android 5.0的时候,一个非常大的变化是引入了ART虚拟机(Android Run Time),采用AOT编译器(Ahead Of Time),就是运行之前,将部分代码编译解释好为二进制语言,转为静态编译,极大地提升了效率。但对于那些Java动态特性的部分,还有其他部分,仍然做不到直接编译,还是要解释执行。
前面已经提到,一个应用由C语言编译出来的库,加上Java语言本身的编译以及虚拟机的编译,当一个应用发生复杂的逻辑关系调用时,解释和编译这些代码需要通过接口去使用,因此产生很大的开销。“一个数据,如果没有跨语言的协同,和有跨语言协调来比,效率差别很大。”王成录说。
方舟编译器是直接将应用打包成二进制码输送到系统内执行,将所有编译转为静态编译。“有了方舟编译器后如何实现的呢?相当于,我不论你这个业务逻辑是Java写的还是库是用C写的,都没有问题,用方舟编译器做了统一的程序优化以后直接编译成机器指令。用方舟编译器做出来的APK,下载到手机上不需要再编译了。这就是巨大的差别。”
“最难啃的骨头”
王成录介绍,华为方舟编译器有四大技术亮点。第一,首个多语言联合优化的编译器,消除了跨语言调用开销;第二,程序运行时无需依赖虚拟机,减少了资源占用,同时实现了高效的内存回收机制;第三,方舟编译器可以针对不同应用灵活编译优化;第四,对于开发者学习和使用成本非常低。
方舟编译器最大的突破是将所有编译的部分,包括静态动态的部分全部变为静态编译出的二进制代码。
众所周知,Java语言系统非常庞大。这就需要对Android现有的应用,可能会用到哪些库,这些库之间怎么用理解,需要大量的分析运行状态,才能够将这些动态特性完成提前的编译。由于是机器语言,所以还涉及到了跨硬件平台开发。
这就需要对所有开发环境、系统内部解释环境的编译及语言、整体架构和逻辑理解非常深入。“就像一个优秀的翻译官一定对汉语言文学理解的非常到位,然后再对英语理解非常到位。”
王成录说,一个翻译器做得好不好,重要的衡量标准是能不能给程序带来性能提升。“编译器和翻译人类语言是一样的,翻译出来不太难,但是要翻译的又快又好就太难了。”
逻辑通顺以后,还需要大量的优化和调整。一方面对Java语言的了解再深入再细致再重建;另外一方面,对机器指令顺序结构理解要非常清楚才行,这两个匹配的方法越准确,编译器效率越高。“一个好的编译器,开发者一行代码都不需要修改,性能能提升10%到20%。”
据PingWest品玩了解,方舟编译器是个通用技术,基于目前ARM指令集开发、适用于所有ARM芯片平台。也就是说,经过方舟编译器编译的应用,再经过其他品牌厂商的适配,就可以适用于包括小米、OPPO、vivo等其他品牌手机上的Android系统。如果没有适配,则还是按照普通app效率执行。
据王成录介绍,华为在2009年开始准备编译器研发方面的工作,从华为海思研发起步时,2013年华为HCC自研编译器有了雏形,它吸引了第一批海内外研究人员加入,创建了编译组。
随后,华为“2012年实验室”成立,2016年正式设立了编译器与编程语言实验室。直到今天,华为才算正式推出了方舟编译器。王成录说,编译器真的是一个“板凳要坐十年冷”的工程,“我们稳得住才能做下来,非常的复杂。”
据PingWest品玩了解,方舟编译器开发人员有一半来自于消费者BG,一半来自于“2012实验室”,投入研发人员几百人。
方舟编译器是华为发布的最新的“黑科技”,但华为不是无意为之。王成录介绍说,华为一直在围绕性能这条线找最主要的矛盾。比如随着应用的丰富,手游越来越流行,华为针对游戏做了GPU Turbo。把游戏问题解决后,发现还有很多应用需要改进网络实时连接,所以华为发布了Link Turbo,“这个发挥了华为的优势,我们对网络非常熟悉,我们做了聚合把端和网络的连接。”
王成录说,方舟编译器是最后的、最难啃的骨头,但华为把它攻克了。
给Android系统动手术
华为方舟编译器,只是华为改造Android性能的一部分。
简而言之,华为在系统软件上针对用户使用中的痛点问题进行有针对性的优化。比如EMUI 5.0主要解决Android系统卡顿问题,EMUI 8.2上线了GPU Turbo主攻游戏性能受限问题,EMUI9.0上线了Link Turbo主攻网络覆盖不均问题,EMUI 9.1则上线了方舟编译器和超级文件系统EROFS,针对Android流畅度不足问题。
铺开Android系统全栈图,华为针对每一项Android系统内部模块进行改造优化。
华为将Android系统分为生态外部、框架层、中间件、硬件抽象和内核等多个层面进行全链条优化。
王成录介绍,EMUI 5.0围绕核心组件内的进程管理和文件系统进行优化。“我们最终把F2FS(专门为Flash闪存定做的操作系统)这个系统放在5.0上了,发现上手机的碎片整理能力比原来EXT系列的文件系统要高了很多。”
而EMUI 8.0的Link Turbo围绕框架层的通信、中间件的连接以及芯片驱动的网络管理做优化。“这是在整个图形中间件、在内存管理,和在进程上做完整的优化技术。”
除去方舟编译器,EMUI 9.0上线的另一重大技术是超级文件系统EROFS,这个文件系统是解决系统分区文件存储和管理的问题,围绕Android系统内核安全管理和内存管理进行改造。
王成录提到,所有系统初始化的文件存在系统分区,以前系统分区只有初始化启动写入一次后,除系统升级以外,永远不允许再次写入。原始的系统分区给只读只写加了两道锁。如果写了以后,就意味着系统已经被攻破。
但文件系统对磁盘读写效率有着重要影响,据华为介绍,超级文件系统EROFS采用了可读设计,使用了压缩算法,Android系统随机读性能平均提升20%,升级包大小下降约5%-10%,升级时间缩短了约20%。
“这个文件系统是只读的,既解决安全性问题,又解决性能效率问题。这个系统是华为百分之百原创的,我们这个团队能够把这件事情做出来,在中国也是第一次。”
走入无人区
据PingWest品玩了解,华为此前在5万台华为手机上秘密试验F2FS文件系统性能的影响,为此王成录还和余承东签了“军令状”——因为测试修改手机文件系统对于手机安全有极大的隐患,一旦发生意外,将对手机品牌造成很严重的影响。而一旦成功,将驱动Android系统带来文件可读取本质和读写性能方面的变革。
一个问题是,华为给Android动了这么多的手术,这件事情Google怎么看?
Google是华为的战略合作伙伴,华为和Google一直保持着积极持续的沟通。王成录说,“我们在安卓底层的优化工作,很多其实都体现在了Android的大版本里,作为了产业的共同资产。比如‘天生快,一生快’里的很多系统机制。F2FS文件系统也为多个厂家使用。”
根据王成录的说法,Google很快就注意到了华为在测试F2FS文件系统,Google的态度是“在中国用没有问题。”
这次进一步推出方舟编译器和超级文件系统EROFS,我们推测华为的目标是,推动这些改变进入Google的开源社区,借此进驻到系统内部。
华为过去几波改造都是推动终端侧的改革。华为提到,这就像是改造人的身体机能。同时,华为还想保证市场上的水和粮食的供应是好的——通过华为HiAI和HiLink,推动外部生态的繁荣和开放。
方舟编译器未来使命就在这里。“这是华为非常完整的逻辑,我相信我们后续仍然会围绕全栈,因为下层的芯片还要不断的演进,上面的应用也在不断发展变化,整个系统优化调整还会持续。”
有了方舟编译器编译以后,就不需要用Java的虚拟机了,它改变了过去Android系统内部的代码解释机制。王成录说,“海思做了芯片以后,需要有自己的编译器才能真正发挥芯片的能力。”
他还提到,方舟编译器也可以适用于ICT行业其他系统,未来可基于具体芯片指令集进行开发。
提到软件研发,王成录流露出了个人情怀,“我觉得中国这么大量的软件研发人员,但国内一直缺乏领先的系统软件。系统软件指的是什么?基本上是操作系统,数据库、编译器。但实际上还有一个,就是编程框架和编程语言。实际上华为走到编译器领域,是非常重要的部分,这个编译器再发展,就可能变成编程框架和编程语言。”
编译器似乎是一个开始。在软件行业,华为正在走入无人区。
网友评论