转文学城

读者按: 最近开始研究华为的系统,读了很多文章和代码,计划庖丁解牛的研究华为面临的问题。只有清晰的了解问题后,才可以对症下药。这篇文章有点意思,记录一下以做参考。

QayQoK

华为消费者业务总裁余承东在朋友圈说最快今年秋天,最晚明年春天,华为自己的操作系统(OS)将可能面市。华为的OS打通了手机、电脑、平板、电视、汽车、智能穿戴,统一成一个操作系统。且华为OS还兼容全部的安卓应用和所有的Web应用,相关安卓应用在华为OS上重新编译后,运行性能提升将超过60%。

据传这个操作系统叫鸿蒙。鸿蒙本意是中国神话中的在天地开辟之前,一团混沌的元气世界。很奇怪,为什么华为的OS叫鸿蒙。等待开辟?还是一团混沌?

余承东别号余大嘴,朋友圈的话算不上正式发布,双重不靠谱。

这位老总一定是把操作系统混同于华为宣传的方舟编译器了。以前华为宣布方舟编译器的终极目标,是推出一个跨平台、跨系统、跨设备多种语言的软件开发平台。操作系统包括的东东比一个编译平台多得多。工作量也大得多。能够跨系统写应用软件不等于一统江湖的跨设备的操作系统。

根据华为公开的信息,鸿蒙是一个基于安卓的,集成了华为对安卓系统的既往优化的操作系统,包括EMUI5.0 优化,方舟编译平台, GC 优化,EROFS文件系统等等。但主框架仍然脱不了安卓或者Linux的操作系统。由于安卓和Linux都是开放的,这样做没有问题。它让人想起了2014年被收购的红旗Linux。

当今手机操作系统领域,基本上是苹果和安卓的二分天下。苹果是先行者,谷歌是赶超者。先行者有先发优势。即使不开放,也能占领很大市场。安卓不同于苹果系统是它的开放性,它采用了跨平台操作的JAVA语言,支持不同硬件设备,环境对应用开发商开放。苹果手机使用自己的硬件,严格管控应用开发商。苹果的封闭环境,使它更易于高效,更容易优化,这就是为什么苹果手机使用规格较低的硬件还能让用户感受流畅的体验。谷歌为了培养生态系统,采用了开源的安卓,对效率和性能不得不有所牺牲。谷歌的开放,使很多新制造商(包括华为)可以快速进入智能手机领域。也使安卓的应用大量增加。据2017年年底统计,安卓的应用比苹果多了42%。全球范围内,安卓用户占86%,苹果用户占14%。

手机操作系统的后发者,还有诺基亚的塞班,Palm的Palm OS和微软的window Phone,都是由于没有杀手锏以及生态圈没做好,惨遭淘汰。

具体来说,安卓系统在两个性能上落后于苹果OS。一个是为了跨硬件操作,JAVA使用了虚拟机。功能是将各种硬件抽象成Java的运行环境,JAVA只管虚拟机。而虚拟机负责连接具体硬件。因此Java实现了跨平台——不管是X86,ARM,还是其他CPU的机器都没有问题。虚拟机里有一个解释器,将JAVA语言逐句翻译成硬件懂得的机器码。而苹果由于没有跨平台的问题,事先把整个程序编译成机器码,执行起来就快了。另一个瓶颈是安卓需要回收不再使用的内存,这个工作叫garbage collection (GC)。GC时,虚拟机要停止运行,判断哪些内存不再使用并释放。这个停顿会造成手机的卡顿。

谷歌和其他安卓手机制造商,也在持续优化安卓,一方面是硬件提升。由于硬件越来越便宜,手机上的CPU增至8核,速度也增加了很多。内存也由几百M增加到8G。软件上,谷歌采用了JIT(Just In Time)编译。当系统发现程序内有一段代码频繁执行的时候,下次调用就不用重复解释,直接执行上次解释出的机器指令。虚拟机进化到ART(Android Run Time)后,采用了AOT编译器(Ahead Of Time),就是运行之前,将部分代码静态编译为机器码,极大地提升了效率。但对于那些Java动态特性的部分,还有其他部分,仍然做不到直接编译,还是要解释执行。GC方面谷歌也做了优化,将GC的频率和时间都减少了。综合效果是,如果你用的是一个比较新的手机,硬件配置属于中高端,安卓版本比较新,基本上感觉不到卡顿,运行比较流畅。

当不能得到谷歌GMS授权后,华为如果能很快推出新手机操作系统,而且这个操作系统有革命性的创新,且性能大大领先于现有的安卓,就会成为一个大杀器,挽回流失的用户。但是作为后发者的华为进入手机操作系统领域,除了为培育生态圈,必须开源之外,还要有一些杀手锏。方舟编译器似乎就是是鸿蒙寄予深厚希望的一个杀手锏。华为宣称,方舟编译器可让系统操作流畅度提升24%,系统响应速度提升44%,第三方应用编译后流畅度可提升60%!是革命性的优化,全程执行机器码,高效运行应用,彻底解决安卓应用“边解释边执行”造成的低效率。

根据目前公开的资料。方舟编译器不再使用Java的虚拟机,而是开发者在应用打包的时候就将所有程序,包括静态和动态的部分直接编译成机器指令。 这种编译会带来跨平台问题,java使用虚拟机解决的正是这个问题。方舟对跨平台问题的解决方法,是同时编译出所有硬件平台对应的机器码文件,之后在具体手机安装的时候选择针对当前硬件平台的机器码装入手机。因此会出现安装包容量大的问题(因为安装包包含所有硬件平台的二进制文件)。导致应用安装包和安装后的机器码占用空间增大。据估计,方舟编译器重新编译的安装包要比安卓大两三倍,手机安装后的机器码要大0.5-1倍。带来的问题是占用存贮和内存显著增加。用户下载安装包会消耗越来越多的时间和流量。这是一个用空间换取运行速度的策略。

方舟编译器会有严重的生态问题。首先华为必须将编译器代码开放,让应用开发商免费下载。应用开发商将其已发布的应用重新编译,并再次对安卓的所有版本和所有硬件平台进行测试。改正Bug后,重新发布,在所有应用商店上架。这个工作必须让各个应用开发商自己做,华为不能代劳,因为由于安全原因,每个应用都要有开发者的签名。这基本上是一个不可能完成的任务。你可以在爱国情怀下忽悠国内的部分开发者,但不可能让全球的应用开发者来跟随。大多数的app开发商是中小规模的,甚至是个人,怎么可能有时间有精力开发编译测试如此多的版本?

方舟编译器还有维护的困难。当新的非华为(高通,联发科等)硬件平台发布后,方舟编译器必须及时跟进,并将新版本推送给所有的开发商。随着越来越多新硬件的发布,方舟编译出的安装包势必会越来越大。用户下载安装包会消耗越来越多时间和流量。同时开发商编译时间会越来越长,需要测试的硬件会越来越多。

img

这么大的麻烦换取的是最多44%的系统响应速度。而且这个提升很可能是在实验室特定条件下测得的。体现在用户感知上,很可能要大打折扣。根据用户感知测试,一般人对在0.2秒以下的速度提升没有感知。在这个区间,人的感知已经达到饱和。换句话说,把响应速度从0.2秒提升到0.1秒,大部分人感觉不到区别。据我的经验,目前中高端安卓手机的性能瓶颈不是CPU的处理速度, 更不在解释执行速度。 所以对这个方舟的优化,用户很可能无感。

另一个华为宣传的对安卓的优化是内存垃圾回收(GC),从全局统一回收改变为随用随回收,回收时无需暂停应用,宣称消除了因内存回收的卡顿。但问题是,安卓自5.0版本以后,采用ART虚拟机,GC的次数和停顿时间已经大大改善,GC引起的卡顿几乎感知不到了。

Q732on

最重要的是,华为这些对安卓的改善可以说都是工程方面的,没有技术的创新。消除JNI的开销,把Java和C在一起编译,来自于甲骨文的GraalVM和开源的LLVM;无需虚拟机类似于苹果swift语言的执行和谷歌的AOT;引用计数的垃圾回收也是业界已有的建议。所有的思路都是谷歌曾经想到的,但为了可移植性做的牺牲。

谷歌也在对安卓优化,开发下一代操作系统。项目叫Fuchsia。 Fuchsia基于微内核架构,用于嵌入式系统,主要使用C语言和C++编写。Fuchsia的设计目标之一是可运行在众多的设备上,包括移动电话和个人计算机。

比较谷歌和华为的操作系统,目标虽然相同。但谷歌的系统包含更多的技术创新,而华为的系统著重于工程集成。这反映了两个公司的区别。谷歌代表的是技术创新。而华为擅长的是工程能力,还需要更多的创新!