首页
正文
好机友
2019-08-12
除了鸿蒙 OS,你别忘了华为这项秘密武器
前两天,万众期待的鸿蒙 OS,终于在华为开发者大会上与世人见面了。
毕竟等待了这么久,千呼万唤始出来,大家对它都抱有 12 分的关注。
可机哥发现……
就在同一场发布会,还有个重磅程度不亚于鸿蒙 OS 的狠角色,却被很多人忽略。
在机哥看来,它对华为系统生态的发展,具有极其重大的战略意义。
而且当下对用户的影响甚至超过鸿蒙。
不卖关子,它就是——
方舟编译器
自打今年四月华为第一次对外宣布方舟编译器以来,大家总是能在各种场合听到这东西。
但绝大多数人并不了解它到底是个啥。
机哥用尽可能大白话的方式给大家科普一下。
故事的开端要从安卓的老难题说起:
安卓的老难题
一直到现在,机哥还经常听到有人在选购手机的时候说:
" 买安卓?不行不行,太卡了,我还是用苹果吧。"
以机哥多年的搞机经验来看,这句话绝对不是子虚乌有的污蔑," 卡顿 " 确实是困扰安卓好多年的难题。
特别是安卓 5.0 之前的版本,手机刚买来时还凑合,用的时间一久……
便出现滑动不流畅、掉帧。应用启动加载慢就算了,有时候还假死。每每看到程序未响应,都让我回忆起曾经被 Windows 支配的恐惧。
安卓为什么会这样呢?
原因有很多方面,机哥人认为最大的问题有三个。
作为六号线最会说人话的科技宅,机哥就不扯那些专业的术语,咱们打一个通俗易懂的比方来说明:
假设今天机哥想读一本书,嗯,一本世界名著。
只不过,它是全英文的。
这时候机哥遇到了第一个问题:
我是个英语文盲,要想看懂这本书,该怎么办?
很简单,请一名翻译。
只要翻译对着书,逐字逐句翻译成中文给我听,我就能懂了。
但是,速度很慢。
很快,机哥遇到了第二个问题:
这本名著里除了英文,偶尔还会出现其他语言,比如法语。
我的英语翻译不懂法语,读到这里就卡住了,怎么办呢?
办法是这样的,这名英语翻译有个懂法语的朋友,他打电话询问了那个朋友,帮忙翻译。
恩,虽然最后我听懂了,但效率真的很低。
最后,还有第三个问题:
我会疲劳。
一次性听了几个章节后,累了咋办。
那只能停下来休息一会儿呗。这样,我们又耽搁了一点时间。
注意,下面重点来了,我们把上面这个故事的要素替换一下:
英语 = 安卓的基础语言 Java;
中文 = 机器能懂的语言;
机哥 = 机器;
翻译 = 把 Java 翻译成机器语言的 " 解释器 ";
法语 = 其他编程语言;
疲劳 = 内存资源不够用。
这个故事也就解释了安卓手机卡顿的三大原因:
首先是手机 CPU 听不懂 Java 语言,需要虚拟机的 " 解释器 ",把 Java 字节码翻译成机器语言来运行,速度很慢。
其次是 Java 原生接口需要和 C/C++ 等其他语言的代码进行交互,造成额外的 JNI 开销,拖垮了效率。
最后是当内存不够用时,安卓虚拟机会采取 GC 内存回收机制,导致机器卡顿。
这么一说,安卓这是一身毛病啊,谷歌就没想过改善一下吗?
事实上,他们做了不少努力。
谷歌为了解决卡顿曾经做过的事
机哥上面说了,安卓的虚拟机机制,需要把 Java 语言,翻译一道才能给机器运行。
效率低下不说,还特别吃硬件。
谷歌早就意识到这个问题,在 Android 2.2 中加入了一种叫做 JIT的机制。
JIT 意思是即时编译(Just in Time)。
放到机哥举的例子中就是:翻译者不再逐字逐句翻译,每次阅读的时候,他会把这个章节中的常见单词教会机哥。
有了这样的基础,我的阅读效率提高了不少。
但提升很有限。
于是从 Android 5.0 版本开始,谷歌又引入了一种叫做 AOT的新机制。
AOT 意思是提前编译(Ahead of Time)。
相当于在机哥开始阅读这本书之前,翻译把这本书里的所有单词都先教给机哥了。
这解决了机哥阅读速度慢的问题,但又带来了新的问题。
阅读之前,教单词费时间啊。
对应到手机中,就是每次安装一个应用、升级一个应用速度奇慢无比。
大家应该都记得当初安卓 5.0、6.0 那会儿,系统升个级,一堆应用排队优化,速度有多慢吧。
所以到了 Android 7.0,谷歌把上面这些方法全都结合在了一起。
JIT + AOT + 解释器。
运行的时候进行 JIT,并把编译好的机器码保存下来。
机器空闲的时候进行 AOT,如果两者都来不及,那再使用解释器。
所以,如今新版本的安卓,再也不会像以前那样卡顿。
到这里,安卓的运行模式达到了一个很好的平衡…………吗?
然而并没有,无论谷歌怎么改进,虚拟机、解释器对硬件的占用依然存在。
这之中还有可以提升的余地。
于是,华为出手了。
华为是怎么做的
华为思考问题的方式,果然是简单直接而有效。
我们把问题拉回到最开始。
当机哥拿起那本英文世界名著,一筹莫展的时候。
怎么就没想到……买一本中文翻译版呢?
如果这本书早就被翻译成了全中文,我为什么还要找翻译、学英语、问法语呢?
这可以节省多少资源和时间啊。
华为的解决方案正是如此,方舟编译器所做的,相当于把英文名著,翻译成中文译本的工作。
也就是说,在应用打包 APK 的时候,就把 Java 代码编译成了机器码。
说着简单,真正要实现起来其实困难重重。
要将 Java 语言直接编译成机器码,不仅仅要编译静态语义,还要能编译千变万化的动态语义。
这之中的难度非常巨大,毕竟安卓花了十几年都没能彻底解决。
你要说被华为轻轻松松就搞定了?那实在有点傲慢。
实际上华为为了攻克这个难关,做了很多艰苦卓绝的工作。
从 2009 年就开始布局,期间投入了大量人力物力。
方舟编译器团队遍历了 Java 的动态语义,做了大量的数据建模,设计了具有核心专利的动态语义匹配机制。
还实现了混合语言的统一 IR(中间语言),有效避免多余的 JNI 开销。
顺便引入计数法(Reference Counting)来进行内存回收,解决了安卓 GC 回收机制的弊端。
最后的结果就是,操作系统的流畅度提升 24%,系统响应性能提升 44%。
经方舟编译的第三方 App,操作流畅度甚至能提升 60%。
光说不练假把式,华为说提升 60% 就 60% 了?
机哥拿第一批使用上方舟编译器的 App 微博极速版,实测试试。
咱们直接把难度拉到最高,点开华为官方微博的相册,测试短时间加载大量图片的速度。
PK 的对象,挑一台人们心目中流畅度的标杆—— iPhone XS Max,来看看到底是谁更胜一筹。
左:iPhone XS Max │ 右:P30 Pro