软件工程2021:第2次作业—— 谈谈鸿蒙操作系统
前言:
鸿蒙 ( Harmony OS ,开发代号Ark )是华为自2012年开发的一款可能兼容 Android 应用程序跨平台操作系统,是新一代的智能终端操作系统,为不同设备的智能化、互联与协同提供了统一的语言。
01——概述鸿蒙操作系统
1.1 鸿蒙操作系统的背景
鸿蒙产生的时代背景,总体来说有六个:
1)数字化的时代背景:数字化新时代的到来需要新的操作系统;
2)IoT 与 5G:5G物联网时代的到来对操作系统提出了新的要求;
3)中国面临“卡脖子”的挑战:独立自主的研发操作系统是迫切的需求;
4)人工智能的兴起:AIoT场景天然要求多设备智能协同,需要一个适用于各类型机器的操作系统;
5)大数据与云计算:TB、PB级的大数据需要一个能够提供多机互联的操作系统;
6)全球信息安全面临挑战:网络安全威胁呈现多元化、复杂化、频发高发趋势,需要一个足够安全的系统进行保障。
一句话概括,就是当今数字化时代迅速发展,对技术要求越来越高,为了满足新的需求,为了实现智能互联,为人类社会提供更便捷更高效的服务,也为了摆脱美国对我国技术上的桎梏,华为开始布局自有分布式操作系统。
1.2 鸿蒙操作系统应满足的需求
1)切实满足国内市场的软硬件需求,真正做到与多领域多设备适配
2)远期鸿蒙装机量和对应的应用软件装机量以及由鸿蒙大量装机带来的适配性项目需求以及二次联合开发
1.3 鸿蒙操作系统的开发历史
时间 | 大事件 |
2012年 | 华为的自有操作系统开始进行规划 |
2016年5月 | 消费者BG软件部立项研发分布式操作系统1.0版本 |
2017年5月 | 分布式操作系统1.0版本研发完成,开始研发2.0版本 |
2017年中务虚会 | 消费者BG核心管理讨论自主研发分布式操作系统的可行性 |
2018年初 | 任正非认可自主研发分布式操作系统的计划 |
2018年4月24日 | 自研分布式操作系统项目获得投资,成为消费者BG的正式项目 |
2018年5月 | 华为申请“华为鸿蒙”商标 |
2019年5月14日 | “华为鸿蒙”商标注册公告 |
2019年5月15日 | 华为被列入了所谓“实体清单”,谷歌操作系统对华为禁供 |
2019年5月17日 | 华为正式发布了自主知识产权操作系统——鸿蒙。随后在华为智慧屏上投入使用 |
2019年8月9日 | 华为正式发布鸿蒙系统,华为消费者业务CEO余承东表示鸿蒙实行开源 |
2020年8月 | 中国信息化百人会2020年峰会华为正式发布鸿蒙系统,余承东表示鸿蒙实行开源 |
2020年9月10日 | 鸿蒙系统升级至2.0版本,即Harmony OS 2.0,向电视、手表和车机等内存128KB~128MB设备开源 |
2020年12月 | 华为发布基于鸿蒙OS的手机开发者Beta功能 |
2021年4月 | 鸿蒙OS2.0向内存182MB~4GB设备开源,华为Mate X2等手机正式搭载鸿蒙 |
2021年4月27日 | 华为鸿蒙OS2.0开发者公测版本大批量向已申请的开发者推送 |
2021年5月4日 | 认证信息为华为终端有限公司的@华为Harmony OS官方微博正式上线 |
2021年5月9日 | 鸿蒙OS2.0开启第二轮公测,新增多款Nova机型 |
2021年6月 | 鸿蒙有望正式开始规模化推送 |
2021年10月 | 鸿蒙OS计划向4GB内存以上设备开源 |
图表1-1 鸿蒙发展历史
1.4鸿蒙操作系统的应用场景
鸿蒙OS是一款基于微内核的面向全场景的分布式操作系统,根据鸿蒙OS架构设计,系统可运行在智慧大屏、穿戴、车机、音响、手表、手机、PC等等各种各样设备。通过一套系统,一个OS实现模块化解耦,对应不同设备可以弹性部署,不管硬件能力强还是硬件能力弱的,都可以一套操作系统,可以统一在不同硬件平台上进行加载部署。
1.5鸿蒙操作系统的可能趋势
1)据官方公布,在2021年6月2日的华为新品发布会中,鸿蒙手机操作系统正式登场,引起社会媒体的广泛关注。iiMedia Research(艾媒咨询)调研数据显示,近九成网民听说过鸿蒙系统并表示期待,近四成人士(36.2%)表示鸿蒙推出后,将立即购买;官网人士表示最担心鸿蒙系统的兼容性和功能问题。
2)5G时代来临,华为手握5G核心技术,在5G的换机大潮中,拥有先天的优势,这个用户的数量,足以支撑起一个操作系统。
3)鸿蒙系统为了降低开发者开发成本,采用兼容安卓应用方案,特别开发了“方舟编译器”,充当安卓与鸿蒙系统之间的“翻泽器”,只需应用开发者将安卓应用软件救到方舟编译器进行编译,生成应用就可以用在鸿蒙系统上,这无疑加快了生态的建没步伐,大大降低了系统生态转换带来的冲击,用户不必担心正常的手机使用问题。
4)谷歌GMS这块是鸿蒙的一大短板,这决定了短期内鸿蒙无法打通海外市场,且鸿蒙系统目前只对128MB以下的设备开源,生态上也比不上安卓和IOS,这都需要很长一段时间去改善,另外从商业竞争上看,国内市场也不会让华为一家独大,因此鸿蒙目前仍面临着严峻困难。
综上,鸿蒙OS的理念无疑是先进且符合时代发展大潮的,而华为在通讯、硬件上的造诣,又可以为鸿蒙OS提供强有力的支持,虽然短期内无法迅速发展起来,但以长远的眼光来看,作为国产操作系统冲击主流消费市场的先行者,鸿蒙OS注定大放光彩。
02——关于鸿蒙是否套壳的争议
鸿蒙OS发布后,网上对于鸿蒙OS的评价毁誉参半。有人认为鸿蒙OS是国产操作系统历史性的突破,有望打破国外操作系统霸占国产电子产品的局面,而质疑鸿蒙OS的人认为,鸿蒙OS不过是“安卓套壳”,没有创新,不算真正的自主操作系统。那么问题来了,鸿蒙OS到底是不是“安卓套壳”,这个问题我们将着手于创新的概念去分析。
2.1 什么是创新:(联系鸿蒙系统分析)
何为创新?创新就是利用现有的知识和物质改进或创造新的事物。这个过程要求我们符合时代背景,目的是满足一定的社会需求,结果要有一定的效益。数字化时代我们对操作系统有了新的要求,人工智能的兴起、大数据与云计算都需要一个能够“万物互联”的操作系统,在这个背景下,鸿蒙OS在开发过程中合理地使用了ASOP(安卓开源项目),同时还集成了其他的开源代码,最终实现了一个新的功能——万物互联,这是安卓目前为止都没有实现的。因此,我认为鸿蒙OS是基于安卓的创新。
2.2 代码复用与创新的关系:
代码复用一般指使用别人的代码,或者是开源项目,或者是其他团队提供的组件、服务,或者是团队内他人实现的公共模块,这些复用会大大减少项目的开发周期和成本,后期也便于阅读和维护。代码复用和创新并不矛盾,代码复用只是为了更快速便捷的实现某个功能,但不影响我们在它的基础上对这个功能进行修改,甚至是再添加一个新的功能。
03——代码风格分析
3.1 好的代码风格:
- 好的代码风格1:
1 int pipe(int fd[2]) 2 { 3 struct pipe_dev_s *dev = NULL; 4 char devname[16]; 5 int pipeno; 6 int errcode; 7 int ret; 8 struct file *filep = NULL; 9 size_t bufsize = 1024;
10 ... 11 }
分析:使用有意义的单词作变量名,这样一眼就能看出这个变量、这个类是做什么用的
- 好的代码风格2:
1 int pipe(int fd[2]) 2 { 3 ... 4 5 /* Get exclusive access to the pipe allocation data */ 6 7 ret = sem_wait(&g_pipesem); 8 if (ret < 0) 9 { 10 errcode = -ret; 11 goto errout; 12 } 13 14 /* Allocate a minor number for the pipe device */ 15 16 pipeno = pipe_allocate(); 17 if (pipeno < 0) 18 { 19 (void)sem_post(&g_pipesem); 20 errcode = -pipeno; 21 goto errout; 22 } 23 24 /* Create a pathname to the pipe device */ 25 26 snprintf_s(devname, sizeof(devname), sizeof(devname) - 1, "/dev/pipe%d", pipeno); 27 28 /* No.. Allocate and initialize a new device structure instance */ 29 30 dev = pipecommon_allocdev(bufsize, devname); 31 if (!dev) 32 { 33 (void)sem_post(&g_pipesem); 34 errcode = ENOMEM; 35 goto errout_with_pipe; 36 } 37 38 dev->d_pipeno = pipeno; 39 40 /* Check if the pipe device has already been created */ 41 42 if ((g_pipecreated & (1 << pipeno)) == 0) 43 { 44 /* Register the pipe device */ 45 46 ret = register_driver(devname, &pipe_fops, 0660, (void *)dev); 47 if (ret != 0) 48 { 49 (void)sem_post(&g_pipesem); 50 errcode = -ret; 51 goto errout_with_dev; 52 } 53 54 /* Remember that we created this device */ 55 56 g_pipecreated |= (1 << pipeno); 57 } 58 else 59 { 60 UpdateDev(dev); 61 } 62 (void)sem_post(&g_pipesem); 63 64 /* Get a write file descriptor */ 65 66 fd[1] = open(devname, O_WRONLY); 67 if (fd[1] < 0) 68 { 69 errcode = -fd[1]; 70 goto errout_with_driver; 71 } 72 73 /* Get a read file descriptor */ 74 75 fd[0] = open(devname, O_RDONLY); 76 if (fd[0] < 0) 77 { 78 errcode = -fd[0]; 79 goto errout_with_wrfd; 80 } 81 82 ret = fs_getfilep(fd[0], &filep); 83 filep->ops = &pipe_fops; 84 85 ret = fs_getfilep(fd[1], &filep); 86 filep->ops = &pipe_fops; 87 88 return OK; 89 90 errout_with_wrfd: 91 close(fd[1]); 92 93 errout_with_driver: 94 unregister_driver(devname); 95 96 errout_with_dev: 97 if (dev) 98 { 99 pipecommon_freedev(dev); 100 } 101 102 errout_with_pipe: 103 pipe_free(pipeno); 104 105 errout: 106 set_errno(errcode); 107 return VFS_ERROR; 108 }
分析:(1)代码使用花括号和注释,方便阅读和理解代码
(2)使用空行来分隔逻辑
3.2 不好的代码风格:
- 不好的代码风格1:
1 // BatchGetQQTinyWithAdmin 获取QQ uin的tinyID, 需要主uin的tiny和登录态 2 // friendUins 可以是空列表, 只要admin uin的tiny 3 func BatchGetQQTinyWithAdmin(ctx context.Context, adminUin uint64, friendUin []uint64) ( 4 adminTiny uint64, sig []byte, frdTiny map[uint64]uint64, err error) { 5 var friendAccountList []*basedef.AccountInfo 6 for _, v := range friendUin { 7 friendAccountList = append(friendAccountList, &basedef.AccountInfo{ 8 AccountType: proto.String(def.StrQQU), 9 Userid: proto.String(fmt.Sprint(v)), 10 }) 11 } 12 13 req := &cmd0xb91.ReqBody{ 14 Appid: proto.Uint32(model.DocAppID), 15 CheckMethod: proto.String(CheckQQ), 16 AdminAccount: &basedef.AccountInfo{ 17 AccountType: proto.String(def.StrQQU), 18 Userid: proto.String(fmt.Sprint(adminUin)), 19 }, 20 FriendAccountList: friendAccountList, 21 }
分析:由于一开始的协议设计的不好,第一个人使用这个接口时,没有类似上面这个函数的代码,于是在理解协议后自己实现了一个嵌入逻辑代码的填写请求结构结构体的代码,当这样使用的人多后,没办法再重构这个协议,只能麻烦地做到向前兼容,每个人都要理解前面的协议才能使用,如果理解出错就容易有bug.
- 不好的代码风格2:
1 func mapLine(msg *Message, in string, ch chan string) { 2 if !startWith(in, stringComment) { 3 token, value := parseLine(in) 4 if token != "" { 5 f, contains := factory[string(token)] 6 if !contains { 7 ch <- "ok" 8 } else { 9 data := f(token, value) 10 enrichMessage(msg, data) 11 ch <- "ok" 12 } 13 } else { 14 ch <- "ok" 15 return 16 } 17 } else { 18 ch <- "ok" 19 return 20 } 21 }
分析:代码嵌套层次太多,不便理解
相关资料:
鸿蒙系统全面解析,诞生背景、技术细节生态圈一文看懂:智东西内参_腾讯新闻 (qq.com)
华为鸿蒙生态圈扩容,“蹭热点”之外鸿蒙概念真正要关注哪些需求?|魅族|鸿蒙系统|华为_新浪科技_新浪网 (sina.com.cn)
人民日报为鸿蒙OS“正名”:华为的抱负很大!_操作系统 (sohu.com)
HarmonyOS 鸿蒙操作系统 - 知乎 (zhihu.com)