周末在家休息,女朋友在刷朋友圈,突然她问我:最近我的朋友圈经常被华为刷屏,到底什么是“鸿蒙”啊?
鸿蒙 OS 回顾
2019 年 8 月 9 日华为开发者大会上,华为消费者业务 CEO 余承东正式宣布发布自有操作系统鸿蒙,内核为 Linux 内核、鸿蒙微内核和 LiteOS。未来将摆脱 Linux 内核和 LiteOS,只有鸿蒙微内核。
鸿蒙(英语:Harmony OS,开发代号 Ark)是华为自 2012 年开发的一款可能兼容 Android App 的跨平台操作系统。
所以,今天我们谈的跨平台,指的是跨设备。即平台≈设备。
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 默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码(热点检测),以方法为单位进行即时编译。
Android 实现跨平台
Android 其实基于 Java 语言的,所以同理,想要运行一段 Android 代码,也要经过多个步骤,将 Android 源代码转换成机器可以执行的机器代码。
但是这个转换过程在 Android 的不同版本中实现不尽相同:
Android 1.0(2008 年):采用一个名为 Dalvik 的虚拟机,并且集成了一个解释器。当 App 运行时,就会调用这个解释器,对代码进行逐句解释,速度很慢。
Android 2.2(2010 年):引入 JIT(Just In Time)即时编译机制,当 App 运行时,会将用户经常使用的功能编译为机器能直接执行的 010101 机器码,不用一句一句地去翻译。
当出现不常用的功能时,再调用解释器来翻译;这样速度加快,但每次启动 App 都要重新编译一次,不能一劳永逸。
Android 5.0(2014 年 10 月):将虚拟机 Dalvik 换成 ART(Android Run Time),将 JIT 的编译器替换成 AOT(Ahead of Time)。
如此,App 在下载后安装到手机上时同时把能编译的代码先编译成机器听得懂的 101010;剩下不太好翻译的代码,就在用户使用时再叫醒解释器来翻译。
如此,不用每次打开 App 都需要编译,但安装 App 的时间有点长,而且占用手机空间。
Android 编译的问题
可以看到,从 2008 年的 Android 1.0 开始,Android 在编译优化上面在一直下功夫。
当前的 Android 采用的是解释执行 JIT AOT 的综合模式,在空间占用 安装速度 运行速度上已经达到了一个很好的平衡。
但是 Android 的编译问题一直被诟病。尽管在后续的 Android 8.0 上改进了解释器,解释模式执行效率大幅提升。
Android 10.0 上提供了预先放置热点代码的方式,应用在安装的时候就能知道常用代码会被提前编译。
但是,目前来看,无论如何,Android 都没能摆脱这样一个前提:即应用在被打包成 APK 的时候,采用的还是 Java 代码。
换句话说,在 APK 变成用户可应用的过程中,还经历了一个在 Android 系统内部的编译过程,这是一个绕不过的坎。
从上图中可以看到,在鸿蒙 OS 架构中,方舟编译器和多终端开发 IDE 扮演着重要的位置。
跨平台有一个最大的挑战,那就是各个平台的适配问题,尤其是目前各种设备类型越来越多,如何将同一个应用,在手机、手表、汽车、电视上面都可以适配的展示呢?
这就是多终端开发 IDE 所做的事情:
使用华为提供的多终端 IDE,多语言统一编译,分布式架构 Kit 提供屏幕布局控件以及交互的自动适配,支持控件拖拽,面向预览的可视化编程。
从而使开发者可以基于同一工程高效构建多端自动运行 App,实现真正的一次开发,多端部署,在跨设备之间实现共享生态。
另外,就像 JVM 其实也是支持多种语言一样,华为表示,方舟编译器未来也会支持更多的开发语言。换句话说,其他语言的开发者,日后也能开发基于鸿蒙 OS 的应用。
参考资料:
https://www.jishuwen.com/d/2NN3
https://www.zhihu.com/question/339567108
https://www.cnbeta.com/articles/tech/876171.htm
https://www.cnbeta.com/articles/tech/876919.htm
https://juejin.im/post/5cb07000f265da037d4f9be6
作者:漫话编程来源:漫话编程
花粉社群VIP加油站
猜你喜欢