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

一、概述鸿蒙操作系统 

  • 开发背景
    • 随着5G物联网的发展,计算智能和大数据产业不断兴起,中国须要独立自主的操作系统。底层基础架构是上层应用的基础,没有自己的操作系统,中国就会一直被美国打压,华为肩负重任,终于在2019年正式发布了鸿蒙系统。
  • 需求
    • 万物互联:与安卓、iOS系统不同,分布式架构使得搭载鸿蒙系统的手机并不像是传统意义上的手机,而是变成了一个中控枢纽,可以无缝连接平板、电脑,实现数据与操作的同步。
    • 流畅度极强:确定时延引擎和高性能IPC技术实现系统流畅,就流畅度而言,甚至要比之前的EMUI版还要流畅,基本没有延迟卡顿现象。
    • 高兼容性:兼容众多安卓系统的应用,对于开发者而言,降低开发成本,同时可实现一次开发,多端部署。
    • 全新桌面:鸿蒙桌面推出了万能卡片功能,带来了更进一步的信息显性化和操作高效化;并将通知栏和控制栏分开,原来只能控制单设备的控制中心扩展为超级终端的控制中心。
    • 安全性高:鸿蒙OS系统具备更高的安全特性,基于微内核技术的可信执行环境,通过形式化方法显著提升了内核安全等级,全面提升全场景终端设备的安全能力。
  • 开发历史
    • 2012年,华为开始规划自有操作系统“鸿蒙”。
    • 2017年,鸿蒙内核1.0版本研发完成,开始研发2.0版本。
    • 2018年,鸿蒙内核2.0应用于终端TEE。
    • 2019年8月9日,华为正式发布鸿蒙系统,同时鸿蒙OS实行开源。
    • 2020年9月10日,华为鸿蒙系统升级至2.0版本,即HarmonyOS 2.0,并面向128KB-128MB终端设备开源。同年12月16日,华为宣布正式推出鸿蒙OS的手机开发者Beta版。
    • 2021年6月2日,华为正式发布了 HarmonyOS 2 操作系统。
  • 应用场景

          华为实行“1+8+N”全场景智慧生活战略:

               “1”就是手机,是主入口;

               “8”是指:PC、平板、智慧大屏、车载屏幕、音箱、眼镜、手表、耳机这8个华为自研领域产品,

               “N”是泛IoT硬件构成的华为HiLink生态。

  • 发展趋势

          鸿蒙系统本身是为物联网而开发的操作系统,美国的打压迫使鸿蒙提前诞生,并借鉴谷歌酝酿中的新操作系统的技术,顺应5G时代万物互联的大势,提出微内核,分布式的理念,可以说顺势而为,时机刚刚好,就目前用户的使用而言,鸿蒙系统基本被人们所认可,所以更大范围的推广只是时间问题。同时在爱国热潮的当下,鸿蒙系统顺应民众的呼声,它在国内的应用前景必然是光明的。

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

  • 什么是创新
    创新是利用现有的知识和物质,在特定的环境中,本着理想化需要或为满足社会需求,去改进或创造新的事物、方法、元素、路径、环境,并能获得一定有益效果的行为。鸿蒙系统的问世就是一种创新,相比于安卓系统,鸿蒙操作系统是微内核设计,微内核的开发难度很大,但是系统的稳定性很高;鸿蒙系统对设备兼容性更强,同时支持智能手机、智能穿戴设备、电脑、电视等智能家居设备,形成一个无缝的、统一的操作系统,并且兼容所有的安卓应用,适应当下的5G和物联网时代;微内核可以把每一个单独加锁,不可能一个钥匙攻破所有地方。而外核的相互隔离更加安全也更加高效。所以鸿蒙系统的安全性远高于安卓系统。这些无不是鸿蒙系统做出的创新,它是顺应时代发展的优秀产物。
  • 代码复用与创新的关系

          的确鸿蒙系统部分代码是基于ASOP,但是华为也是为ASOP做出了贡献的,复用代码是合理合法的。鸿蒙系统作为一个新的系统,它有权利利用现有的完备知识,这是对广大用户的负责。时代需要创新,在安卓基础上的鸿蒙系统,它更加完备,满足广大用户            的更多的需求,在很多方面甚至超过了安卓系统,这是一种质的飞跃,怎么能够浅显的认为这是一种“套壳”?而且鸿蒙系统现在的理念是全场景智慧生活,追求多种设备互通互联,这是空前的创新,必然会是人们的生活更加便利,鸿蒙的全球推广指日可待。

三、代码风格分析 

  1. 好的代码风格1 :
    • 代码示例:
      static int OsShellCreateTask(ShellCB *shellCB)
      {
          struct sched_param param = { 0 };
          int ret;
      
          ret = sched_getparam(getpid(), &param);
          if (ret != SH_OK) {
              goto OUT;
          }
      
          param.sched_priority = SHELL_PROCESS_PRIORITY_INIT;
      
          ret = sched_setparam(getpid(), &param);
          if (ret != SH_OK) {
              goto OUT;
          }
      
          ret = ShellTaskInit(shellCB);
          if (ret != SH_OK) {
              goto OUT;
          }
      
          ret = ShellEntryInit(shellCB);
          if (ret != SH_OK) {
              goto OUT;
          }
      
          (void)pthread_join(shellCB->shellTaskHandle, NULL);
          (void)pthread_join(shellCB->shellEntryHandle, NULL);
      
      OUT:
          ShellDeinit(shellCB);
          return ret;
      }
      • 分析:类名首字母大写,变量名称简短,采用缩进的风格书写,每一行的几乎一句代码语句,程序块上下也有空行,看起来清晰明了,便于阅读。

             

         2.好的代码风格2 :

                     代码示例:

int main(int argc, char **argv)
{
    int ret = SH_NOK;
    ShellCB *shellCB = NULL;

    if (!strcmp(argv[0], "shell") && argv[1]) {
        ret = DoShellExec(argv + 1);
        return ret;
    }

    setbuf(stdout, NULL);

    shellCB = (ShellCB *)malloc(sizeof(ShellCB));
    if (shellCB == NULL) {
        goto ERR_OUT1;
    }
    ret = memset_s(shellCB, sizeof(ShellCB), 0, sizeof(ShellCB));
    if (ret != SH_OK) {
        goto ERR_OUT1;
    }

    ret = pthread_mutex_init(&shellCB->keyMutex, NULL);
    if (ret != SH_OK) {
        goto ERR_OUT1;
    }

    ret = pthread_mutex_init(&shellCB->historyMutex, NULL);
    if (ret != SH_OK) {
        goto ERR_OUT2;
    }

    ret = (int)OsShellKeyInit(shellCB);
    if (ret != SH_OK) {
        goto ERR_OUT3;
    }
    (void)strncpy_s(shellCB->shellWorkingDirectory, PATH_MAX, "/", 2); /* 2:space for "/" */

    sem_init(&shellCB->shellSem, 0, 0);

    g_shellCB = shellCB;
    return OsShellCreateTask(shellCB);

                分析:一个变量定义占一行,一个语句占一行;判断语句表达式划分的很好,形式上一致,可读性强。

 

 

        3.好的代码风格3 :

                     代码示例:

STATIC INLINE TELNET_DEV_S *GetTelnetDevByFile(const struct file *file, BOOL isOpenOp)
{
    struct Vnode *telnetInode = NULL;
    TELNET_DEV_S *telnetDev = NULL;

    if (file == NULL) {
        return NULL;
    }
    telnetInode = file->f_vnode;
    if (telnetInode == NULL) {
        return NULL;
    }
    /*
     * Check if the f_vnode is valid here for non-open ops (open is supposed to get invalid f_vnode):
     * when telnet is disconnected, there still may be 'TelentShellTask' tasks trying to write
     * to the file, but the file has illegal f_vnode because the file is used by others.
     */
    if (!isOpenOp) {
        if (telnetInode != g_currentVnode) {
            return NULL;
        }
    }
    telnetDev = (TELNET_DEV_S *)((struct drv_data*)telnetInode->data)->priv;
    return telnetDev;
}

                分析:可以清晰地看到相对应的大括号,相关语句还有注释,较好的反映设计思想和代码逻辑,格式规范可读性强。

 

        3.好的代码风格3 :

                     代码示例:

int main(int argc, char **argv)
{
int fd = open("/dev/trace", O_RDWR);
if (fd == -1) {
printf("Trace open failed.\n");
exit(EXIT_FAILURE);
}
 
if (argc == 1) {
TraceUsage();
} else if (argc == 2 && strcmp(argv[1], "start") == 0) {
ioctl(fd, TRACE_START, NULL);
} else if (argc == 2 && strcmp(argv[1], "stop") == 0) {
ioctl(fd, TRACE_STOP, NULL);
} else if (argc == 2 && strcmp(argv[1], "reset") == 0) {
ioctl(fd, TRACE_RESET, NULL);
} else if (argc == 3 && strcmp(argv[1], "mask") == 0) {
size_t mask = strtoul(argv[2], NULL, 0);
ioctl(fd, TRACE_SET_MASK, mask);
} else if (argc == 3 && strcmp(argv[1], "dump") == 0) {
size_t flag = strtoul(argv[2], NULL, 0);
ioctl(fd, TRACE_DUMP, flag);
} else if (argc == 3 && strcmp(argv[1], "read") == 0) {
size_t size = strtoul(argv[2], NULL, 0);
TraceRead(fd, size);
} else if (argc >= 4 && strcmp(argv[1], "write") == 0) {
TraceWrite(fd, argc, argv);
} else {
printf("Unsupported trace command.\n");
TraceUsage();
}
 
close(fd);
return 0;
}

                       分析:主函数部分首行没有缩进,判断语句部分太繁琐,全篇没有注释,可读性略差。

 

       

                  

                      

posted @ 2021-09-18 19:23  NTUSWJ  阅读(163)  评论(0编辑  收藏  举报