华为方舟编译器改造了Android

2019-04-30 11:14 来源£º互联网

在前不久华为P30系列新品发布会上£¬华为消费者事业群 CEO余承东提到过一项很厉害的技术£¬但被他一嘴带过£¬这项技术就是方舟编译器¡£

他提到£¬方舟编译器可以提升Android系统内应用的编译效率£¬过去Android应用一边编译一边执行£¬而方舟编译器将转变为全程机器预编译然后高效执行¡£华为宣布£¬使用方舟编译器最终将提升24%的系统操作流畅度£¬提升44%的系统响应能力£¬以及提升60%的三方应用操作流畅度£¬“Android系统将比iOS系统还要流畅”¡£这一技术将正式开源给开发者£¬让所有人都可以使用方舟编译器对应用预编译¡£

据华为消费者事业群软件部总裁王成录向包括PingWest品玩在内的媒体介绍£¬自发布会结束后£¬华为软件内部团队的电话几乎被打爆£¬很多开发者都想了解方舟编译器更多的信息¡£

这个技术到底厉害在哪£¿

它哪里厉害£¿

在了解方舟编译器的同时£¬我们需要先了解一下Android的编译流程¡£

编译器的定义为£º将“一种语言£¨通常为高?#38431;?#35328;£©”翻译成能直接被计算机或虚拟机执行的目标代码£¬编译器的效率将直接影响程序运营性能/效率¡£

而Android系统内部绝大多数应用的逻辑部分都使用Java来编写£¬但为了保证安全性¡¢可靠性¡¢兼容性等不同的需求£¬很多开发者会使用不同的语言来编写其他的库£¬最终供Java调用¡£也就是说在Android系统内部£¬不同模块可能采用了不同的语言编写£¬而为了达对各个模块的互相理解£¬相互调用则会带来系统资源?#31995;?#20869;耗¡£

编译器充当的是“翻译”功能¡£将不同计算机的高?#38431;?#35328;转化为机器可以理解¡¢可以执行的机器语言£¬由不同的代码替换为机器可读懂的“0101”¡£这体现在软件开发的部分¡£

而编写应用的Java代码能够如何被Android系统理解£¬直接影响了程序的执行效率¡£编译器的性能体现在是否可以将一种语言完美地解释为可执行的高?#38431;?#35328;¡£

比如说£¬一个中英文翻译£¬她既能理解中文成语的博大精深£¬也可以谱写出英文语境中优美的句子¡£

乍一看£¬只要有一个非常好的“翻译官/编译器”就可以解决所有的问题¡£其实在编写Android系统的Java语言内部£¬还引入了虚拟机的机制¡£

从Android系统诞生那天起£¬就选择了使用Java作为基础的编写语言¡£据王成录介绍£¬Java语言有非常多的优势£¬比如说它跨平台¡¢分布式£¬安全性做得都很好¡£而Java语言设计当初就有一个JDK£¬叫Java语言的开发包£¬开发包中就包含了一项重要的功能£¬称之为虚拟机¡£

虚拟机主要针对?#24067;?#29615;境¡£有了这个虚拟机以后£¬接下来无论是?#35009;?#26679;的?#24067;þ£¬Java语言不需要管了£¬它的功能是将其抽象成Java的运行环?#24120;?#22240;此Java实现了跨平台——不管是X86机器£¬ARM机器£¬还是其他CPU的机器都没有问题¡£但这也导致了新的问题?#20309;?#35770;任何一个机器£¬虚拟机资源必须分配好£¬所以占用了额外的系统资源¡£

也就是说£¬一个应用先由Java编写成可执行文件£¨Dex码£©£¬再进入系统由虚拟机虚拟环境解释执行为机器可读的二进制码¡£两道工序的执行效率也就是应用在系统内被执行使用的执行效率¡£

打开使用一个软件应用£¬快不快£¬体验好不好£¬就在于这两道工序效率如何¡£

?#23548;?#19978;Android的演进解释了这套编译逻辑上带来的效率问题¡£王成录提到£¬Android 1.0的时候£¬基?#23601;?#20840;使用Dalvik虚拟机£¬逻辑就是解释一句执行一句£¬效率非常慢¡£Android 2.2的时候£¬当系统发现应用内有有一段代码频繁执行的时候£¬系统将直接编译解释£¬下次调用就不用重复解释£¬直接执行上次解?#32479;?#30340;机器指令£¬这叫JIT£¨?#35789;保¬Just In Time£©编译¡£但是这个应用一退出了以后£¬ 这段机器指令也消失了¡£

Android 5.0的时候£¬一个非常大的变化是引入了ART虚拟机£¨Android Run Time£©£¬采用AOT编译器£¨Ahead Of Time£©£¬就是运行之前£¬将部?#25191;?#30721;编译解释好为二进制语言£¬转为静态编译£¬极大地提升了效率¡£但对于那些Java动态特性的部分£¬还有其他部分£¬仍然做不到直接编译£¬还是要解释执行¡£

前面已经提到£¬一个应用由C语言编译出来的库£¬加上Java语言本身的编译以及虚拟机的编译£¬当一个应用发生复杂的逻辑关系调用时£¬解释和编译这些代码需要通过接口去使用£¬因此产生很大的开销¡£“一个数据£¬如果没有跨语言的协同£¬和有跨语言协调来比£¬效率差别很大¡£”王成录说¡£

方舟编译器是直接将应用打包成二进制码输送到系统内执行£¬将所有编译转为静态编译¡£“有了方舟编译器后如何实现的呢£¿相当于£¬我不论你这个业务逻辑是Java写的还是库是用C写的£¬都没有问题£¬用方舟编译器做了统一的程序优化以后直接编译成机器指令¡£用方舟编译器做出来的APK£¬下载到手机上不需要再编译了¡£这就是巨大的差别¡£”

“最难啃的骨头”

王成录介绍£¬华为方舟编译器有四大技术亮点¡£第一£¬首个多语言联合优化的编译器£¬消除了跨语言调用开销£»第二£¬程序运行时无需依赖虚拟机£¬减少了资源占用£¬同时实现了高效的内存回收机制£»第三£¬方舟编译器可以针对不同应用灵活编译优化£»第?#27169;?#23545;于开发者学习和使用成本非常低¡£

方舟编译器最大的突破是将所有编译的部分£¬包括静态动态的部分全部变为静态编译出的二进制代码¡£

众所周知£¬Java语言系统非常庞大¡£这就需要对Android现有的应用£¬可能会用到哪些库£¬这些库之间怎么用理解£¬需要大量的分析运行状态£¬才能够将这些动态特性完成提前的编译¡£由于是机器语言£¬所以还涉及到了跨?#24067;?#24179;台开发¡£

这就需要对所有开发环境¡¢系统内部解释环境的编译及语言¡¢整体架构和逻辑理解非常深入¡£“就像一个优秀的翻译官一定对汉语言文学理解的非常到位£¬然后再对英语理解非常到位¡£”

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

逻辑通顺以后£¬还需要大量的优化和调整¡£一方面对Java语言的了解再深入再细致再重建£»另外一方面£¬对机器指令?#25215;?#32467;构理解要非常清楚才行£¬这两个匹配的方法越?#26082;ÁP?#32534;译器效率越高¡£“一个好的编译器£¬开发者一行代码都不需要修改£¬性能能提升10%到20%¡£”

据PingWest品玩了解£¬方舟编译器是个通用技术£¬基于目前ARM指令集开发¡¢适用于所有ARM芯片平台¡£也就是说£¬经过方舟编译器编译的应用£¬再经过其他品牌厂商的适配£¬就可以适用于包括小米¡¢OPPO¡¢vivo等其他品牌手机?#31995;ÄAndroid系统¡£如果没有适配£¬则?#25925;前?#29031;普通app效率执行¡£

据王成录介绍£¬华为在2009年开始准备编译器研发方面的工作£¬从华为海思研发起步时£¬2013年华为HCC自研编译器有了雏形£¬它吸引了第一批海内外?#33455;?#20154;员加入£¬创建了编译组¡£

随后£¬华为“2012年实验室”成立£¬2016年正式设立了编译器与编程语言实验室¡£直到今天£¬华为才算正式推出了方舟编译器¡£王成录说£¬编译器真的是一个“板凳要坐十年冷”的工程£¬“我们稳得住才能做下来£¬非常的复杂¡£”

据PingWest品玩了解£¬方舟编译器开发人员有一半来自于消费者BG£¬一半来自于“2012实验室”£¬投入研发人员几百人¡£

方舟编译器是华为发布的最新的“黑科技”£¬但华为不是无意为之¡£王成录介绍说£¬华为一直在围绕性能这条线找最主要的矛盾¡£比如随着应用的丰富£¬手游越来越流行£¬华为针对游戏做了GPU Turbo¡£把游戏问题解决后£¬发现还有很多应用需要改进网络实时连接£¬所以华为发布了Link Turbo£¬“这个发挥了华为的优势£¬我们对网络非常熟悉£¬我们做了聚合?#35759;?#21644;网络的连接¡£”

王成录说£¬方舟编译器是最后的¡¢最难啃的骨头£¬但华为把它攻克了¡£

给Android系统动手术

华为方舟编译器£¬只是华为改造Android性能的一部分¡£

简而言之£¬华为在系统软件上针对用户使用中的痛点问题进行有针对性的优化¡£比如EMUI 5.0主要解决Android系统卡顿问题£¬EMUI 8.2上线了GPU Turbo主攻游戏性能受限问题£¬EMUI9.0上线了Link Turbo主攻网络覆盖不均问题£¬EMUI 9.1则上线了方舟编译器?#32479;?#32423;文件系统EROFS£¬针对Android流畅度不足问题¡£

铺开Android系统全栈图£¬华为针对每一项Android系统内部模块进行改造优化¡£

华为将Android系统分为生态外部¡¢框架层¡¢中间件¡¢?#24067;?#25277;象和内核等多个层面进行全链条优化¡£

王成录介绍£¬EMUI 5.0围绕核心组件内的进程管理和文件系统进行优化¡£“我们最终把F2FS£¨专门为Flash闪存定做的操作系统£©这个系统放在5.0上了£¬发现上手机的碎片整理能力比原来EXT系列的文件系统要高了很多¡£”

而EMUI 8.0的Link Turbo围绕框架层的通信¡¢中间件的连接以及芯片驱动的网络管理做优化¡£“这是在整个图形中间件¡¢在内存管理£¬和在进程上做完整的优化技术¡£”

除去方舟编译器£¬EMUI 9.0上线的另一重大技术是超级文件系统EROFS£¬这个文件系统是解决系统分区文件存储和管理的问题£¬围绕Android系统内核安全管理和内存管理进行改造¡£

王成录提到£¬所有系统初始化的文件存在系统分区£¬以前系统分区只有初始化启动写入一次后£¬除系统升级以外£¬永远不允许再次写入¡£原始的系统分区给只读只写加了两道锁¡£如果写了以后£¬就意味着系统已经被攻破¡£

但文件系统?#28304;?#30424;?#21015;?#25928;率有着重要影响£¬据华为介绍£¬超级文件系统EROFS采用了可读设计£¬使用了压缩算法£¬Android系统随机?#21015;?#33021;平均提升20%£¬升级包大小下降约5%-10%£¬升级时间缩短了约20%¡£

“这个文件系统是只读的£¬既解决安全性问题£¬又解决性能效率问题¡£这个系统是华为百?#31181;?#30334;原创的£¬我们这个团队能?#35805;?#36825;件事情做出来£¬在中国也是第一次¡£”

走入无人区

据PingWest品玩了解£¬华为此前在5万台华为手机上秘密试验F2FS文件系?#25215;?#33021;的影响£¬为此王成录还和余承东签了“军令状”——因为测试修改手机文件系统对于手机安全有极大的隐患£¬一旦发生意外£¬将对手机品牌造成很?#29616;?#30340;影响¡£而一旦成功£¬将驱动Android系统带来文件可读取本质和?#21015;?#24615;能方面的变革¡£

一个问题是£¬华为给Android动了这么多的手术£¬这件事情Google怎么看£¿

Google是华为的战略合作伙伴£¬华为和Google一直保持着积极?#20013;?#30340;沟通¡£王成录说£¬“我们在安卓底层的优化工作£¬很多其实都体现在了Android的大版本里£¬作为了产业的共同资产¡£比如‘天生快£¬一生快’里的很多系统机制¡£F2FS文件系统也为多个厂家使用¡£”

根据王成录的说法£¬Google很快就注意到了华为在测试F2FS文件系统£¬Google的态度是“在中国用没有问题¡£”

这次进一步推出方舟编译器?#32479;?#32423;文件系统EROFS£¬我们推测华为的目标是£¬推动这些改变进入Google的开源社区£¬借此进驻到系统内部¡£

华为过去几波改造都是推动终端侧的改革¡£华为提到£¬这就像是改造人的身体机能¡£同时£¬华为还想保证市场?#31995;?#27700;和粮食的供应是好的——通过华为HiAI和HiLink£¬推动外?#21487;?#24577;的?#27604;?#21644;开放¡£

方舟编译器未?#35789;?#21629;就在这里¡£“这是华为非常完整的逻辑£¬我相信我们后续仍然会围绕全栈£¬因为下层的芯片还要不?#31995;?#28436;进£¬上面的应用也在不断发展变化£¬整个系统优化调整还会?#20013;ø¡?rdquo;

有了方舟编译器编译以后£¬就不需要用Java的虚拟机了£¬它改变了过去Android系统内部的代码解释机制¡£王成录说£¬“海思做了芯片以后£¬需要有自己的编译器才能真正发?#26377;?#29255;的能力¡£”

他还提到£¬方舟编译器也可以适用于ICT行业其他系统£¬未来可基于具体芯片指令集进行开发¡£

提到软件研发£¬王成录流露出了个人情?#24120;?ldquo;我觉得中国这?#21019;?#37327;的软件研发人?#20445;?#20294;国内一?#27604;?#20047;领先的系统软件¡£系统软件指的是?#35009;´£?#22522;本上是操作系统£¬数据库¡¢编译器¡£但?#23548;?#19978;还有一个£¬就是编程框架和编程语言¡£?#23548;?#19978;华为走到编译器领域£¬是非常重要的部分£¬这个编译器再发展£¬就可能变成编程框架和编程语言¡£”

编译器似乎是一个开始¡£在软件行业£¬华为正在走入无人区¡£

?#30001;?· 阅读