第2次作业—— 谈谈鸿蒙操作系统
一、概述鸿蒙操作系统
1、开发背景
鸿蒙OS发布于2019年,但是最早可以追溯到2012年,彼时任正非与华为2012实验室的专家座谈时提出,华为要自研操作系统做备份,哪怕几十年都用不上也一定要做。否则一旦操作系统“断粮”对华为就是数千亿美元的损失。2016年华为消费者BG的软件团队正式立项开发鸿蒙OS,2019年谷歌终止向华为授权GMS服务,华为随即将鸿蒙OS推向台前,并于2020年发布可用于智能手机的鸿蒙OS 2.0版本。
2、需求
对于消费者而言,HarmonyOS用一个统一的软件系统从根本上解决消费者面对大量智能终端体验割裂的问题,为消费者带来统一、便利、安全的智慧化全场景体验。
对于开发者而言,HarmonyOS通过多种分布式技术整合不同终端硬件能力,形成一个虚拟的“超级终端”,应用开发者可基于超级终端开发应用,聚焦上层业务逻辑,无需关注硬件差异,设备开发者可以按需调用其他终端能力,带来基于“超级终端”的创新服务体验。
3、开发历史
2012年,华为开始规划自有操作系统“鸿蒙”。
2017年,鸿蒙OS内核1.0完成技术验证,并逐步开展内核2.0研发。
2018年,鸿蒙内核2.0已被应用于终端TEE。
2019年5月17日,由任教授领导的华为操作系统团队开发了自主产权操作系统——鸿蒙。
2019年8月9日,华为正式发布鸿蒙系统。同时余承东也表示,鸿蒙OS实行开源。
2020年9月10日,华为鸿蒙系统升级至华为鸿蒙系统2.0版本,即HarmonyOS 2.0。
2020年12月16日,华为面向开发者提供鸿蒙2.0的beta版本。
4、应用场景与发展趋势
HarmonyOS是一款面向未来的全场景分布式智慧操作系统,技术架构支撑1+8+N战略。
在该战略中,1是手机,8包括平板、PC、穿戴、智慧屏、AI音箱、耳机、VR、车机,N是指万物互联。通过通信连接和应用打通,从手机的优势向外围延展,HarmonyOS技术架构起到了巨大的支撑作用。
HarmonyOS未来将会承担起华为一系列包括电视、音箱、路由器、智能汽车等硬件产品的互联,乃至智慧城市的万物互联,组成更大的华为软硬件生态。
二、关于鸿蒙是否套壳的争议
1、什么是创新
网络上一直存在鸿蒙OS“套壳安卓”的说法。鸿蒙OS的部分代码基于ASOP不假,但大部分人把ASOP与安卓系统的关系搞混了。简单的说,华为使用ASOP的代码有两个原因。
第一,华为有权使用ASOP的代码,谷歌管不着。ASOP是由谷歌联合34家手机终端和运营商企业共同发起的项目,全称是安卓开源项目。2007年的谷歌还是一家以搜索为主的互联网企业,没有终端企业和通信运营商的支持,独自开发操作系统也不可能成功的。因此谷歌才联合多家企业发起成立了开放手机联盟这个组织,华为也是其中的成员。在ASOP这个项目里,任何机构和企业都有义务为开源社区贡献代码,也能够使用和下载开源代码,并基于开源项目做二次开发。所以ASOP的代码并不全是谷歌写的,华为也是ASOP的重要贡献者。
第二,鸿蒙OS使用ASOP的代码是基于现状的理智选择。据鸿蒙OS负责人王成录表示,安卓系统的全球开发者超过2000万,苹果iOS的开发者超过2400万。而鸿蒙OS的开发者目前才几百万,现阶段跟安卓和iOS“刚正面”是不现实的。另外使用ASOP的代码、兼容安卓应用是为了保证用户体验。安卓系统已经开发了10几年,消费者已经用习惯了安卓系统,如今贸然更换一个不兼容安卓或者操作逻辑迥异的系统,会造成用户的大量流失。
以上两点原因说明,鸿蒙OS是在ASOP的基础上创新而来,不是所谓的“套壳安卓”。
2、代码复用与创新的关系
个人认为,代码复用与创新并不矛盾,尤其是使用开源的代码。代码复用是绝大多数程序员所期望的,复用开源的代码或是有权限使用的代码能提高编写程序的效率,缩短程序的开发周期。开源代码和有权使用的代码就如同名家作品中的优美词句,个人创作中可以引用,也可以不用。用了不过是锦上添花,加快创作进程,对作品本身并无太大影响,不能说一部作品仅仅引用了名篇中的一句就否认作品本身的创新属性。在编程的领域,鲁迅先生提出的“拿来主义”还是相当适用的。
三、代码风格分析
1、好的代码风格
···
1 void ZoneUtil::GetZoneList(const string country, const int32_t offset, vector<string> &retVec) 2 { 3 UErrorCode status = U_ZERO_ERROR; 4 StringEnumeration *strEnum = 5 TimeZone::createTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, country.c_str(), &offset, status); 6 if (status != U_ZERO_ERROR) { 7 delete strEnum; 8 strEnum = nullptr; 9 return; 10 } 11 GetList(strEnum, retVec); 12 if (strEnum != nullptr) { 13 delete strEnum; 14 strEnum = nullptr; 15 } 16 }
···
分析:将过长的表达式在适当的位置换行折叠,不仅增加可读性,让代码看起来更清爽,也方便后期检查和修改。
2、不好的代码风格
···
1 { 2 test: /(\.hml|app\.js)(\?[^?]+)?$/, 3 use: [{ 4 loader: path.resolve(__dirname, './index.js') 5 }] 6 }, 7 { 8 test: /\.png$/, 9 use: [{ 10 loader: 'file-loader', 11 options: { 12 name: '[name].[ext]', outputPath: 'common' 13 } 14 }] 15 }, 16 { 17 test: /\.css$/, 18 use: [{ 19 loader: 'css-loader' 20 }] 21 },
···
分析:test后面的表达式可读性较差,作者也没有进行简单的注释说明。