改造了Android的华为方舟编译器
在前不久华为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动态特性的部分,还有其他部分,仍然做不到直接编译,还是要解释执行。
中国观察