linux的创始人linus在2000年8月25号的一封邮件中写了这样一句话“Talk is cheap.show me the code.”“多说无意有种你给我看代码。”6月2号鸿蒙2.0全量代码灰度测试版本(canary)正式开源。
相比于1.0版本最大的变化是开源了linux部分的代码。新增了22个子系统,支持内存大于128MB带屏设备的开发。如果你去看代码的话,Kernel里面增加了linux4.19内核。prebulits里面增加了AOSP的支持代码,你甚至可以在APEX中找到android runtime debug的相关文件看到这里,我估计很多人就要沸腾了。鸿蒙和安卓到底是什么关系?鸿蒙能不能离开安卓?鸿蒙还有没有大招?今天老王就再分析一下何为鸿蒙?
第一个问题:鸿蒙和安卓到底啥区别?
首先,什么是安卓?根据安卓开发者平台的官方定义:安卓是一种基于linux的开放源代码软件站,为各类设备和机型而创建。一定要记住这一句话,安卓是一种基于Linux的开放源代码软件站!
整个安卓平台一共分为五层,最底层的linux内核负责操作系统的最基本功能,比如现成的调度与内存管理。往上提供了硬件抽象层HAL,像是WiFi、GPS、蓝牙等硬件模块都属于HAL的管辖范围。
为什么要有HAL?
同样是wifi模块,高通和联发科的底层设计肯定是不一样的。没有HAL,开发者就要写两套代码,分别去适配高通和联发科的硬件。有了HAL,开发者就不必关心硬件设备的差异,只需要按照HAL提供的标准接口对硬件进行访问即可。
HAL再往上叫做Android runtime与原生c/c++运行库,他们是给程序运行提供必要环境的。比如很多程序运行的时候都要输出内容到屏幕,这一部分的代码没必要让每一个开发者自己重新去写, 系统会直接在runtime与运行库中提供,像Android runtime就提供了JIT即时编译,原生c/c++运行库就提供WebKit OpenGL等框架。
再往上一层叫做加把Java API框架,这些API提供了创建一个安卓程序所需的子模块,直接面向开发者。开发者可以调用API构建自己的应用程序,大家平时写代码里面调用的那些函数其实就是在调用API。
最后,最顶上的一层叫做系统应用层,是直接与用户打交道的,我们使用的浏览器、短信、日历等软件都属于这一层。
我们现在再来回看那一句话:“安卓是一种基于Linux的开放源代码软件站”,所以什么是安卓?无非就是HAL、Android runtime、Java、API框架与系统应用程序。在Kernel里面还有一个binder机制,属于安卓特有的,这里我就不展开了。
原生C/C++运行库不能算是安卓里面的框架,都是一些计算机领域的基础框架,不具有安卓特色。当我们对安卓有了一个基本概念时,我们再来一层一层的结构鸿蒙。
如果鸿蒙是安卓的套壳,最简单的方式就是在Java API框架层与系统应用再进行一次封装,把关键字改一改,把安卓换成鸿蒙就可以了,但鸿蒙是怎么做的呢?我们从底向上一层层看。
对于手机等内存大于128MB的带屏设备,鸿蒙与安卓一样,使用的都是Linux内核。对于内存小于128MB的物联网设备,使用liteOS作为内核,类似安卓的HAL,鸿蒙也提供了一套硬件抽象框架叫做HDF,它是鸿蒙os硬件生态开放的基础,提供统一的外设访问能力和驱动开发管理框架。
但注意,HDF并不是HAL的套壳,它也套不了壳,而是重新设计的。如果你把源代码下载下来,在drivers/adapter/uhdf2中就可以看到相关代码,在osal目录下也可以看到HDF已经在和Posix API打交道了,走的已经非常深入了。对比HDF的代码与安卓的libhardware代码区别还是不小的,有很多为了低功耗iot设备区服务的代码。
再往上走一层,就是系统服务层,这一层为应用程序的运行提供各类服务,比如多设备的调度定位、生物识别等。这一层非常重要,因为它可以对这个操作系统定性。在聊更多之前,先来分析一下鸿蒙系统服务层的成分。将红蒙2.0的更新包进行反向编译后,在system/lib64目录下面就可以看到系统运行时所需要加载的动态库,一共1161个动态链接文件。
这一部分的动态链接库文件可以看作是runtime状态,1161个动态链接库文件由三部分组成:鸿蒙、安卓第三方库文件。我根据导出符号与文件名的关键词去匹配,其中第三方库为123个文件,他们既不属于安卓也不属于鸿蒙。
鸿蒙的动态链接库文件为445个,这445个文件有两个关键特征,要么一点.z.so结尾,要么出现了以huawei(harmony)为格式的导出符号。那么剩下的593个动态链接库文件就是纯粹的安卓了。但是,鸿蒙的445个动态链接库文件中,有274个依旧含有安卓导出符号。他们大部分都是adapter适配器,用来和安卓的应用组件进行交互,毕竟鸿蒙要兼容安卓应用,不和安卓交互是不可能的。
通过这样的分析,我们大概能够重建出鸿蒙OS系统服务层的框架,除去公用的第三方库,一半是安卓,一半是华为自己写的鸿蒙。从动态链接库的体量上来看,鸿蒙已经具有了一定规模,但为了无缝兼容安卓应用,还是保留了Android runtime,这一部分你可以理解成AOSP。
系统服务层聊完了,就说说Java API框架层。鸿蒙其实是有一套自己的Java API框架的,但基本都继承了安卓,这所有的安卓开发者几乎可以无缝上手开发新的鸿蒙应用。这也是系统架构中前后端分离的思想。前端的开发人员不需要考虑底层的变化,继续使用同样的API就可以开发,苹果在x86迁移到ARM上面也是采用了类似的思路。
鸿蒙还有针对低功耗设备使用的liteOS内核里面也做了不少的修改,包括中断控制器gic、内存管理等等。
讲到这里,基本理清了鸿蒙和安卓的区别,接下来我们再来聊一聊套壳这个事情。
1000个人就有1000种不同的套壳。对于一般用户来说,之前所有的应用都可以完美运行,从使用体验的角度来说,跟之前的安卓好像没有什么区别,所以对于普通用户来说很难感知到套壳或者不套壳。对于面向最终用户的安卓开发者而言,Java API和之前基本没有什么变化,毫无难度的就可以开发鸿蒙应用,看起来像是套壳了一样。而对于硬件适配、底层优化、低功耗设备的开发者而言,鸿蒙还是有很大不同的,需要进行特殊的适配。鸿蒙现在就像是一个得了80分的孩子一样,你用100分的眼光去要求他,那他浑身都是错误,哪怕用了一行安卓代码也叫做套科。但如果你用60分的眼光去看他,那么就会觉得他做的已经很不错了。自己搞出了相当多的原生代码,而且也是国内唯一一个得了80分的孩子。对于套壳这一问题的争议,完全取决于你个人对于套壳的定义,并没有一个客观指标去衡量。这个问题就丧失了可证伪性,当一个问题丧失可证伪性时,他就不再具有科学性。任何人对于他的辩驳都只是为了自己心中的一份信仰罢了,所以根本没有必要再去讨论套壳与不套壳这个问题。
现在讲讲第二个问题:为什么不抛弃安卓与linx内核?答案很清晰,因为时机还不够成熟。这个时机分为内在与外在两个部分。
内在的时机是我们的技术不够成熟。操作系统不同于其他应用软件,它决定着很多设备的生死。操作系统的安全甚至关乎到一个社会系统的稳定。在信息安全中,有一类漏洞叫做零日漏洞,是指被发现后立即被恶意利用的安全漏洞。如果一个操作系统潜藏有大量的零日漏洞是非常危险的。攻击者甚至可以直接从用户态进入内核态进行进程攻击。这种攻击放到核心基础建设领域上面可是了不得的。而操作系统的安全性是需要时间去检验的。
linux内核从1991年发布至今走过了30年的风风雨雨。它的安全性、可靠性是得到了时间检验的,并且目前还受到开源协议的保护。重写一个操作系统内核并不是很复杂,一个成绩比较好的大四学生都可以照猫画虎的攒一个。但重新写一个比linux更稳定、更可靠的操作系统内核是很困难的,经济成本和时间成本都非常的高。
如果今年六月华为为了一个完全自主化的名头,把所有的鸿蒙设备的内核全换成了一个新的内核,这才是不成熟的决策。
第二,外在时机。美国政府还没在开源协议上动手,使用安卓与Linux目前依旧是合法的。鸿蒙本身更像是应对美国政府的PlanB,更换内核和完全抛弃安卓更是这个PlanB中的PlanB。2020年,这个世界有太多不可思议的事情发生。真正到了关键时刻,一纸开源协议也不能成为华为的保护伞,这也是我在这没有太多提aosp的原因。完全依赖开源协议作为公司发展的保护伞是一个很危险的决策。
小孩子的世界里才有牛逼与不牛逼,大人的世界里只有代价与收益。目前来看,兼容安卓,继续使用linux内核是代价最低,收益最高的选择。
第三个问题,万物互联的下一个入口在哪里?发布会上全程都在讲万物互联,但为什么总给人一种听过了的感觉?因为我们已有的经验中,万物互联等于智能家居,我们关注的还是那些已经存在的屏幕。而鸿蒙真正的着眼点是那些还不存在的屏幕。就像是iOS先与iphone发布,我们只能去想象一个按键手机运行iOS的效果,甚至还会吐槽说这个系统不一定好用。
万物互联的下一个入口一定有智能座舱,这也将成为鸿蒙的下一个发力点。借着新能源汽车普及的东风,各种智能车机也走进了千家万户。但现在的车机更像是一个大的车载蓝牙平板,没有融入手机生态,不怎么好用,用久了还很卡。现在的汽车屏幕越来越多,越来越大,支持手势、肢体、智能、语音等多种不同模态的交互方式,怎么样高效利用这些屏幕,在保证安全的同时,提供更好的乘车体验是下一代智能车机,也是智能座舱需要思考的问题。
华为在去年十月的北京车展上,就展出了智能座舱的相关概念产品,今年四月上海车展又开了一场鸿蒙OS车机发布会。
鸿蒙能够解决现在车机的两个问题:第一,生态不统一。第二硬件难更新。
目前,除了苹果的CarPlay之外,大部分车机还要通过蓝牙配对才能播放手机上的音乐,这个水平甚至还不如家里的智能音箱,而且不同品牌的汽车又有着不同的app,这和鸿蒙发布会上说的智能家居的情况是一样的。有了鸿蒙之后,你正在听的音乐,正在看的电影可以快速拓展至汽车屏幕上面,甚至可以将你打游戏的画面投影到汽车屏幕上,用手机作为手柄。这套技术应用场景不仅仅是在自己的车上,更适用于滴滴打车、出租车等第三方汽车。当你准备去机场的时候,叫了一辆快车,上车之后就可以把手机里的电影投影在后座的屏幕上面,在路上用大屏看一场电影不香吗?这就是生态统一带来的优势。汽车毕竟没有手机换勤,买了五年的汽车,开起来没有什么问题,但车机却能卡到你怀疑人生,最后只能沦落为空调遥控器。
鸿蒙的加入,让算力从车机转移到了手机,一方面可以显著降低车机自身的成本,更适合大范围的推广。另一方面,换新更加容易,不用担心卡顿和数据丢失,让车在整个生命周期里面都可以实现硬件持续可更新。
再往后,可以稍微猜的大一些,大部分车机都使用了鸿蒙,他们之间的通讯协议是一致的,他们之间是可以交流的。这对于自动驾驶和智慧城市的发展很有帮助。对于自动驾驶而言,依靠计算机视觉发现前方的车辆,还是不如前方的车辆直接通过网络告诉你精确的地理位置坐标来的靠谱。
那么最后,什么是鸿蒙?按照华为自己的定义,鸿蒙是一款面向未来、面向全场景的分布式操作系统,也就是鸿蒙是一款操作系统。
什么是操作系统?这里我放了维基百科的定义,说人话就是向下驱动硬件,向上提供应用,是人与计算机硬件沟通的桥梁。这么来看,鸿蒙确实是一个操作系统。事实上,现在的操作系统已经不简单是一个软件系统而已,它更像是一个品牌。
windows也经历过从9x向NT内核更迭的过程。MacOS9更是由于非常差劲的设计与羸弱的性能,在WWDC2002上被乔布斯亲手送入棺材,迎来了MacOS X的时代。2008年安卓发布的时候也不被外界看好,甚至一度有谷歌想要放弃安卓的说法。如果把1956年诞生的GM-NAA IO视为历史上第一个操作系统,五十年间诞生了不下100种应用于不同场景下的操作系统。而最后活到2021年的,能够真正进入大众视野的都是英雄。
工业级操作系统几乎是我们能够设计出最复杂的软件,任何一个工业级操作系统的发展都是曲折的,都需要大量用户的支持,需要数以百亿计的资源投入,需要无数人力物力的整合,能不能真的做到面向未来,面向全场景,还要看鸿蒙后续的努力,希望鸿蒙有一个美好的未来。