软件工程2021:第2次作业—— 谈谈鸿蒙操作系统

一、概述鸿蒙操作系统

  • 开发背景国内在计算机基础核心领域缺乏建树,一直没有自主知识产权的操作系统。2012年,华为出于担心谷歌对其断供从而难以维持生产的问题,开始规划研究自有操作系统的开发。2016年华为消费者BG的软件团队正式立项开发鸿蒙OS,2019年谷歌终止向华为授权GMS服务,2020年华为发布可用于智能手机的鸿蒙OS 2.0版本。
  • 需求当前,用于智能手机的操作系统天下两分,安卓和苹果近乎达到垄断的地步。开发者与用户对新的操作系统的包容度难以把控。除此以外,5G互联网时代的到来、人工智能的兴起、大数据与云计算的发展以及全球信息安全的威胁无疑给鸿蒙OS带来了更多的挑战。

(1)安卓系统与苹果系统两分天下,鸿蒙操作系统需要引导开发者开发基于鸿蒙的应用生态以及提高用户的使用感。

(2)人工智能发展迅猛,但是机器种类众多,若要实现智能互联,就要求操作系统能适应多种设备多种终端。这意味着,鸿蒙操作系统需要满足更高的要求,以适用不同种类的机器,并保持分布式的互联互通。

  • 开发历史

2012年,华为开始规划自有操作系统

2017年,鸿蒙内核1.0完成技术验证,并逐步开展内核2.0研发

2018年,鸿蒙内核2.0应用于终端TEE

2019年8月9日,华为正式发布鸿蒙系统,并表示鸿蒙实行开源

2020年9月10日,鸿蒙系统升级至2.0版本,即Harmony OS 2.0

2020年12月,华为发布基于鸿蒙OS的手机开发者Beta功能

  • 应该场景

2019年8月9日,华为在开发者大会HDC.2019上正式发布了鸿蒙操作系统,该系统率先部署在智慧屏、车载终端、穿戴等智能终端上,同时越来越多的智能设备也开始使用开源的鸿蒙OS。鸿蒙操作系统是一款基于微内核的面向全场景的分布式操作系统,系统可运行在智慧大屏、穿戴、车机、音响、手表、手机、PC等等各种各样设备。通过一套系统,对应不同设备可以弹性部署,可以统一在不同硬件平台上进行加载部署。

  • 发展趋势

鸿蒙系统的生态可以概括为1+8+N。未来鸿蒙系统的发展也将围绕这个1+8+N的战略。其中,战略的核心是1,即智能手机。智能手机作为鸿蒙生态的核心部分,凭借华为海思自研的麒麟芯片,为其他设备终端提供相应的通信支撑。8是指PC、平板、智慧屏、音箱、眼镜、手表、车机、耳机,这8项将由华为公司亲自研发和参与市场,并且会追求市场领先地位。N是摄像头、扫地机、智能秤等外围智能硬件,涵盖移动办公、智能家居、运动健康、影音娱乐、智慧出行五大场景模式。华为鸿蒙操作系统作为国内为数不多的应用于工业场景的分布式系统,后续将在国内关键基础设施建设以及工业数字化的进程中受益,成功的可能性非常大。

 

二、关于鸿蒙是否套壳的争议

  • 什么是创新

什么是创新?创新应是利用现有的资源创造出新的知识、方法、功能等符合社会需求,具有一定效益的行为和过程。

关于鸿蒙OS是不是“套壳”Android这个问题,网络上的意见争论不休。我认为这个争论对华为和华为手机用户毫无意义。鸿蒙虽然采用了部分AOSP的代码,但是AOSP是安卓开放源代码项目,不属于谷歌,也不是消费者普遍认知的Android系统。与其说是“套壳”,不如说是“二次创新”。在操作系统的市场中,安卓系统与苹果系统已经占据了主导地位,赢得了开发者和用户,因此鸿蒙没必要开发一种全新的交互界面,这需要消耗开发者与用户大量的时间适应。

鸿蒙系统的创新在底层技术上。浙江大学黄鹂强副教授认为,鸿蒙系统的创新在于通过虚拟终端互联,将人、场有机联系在一起,实现了互联互通和技术共享。从技术上看,鸿蒙系统通过各种智能终端设备的互联互通,突破了先前不同属性终端设备的“兼容性”难题。鸿蒙系统通过模块化和分布式设计将各种场景应用无缝衔接,应用到各种终端设备上。

  • 代码复用与创新的关系

代码复用并不能说明没有创新。创新本就应是利用现有的资源创造出新的东西。在开发过程中,代码复用在一定程度上能够降低开发的时间成本,提高开发效率。另外,创新也并不是依据代码的相似度来评判的,产品的创新体现在产品理念、产品的功能、产品运用的技术等方方面面。

 

三、代码风格分析

  • 好的代码风格1
import os
import sys
import subprocess


def check_output(cmd, **kwargs):
    process = subprocess.Popen(cmd,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.STDOUT,
                               universal_newlines=True,
                               **kwargs)
    for line in iter(process.stdout.readline, ''):
        sys.stdout.write(line)
        sys.stdout.flush()

    process.wait()
    ret_code = process.returncode

    return ret_code


def set_root_path(path):
    cmd = ['python3', 'build/lite/hb/__main__.py', 'set', '-root', path]
    return check_output(cmd, cwd=path)


def build(path, args_list):
    cmd = ['python3', 'build/lite/hb/__main__.py', 'build'] + args_list
    return check_output(cmd, cwd=path)


def main():
    root_path = os.path.dirname(os.path.abspath(__file__))
    ret_code = set_root_path(root_path)
    if ret_code != 0:
        return ret_code
    return build(root_path, sys.argv[1:])


if __name__ == "__main__":
    sys.exit(main())

分析:变量和方法命名清晰,简单易懂;各方法模块化设计,易读易懂,方便调取;合理运用空行缩进提升代码整体观感,可读性高。

  • 好的代码风格2
def UnescapeGNString(value):
    """Given a string with GN escaping, returns the unescaped string.

    Be careful not to feed with input from a Python parsing function like
    'ast' because it will do Python unescaping, which will be incorrect when
    fed into the GN unescaper."""
    result = ''
    i = 0
    while i < len(value):
        if value[i] == '\\':
            if i < len(value) - 1:
                next_char = value[i + 1]
                if next_char in ('$', '"', '\\'):
                    # These are the escaped characters GN supports.
                    result += next_char
                    i += 1
                else:
                    # Any other backslash is a literal.
                    result += '\\'
        else:
            result += value[i]
        i += 1
    return result

分析:命名清晰明了,代码使用花括号和注释,格式工整,方便阅读和理解代码。

  • 不好的代码风格1
func rightDrawComeBack(id:String,type:String){
    gLog.debug("检查表\(id)")
    var visitId = self.id
    if type == "last"{
        visitId = getPlanId(id: id)
    }

    if self.curShopVisitType == .approval{
        dispatchMain_async({
            let CheckListVC = CheckListViewController(curType: .onlyReadWithPass, id: id, visitId: visitId)
            self.show(CheckListVC, sender: self)
        })
    }else if(self.curShopVisitType == .toBeFilled){
        dispatchMain_async({
            let CheckListVC = CheckListViewController(curType: .writeCheckList, id: id, visitId: visitId)
            self.show(CheckListVC, sender: self)
        })
    }else if (self.curShopVisitType == .pass){

        dispatchMain_async({
            let CheckListVC = CheckListViewController(curType: .onlyReadWithPass, id: id, visitId: visitId)
            self.show(CheckListVC, sender: self)
        })
    }else if(self.curShopVisitType == .reject){
        dispatchMain_async({
            let CheckListVC = CheckListViewController(curType: .writeCheckList, id: id, visitId: visitId)
            self.show(CheckListVC, sender: self)
        })
    }
}

分析:对于curShopVisitType的所有的4种可能都判断了,且每部分的代码都相同,代码冗余

posted on 2021-09-18 17:44  山复尔尔  阅读(151)  评论(0编辑  收藏  举报