周末在家休息,闺蜜刷朋友圈,突然问我:最近朋友圈经常被华为刷,什么是“鸿蒙”?图片来自Pexels鸿蒙OS评测2019年8月9日在华为开发者大会上,华为消费者业务CEO余承东正式宣布发布自家操作系统鸿蒙。内核是Linux内核、鸿蒙微内核和LiteOS。以后我们会去掉Linux内核和LiteOS,只有鸿蒙微内核。鸿蒙(英文:HarmonyOS,代号方舟)是华为自2012年开始研发的跨平台操作系统,可兼容安卓App。图:鸿蒙OS四大技术特点鸿蒙OS四大技术特点如下:终端OS首次采用分布式架构,实现跨终端无缝协同体验。确定性延迟引擎和高性能IPC技术使系统具有内在的流畅性。基于微内核架构重塑终端设备的可信安全。通过统一的IDE支持一次性开发和多终端部署,实现跨终端生态共享。什么是跨平台过去,平台≈操作系统。因此,传统意义上的跨平台不依赖于操作系统或硬件环境。在一个操作系统下开发的应用程序仍然可以在另一个操作系统下运行。但随着技术的发展,平台≈操作系统不再成立,就像华为推出的鸿蒙OS,可以支持多种设备,手机、手表、电脑、汽车、智能家居设备等所以,我们今天说的跨平台,指的就是跨设备。即平台≈设备。因此,华为希望鸿蒙OS能够运行在多种设备上,所以鸿蒙OS必须具备跨平台的能力。而且,鸿蒙要做的不仅仅是让操作系统跨平台,更重要的是让用户和开发者真正感受到跨平台。因此,跨平台操作系统鸿蒙的目的就是让开发者专注于自己的业务逻辑,像开发同一个终端一样开发跨终端分布式应用,让最终消费者享受强大的跨终端业务协同能力各种使用场景。无缝体验。Java实现跨平台先说Java是如何实现跨平台的。Java对跨平台的支持,就像对安全性和网络移动性的支持一样,分布在整个Java体系结构中。其中,Java语言规范、Class文件、Java虚拟机(JVM)等起着重要作用。首先,在Java语言规范中,规定了Java语言中基本数据类型的取值范围和行为。第二,所有的Java文件都应该编译成一个统一的Class文件。最后通过Java虚拟机将Class文件转换成平台对应的二进制文件。Java的平台无关性是基于Java虚拟机的平台依赖性,因为Java虚拟机屏蔽了底层操作系统和硬件的差异。如果要运行一段Java代码,需要经过多个步骤将Java源代码转换成机器可以执行的机器码。这个过程主要由虚拟机完成。在大名鼎鼎的HotSpot虚拟机中,主要有两种解释执行和即时编译的形式:解释执行,将字节码逐一翻译成机器码并执行。即时编译(Just-in-time,JIT),将一个方法中包含的所有字节码编译成机器码然后执行。HotSpot默认采用混合模式,结合了解释执行和即时编译的优点。它首先解释并执行字节码,然后将重复执行的热点代码(hotspotdetection)以method为单位进行即时编译编译。Android实现跨平台Android其实是基于Java语言的,所以同理,如果要运行一段Android代码,也需要经过多个步骤,将Android源代码转换成机器可以运行的机器码。可以执行。但是这个转换过程在不同的Android版本中实现方式不同:Android1.0(2008):使用了一个名为Dalvik的虚拟机,并集成了一个解释器。App运行时调用解释器逐句解释代码,速度很慢。Android2.2(2010):引入了JIT(JustInTime)即时编译机制。App运行时,用户经常使用的功能会被编译成机器可以直接执行的010101机器码,无需逐句翻译。当有不常用的功能时,调用解释器进行翻译;这样可以加快速度,但是每次启动app都要重新编译,不能一劳永逸。Android5.0(2014年10月):将虚拟机Dalvik替换为ART(AndroidRunTime),将JIT编译器替换为AOT(AheadofTime)。这样,在手机上下载安装app时,能编译的代码先编译成机器能看懂的101010;其余不易翻译的代码在用户使用时由解释器唤醒翻译。这样就不用每次打开都编译app,但是安装app时间长,占用手机空间。Android7.0(2016):采用混合编译机制。安装时不编译中间代码,而是通过AOT编译器静态编译用户空闲时可以编译成机器码的部分代码。如果AOT还没来得及编译或者无法编译,那么就调用JIT+解释器。这种机制相当于用时间换取空间,不仅缩短了用户安装APP的等待时间,也将虚拟机中的编译器和解释器可以做的优化提升到最大效率。Android编译的问题可以看出,从2008年的Android1.0开始,Android就一直在编译优化上下功夫。目前的Android采用了解释执行+JIT+AOT的综合模式,在空间占用+安装速度+运行速度上达到了很好的平衡。但是Android编译问题一直饱受诟病。虽然在后续的Android8.0上对解释器进行了改进,解释器模式的执行效率有了很大的提升。Android10.0提供了预置热代码的方式。App安装时,可以提前知道常用代码会被编译。但是,目前来看,无论如何,Android都无法摆脱应用程序在打包成APK时,仍然使用Java代码的前提。也就是说,APK在成为用户适用的过程中,还经历了Android系统内部的编译过程,这是一道无法回避的坎。鸿蒙实现跨平台那么,鸿蒙OS的代码编译是怎样的呢?它是如何解决跨平台问题的?从上图可以看出,在鸿蒙OS的架构中,方舟编译器和多终端开发IDE扮演着重要的角色。跨平台最大的挑战之一就是各个平台的适配。尤其是现在,设备的种类越来越多。同一个应用如何适配手机、手表、汽车、电视?什么?多端开发IDE是这样做的:使用华为提供的多端IDE,多语言统一编译,分布式架构Kit提供屏幕布局控件和交互的自动适配,支持拖拽控件,预览面向可视化编程。通过这种方式,开发者可以基于同一个项目高效构建多端自动运行的应用,实现真正的一次开发,多端部署,实现跨设备共享生态。上图是华为提供的IDE,可以通过图形界面拖放控件,IDE可以自动适配各种终端设备。有了IDE,开发可以轻松开发出一套代码,可以自动适配各种设备,只是各种设备执行的机器指令不同。如何将这套代码编译成各个设备要求的机器指令呢?Android设备是由不同设备上内置的虚拟机编译的,所以在编译之前就知道设备是什么了。那么,鸿蒙OS是怎么做到的呢?这就是方舟编译器所做的。发生了一些事。华为方舟编译器是第一个替代安卓虚拟机模式的静态编译器,允许开发者在开发环境中一次性将高级语言编译成机器码。此外,方舟编译器未来将支持多语言统一编译,可大幅提升开发效率。Android之所以“慢”,是因为它的编译过程是在终端进行的,也就是说需要通过用户手机上的虚拟机编译成可执行的机器码。鸿蒙OS使用的方舟编译器,可以直接将高级语言(Java)转化为机器码,从而绕过虚拟机。而这个编译过程并不是在用户手机上完成的,而是在应用开发阶段完成的。通过方舟编译器,开发者的应用程序在下载前已经转换为机器可读代码,无需VM编译即可在手机端快速安装、启动和运行。某种程度上,方舟编译器将编译过程提前到了应用开发阶段,从而大大减轻了智能手机和操作系统的运行负担。据华为官方介绍,方舟编译器是首款完全替代语言虚拟机的静态编译器,完全不需要解释器。是一个兼顾Java开发效率和C语言运行效率的编译器。除了代码编译,方舟编译器还提供了更高效的内存机制。它与Android内存回收的区别在于,Android对内存回收采用集中式回收机制,当发生全局回收时需要挂起应用程序。这也是一张随机卡。Ton的根本原因之一。方舟编译器采用引用计数的方式实时回收内存,并采用特殊的环消除算法(消除互引用导致的对象不可回收问题)避免GC集中回收造成的系统滞后。与GC相比,方舟的内存回收是实时的而不是集中的,不需要挂起应用进程,大大消除了卡顿。另外,就像JVM其实支持多种语言一样,华为表示方舟编译器未来会支持更多的开发语言。也就是说,未来其他语言的开发者也可以基于鸿蒙OS开发应用。参考资料:https://www.jishuwen.com/d/2NN3https://www.zhihu.com/question/339567108https://www.cnbeta.com/articles/tech/876171.htmhttps://www.cnbeta。com/articles/tech/876919.htmhttps://juejin.im/post/5cb07000f265da037d4f9be6
