华为新发布的方舟编译器,是真牛批还是吹牛皮?

来自:麻辣软硬件(微信号:VOSDeveloper),作者:西门吹雪

4月11日,华为上半年度旗舰P30系列和EMUI 9.1在上海正式发布了,会上华为发布了方舟编译器,让早已在欧洲开过一次的发布会依然让人振奋人心。

在欢呼安卓系统流畅度再次大步追赶IOS的时候,也许很多人(包括我)都会有疑问:华为是不是为了营销夸大宣传了,边解释边执行是好多年前的安卓才这样的呀,方舟编译器真的有那么好吗?

方舟编译器来了

华为宣称:现有安卓是解释执行的,而方舟编译器编译后可以全程执行机器指令.

图1:方舟编译器全程执行机器码


华为宣称:EMUI9.1采用方舟编译器编译之后,给安卓系统带来24%的操作流畅度提升,系统响应性能提升44%。同时应用开发者使用方舟编译器编译一次之后,可以提升应用60%的流畅度。

图2:方舟编译器编译后带来的系统性能提升和第三方应用性能提升


以下是网友做的华为P30与iPhone xs Max的速度对比:

基础知识普及

在Android系统里,Java代码是如何执行的

应用开发与打包

第一步: Java编译器将Java源代码编译成Java字节码文件,扩展名为.class

第二步: dx工具将Java字节码文件处理成Android虚拟机专用的dex文件

第三步:经过签名,字节对齐等操作后,打包成安装包文件,格式为.apk

应用安装与执行

第一步:将dex文件从apk文件中解压出来

第二步:将dex文件的字节码转为本地机器指令。余承东说的边解释边执行就是这一步。

第三步:执行机器指令

安卓虚拟机的类型

  • Dalvik虚拟机

    在Android5.0之前,系统的默认虚拟机是以Dalvik虚拟机。

  • ART虚拟机

    从Android5.0开始,安卓抛弃了Dalvik,使用ART虚拟机,目前安卓使用的也是ART。

字节码执行的方式

  • 边解释边执行

    这种方式就是原始Java程序的执行方式,效率比较低。

  • JIT (Just In Ttime)

    这种模式是在程序运行起来后才将字节码编译成机器指令。程序运行后,有分析模块分析出热点代码,然后通过JIT的方式将这部分热点代码编译成机器指令。

  • AOT (Ahead Of Ttime):

    这种模式就是在程序启动前提前将字节码编译成机器指令。但是会带来两个缺点:

    1、应用安装速度慢。例如现在105M的微信安装需要几分钟。

    2、更多的存储占用。例如下边一个混沌大学的app,oat后还多出17M的oat文件出来,而apk里的dex本来就只有14.6M。


  • 图3:混沌大学app将dex编译为oat后的存储占用情况

Android 6.0到Android 7.0对字节码编译执行的改进

主要说7.0版本是因为从7.0开始,安卓已经在字节码执行上通过权衡取舍,应用安装速度,启动速度,存储空间占用上都有了较好的表现。

安卓5.0-6.0,完全采用AOT的优劣:

图4:Android6.0时代的全AOT编译



安卓7.0,JIT + AOT +解释执行模式:

图5:android7.0时代:解释执行+JIT+AOT

疑问一:"边解释边执行",不是好几年前的安卓系统才会吗,华为是不是夸大宣传了?

从Android5.0开始就就已经采用ART虚拟机,目前的安卓系统采用JIT和AOT,也会生成机器指令。完全说目前的安卓系统边解释边执行感觉太过夸张呀。

疑问二:"经过方舟编译器编译后的安卓系统,系统响应能力提升44%",是说方舟编译器生成的机器指令更优?

根据华为的宣传,EMUI 9.1系统经过方舟编译器编译后,系统响应能力提升44%。因为从Android7.0开始,系统的代码已经被编译为本地机器指令了(在boot.oat里),既然经过方舟编译器编译后的system_server进程效率更高,那么我们可以认为方舟编译器生成的机器代码比谷歌提供的编译器更优秀

疑问三:"应用经过方舟编译器编译后,操作流畅度提升60%",是说方舟编译器编译的机器指令能屏蔽了芯片平台差异了?

根据华为的宣传---对应用进行编译,然后这个应用就可全程执行机器码,我们可以肯定方舟编译器将字节码生成了机器指令并打包到APK里了。然而这种做法其实就是AOT的做法,只是将AOT放到了PC上执行而已。谷歌没有直接采用这种在PC上进行AOT处理,而是放到设备本地执行,应该是顾忌这样将产生平台相关性,避免加大安卓的碎片化。

在Android应用开发时,为了提升性能很多应用都采用jni调用c/c++的动态库的方式。例如混沌大学app就提供了x86和armeabi两种平台的动态库。


图6:混沌大学应用的native库

目前应用希望提升执行效率,又希望在多种芯片平台上能通用,于是采用每个芯片平台都编译一份机器指令(动态库)的做法。那么这种芯片平台相关性,谷歌没有解决的问题,华为的方舟编译器真的通过架构级别的优化解决了?

  • 如果仅仅是创造了一个编译器,然后生成了海思麒麟芯片自己的专有应用,那么就有点夸大宣传了。可想而知如果是这样,那么高通就提供高通编译器,三星猎户处理器提供猎户编译器,进一步分裂,不是我们想看到的。

  • 如果方舟编译器编译的机器代码所有芯片平台都能用,那么可以为华为鼓掌了,的确是革命性的!可想而知,既然字节码编译的机器码为所有平台通用,那么应该可以研究一下,可以也把c/c++的编译都跨平台执行,岂不是要上天了!


众多猜测

1、方舟编译器是一套编译工具链,编译生成的机器码完全摆脱“需要在ART里执行”的束缚,比谷歌的编译器更优。
2、华为做了个ART,方舟编译器编译字节码为机器码,但需要在EMUI里才能运行。
3、方舟仅仅编译了更优的字节码。
4、方舟编译器编译的机器码,第一次突破了平台相关性。

我们的期待

编译器大牛Fred Chow加入华为已经4年了,他的加入使得华为成为了国内唯一一个能写编译器的公司。憋了4年的大招,华为终于亮剑,作为国人,我们也为华为感到骄傲!我们希望方舟编译器是真正革命性的东西。

同时也希望这是全安卓阵营都能使用的,而不是仅适用于华为EMUII系统,这样大家的手机都能使用了。我也想赶紧用方舟编译器将我们公司的android framework重新编译一次,感受一下那44%的性能提升。

结束语

由于华为没有提供程序和源码下载,这些疑问只能等待正式开放下载后去验证了。你对方舟编译器作何看法,欢迎留言与我们交流!

推荐↓↓↓
安卓开发
上一篇:写给Android开发的Gradle知识体系 下一篇:Android系统内存泄露之必备调试工具