技术宅
对于手机的底层系统和CPU来说,它们只“认识”0和1这样的机器码,而在安卓上运行的APP大多是由Java开发的,这种高级程序语言必须转换成机器码,才能够被底层系统所识别(图1)。
从高级语言的源代码到系统底层目标码的转换,是由编译器来完成的,它的角色比较接近现实中的翻译,因为我们人脑(类似安卓手机的CPU)不懂外语,想要和外国人交流的话就需要借助翻译(即编译器),将外语转换为我们可以理解的母语。好的翻译可以影响双方交流的流畅度,而一个好的编译器同样直接影响着手机系统和软件的运行效率。
此次华为开发的方舟编译器是怎样提高手机系统效率的呢?
开发安卓应用目前用得最多的是Java,它所创建的源文件经过编译生成Class.dex文件,最后被打包成DEX字节码文件,再由安卓系统中的Dalvik、Art(编译器)负责将DEX字节码翻译成机器码,手机CPU识别出机器码中的操作命令后即可实际执行了。有兴趣的朋友可以用72ip解开安卓应用的APK安装文件,就会发现其中包含有Class.dex文件(图2)。
每次安卓应用运行时,Dalvik动态地将一部分Dalvik字节码解释为机器码。随着应用的运行,更多的字节码被编译和缓存,这就是典型的“边解释边执行”的安卓运行模式。虽然这种模式具有更小的内存占用和更少的设备物理空间占用优势,但是也导致安卓系统的运行效率更为低下。这也是为什么很多安卓机型在硬件配置上可以甩掉iPhone几条街,但是系统流畅度仍然不如iOS的根本原因(图3)。
另外一方面,由于Java的跨平台特性是靠字节码实现的,这就导致应用运行时,必须先将高级语言转换成字节码,再将字节码转换成机器需要的语言,而且还得需要虚拟机环境才能运行,过多的中间环节使得运行效率进一步受到影响。
针对这一问题,方舟编译器—方面从机器码的编译效率入手,它不像传统的安卓编译器那样“边解释边执行”,而是将动态编译改进为静态编译,这样可以做到全程执行机器码高效运行程序,大大缩短了程序响应时间。这有些像我们在优酷上看电视连续剧,传统的安卓是一集集按部就班地播放,方舟编译器则类似使用了快进的方式快速预览全集,这样看连续剧花的时间更少,但是该有的劇情一个都不会少(图4)。
另—方面,方舟编译器摒弃了虚拟机运行环境的依赖。现在安卓上的应用95%都涉及到多种语言的开发,如C、C++、Java等,不同的语言代码保持独立,在运行环境中进行协同,因此会产生系统性能的部分损耗。比如大部分依靠Java开发的应用需要虚拟机环境才能运行,这无形中增加了性能的损耗,方舟编译器则可以做到将不同语言的代码放到同一套编译好的执行文件中,省去虚拟机额外的损耗,从而提高效率(图5)。
通过上述两方面的优化,部署方舟编译器的手机可以有明显的速度提升。根据华为发布会公布的测试结果(内部测试):EMUI 9_, 1中仅仅对系统组件System Server使用方舟编译器进行优化,就可以带来24%的系统流畅度提升,系统响应性能提高44%。目前第三方APP适配后(微博极速版)操作流畅度可以提升60%。现在配备的方舟编译器的P30 Pro已经上市,从网友实际使用体验看,系统运行速度和同等配置机型相比也有明显的提升(图6)。但是否真能与官方宣传数据相符,还需要静待第三方权威机构的测试结果。
华为计划在2019年1 1月的绿盟开发者大会上将完整的方舟编译器代码开源。如果开发者都可以使用统一的方舟编译器,那么安卓底层编译开发就可以实现统一化,大大降低碎片化的问题,改善其性能劣势。
不过方舟编译器毕竟是针对系统底层的优化,需要海量第三方应用的开发和适配,这是一件非常花费时间的事情。而且不是先进的编译技术就一定能“一统江湖”,安卓应用的生态现极为混乱不堪,各厂商对系统优化的理解也均不相同,在大家没有形成统一意见时,利益竞争往往会摆在第一优先级。“方舟”是未来的主流还是华为的自娱自乐,这些都有待时间来验证。