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

浅谈 HarmonyOS

 

一、概述鸿蒙操作系统


 

• 开发背景

  随着新数字化和5G物联网时代的到来,还有人工智能和大数据的兴起,中国面临被卡脖子的挑战,独立自主的研发操作系统是迫切的要求。

 

• 需

满足全场景智慧体验的高标准版要求,改善目前对外国操作系统的强烈依赖。

 

开发历史

2012年,华为出于对谷歌如果对其断供就会难以维持生产的顾忌,开始布局自有分布式操作系统

具体时间表如下:

5G的迅猛发展,物联网时代的来临,多年布局使华为抓住了发展的最佳时期。

 

• 应用场景+发展趋势

鸿蒙系统的生态可以概括为1+8+N。1+8+N战略的核心是1 , 即智能手机。智能手机作为鸿蒙生态的核心部分,凭借华为海思自研的麒麟芯片,为其他设备终端提供相应 的通信支撑。8是指PC、平板、智慧屏、音箱、眼镜、手表、车机、耳机,这8项将由华为公司亲自研发和参与市场,并且会追求市场领先地位。N是摄像头、扫地机、智能秤等外围智能硬件,涵盖移动办公、智能家居、运动健康、影音娱乐、智慧出行五大场景模式。

 

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

 


 

 

• 什么是创新:

创新从字面来说是指创造新的事物。我们每天从事的各种活动成为事,在活动中使用的各种物质形态称为物。

但对我个人来说,对创新的理解更倾向于三种要素的结合:新颖+可用+可行

新颖:新颖并不意味着创新一定是开天辟地般的革命。像相对论那样的具有革命意义的理论成果,诚然是创新的一种,但实际上大部分的创新,是在某个较小的范围里,用新颖的思考方式,通过前人未经留意的视角来观察和解决问题。这种新颖的思考方式很可能是从别的领域借用的。这样的创新离我们的生活更近,其价值同样不可低估。鸿蒙系统拥有100%国产操作系统,有自主的版权和底层技术。这不像小米,ov等厂商是借助安卓底层技术上开发自己手机系统。所以它就没有标注Powered by Android这样的标志。

有用:“需求是创新之母” 。大部分了不起的创新都是来自于实际需求。这就需要我们拥有“以用户为中心”的设计概念,站在用户的角度去思考问题。在这个向往万物互联的时代,华为开发出鸿蒙系统,正是要去实现这个目标,将手机,平板,电脑,智能穿戴设备等连接在一起。只需要轻轻碰一下就可以实现连接。甚至可以将扫地机等智能家居也融入华为生态。

可行:任何创新都要考虑在现有条件下的实施问题。如果利用了所有可以利用的资源、条件,仍然无法让某个创新成为现实,那么,再新颖、美妙的想法,也只能是空中楼阁。2019年8月,全球第一款搭载华为鸿蒙系统的荣耀智慧屏正式发布。荣耀智慧屏作为当时首个搭载鸿蒙系统的终端产品,突破了传统电视的概念,搭载有鸿鹄818智慧芯片等三颗华为自研芯片和升降式AI摄像头,内置华为系统级视频通话功能,开创了大屏和手机的新交互方式,除了可联控智能家居,还能实现智慧双投、魔法闪投、魔法控屏等功能。

 

• 代码复用与创新的关系:

创新很少是突发奇想创造出来的,很多都是借鉴他人的成果然后有自己的新颖之处。比如现在发动机厂商研发一台新机器,技术还是会借鉴之前的,不过在转片材料和工艺设计上会有创新之处。如今,华为的鸿蒙系统也是如此。鸿蒙OS从界面到操作方式和华为目前搭载的安卓EMUI系统很像,是不是套牌安卓系统?要搞清楚这个问题,其实要弄清楚开源代码复用的问题,开源代码有点类似通用零部件,制造原理和工艺已经没有秘密,鸿蒙OS没有必要为了显示自己的独特性再去研发一个类似的出来。但鸿蒙系统还有一些独特代码,这类代码和开源代码共同组成鸿蒙OS系统。其实软件开发行业是相信集体智慧的,其他厂家在开源代码使用过程中还能发现问题、对性能进行优化,或者提供新的改进思路。目前安卓的开源代码比例超过了80%,都可以无偿使用,毕竟全世界没有任何一家公司写一个大型软件,每一个行都要求自己亲自去写。所以华为是利用了之前已有的开源代码,但在代码复用之上又加入自己新的idea。也是这样,鸿蒙系统开机界面已没有Powered by Android。

 

三、代码风格分析


 

1.好的代码风格1:

  • 代码示例:

    ···

import fileio from '@OHOS.distributedfile.fileio';

try {
    fileio.Stream.createStream("./testdir/test_stream.txt", "r", function (err, ss) {
        if (!err) {
            ss.read(new ArrayBuffer(4096), {}, function (err, buf, readLen) {
                if (!err) {
                    console.log('readLen: ' + readLen)
                    console.log('data: ' + String.fromCharCode.apply(null, new Uint8Array(buf)))
                } else {
                    console.log('Cannot read from the stream ' + err)
                }
                ss.close(function (err) {
                    console.log(`Stream is ${err ? 'not' : ''}closed`)
                });
            })
        } else {
            console.log('Cannot open the stream ' + err)
        }
    })
} catch (e) {
    console.log(e)
}
···
  • 分析:(1)遇到大括号就缩进

                     (2)使用驼峰命名法

 

2.好的代码风格2:

  • 代码示例:

    ···

// 拿到一个消费型Surface
sptr<Surface> surface = Surface::CreateSurfaceAsConsumer();

// 拿出里面的生产者对象
sptr<IBufferProducer> producer = surface->GetProducer();

// 注册服务
auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
sm->AddSystemAbility(IPC_SA_ID, producer->AsObject());

···
  • 分析:(1)功能不同的代码之间留有空行

                     (2)   养成注释的习惯,代码行数与注释比例在3:1左右

 

3.好的代码风格3:

  • 代码示例:

    ···

BufferRequestConfig requestConfig = {
    .width = 1920, // 屏幕宽度
    .height = 1080, // 屏幕高度
    .strideAlignment = 8, // stride对齐字节
    .format = PIXEL_FMT_RGBA_8888, // 颜色格式
    .usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA, // 用法
    .timeout = 0, // 时延
};

sptr<SurfaceBuffer> buffer;
int32_t releaseFence;

SurfaceError ret = surface->RequestBuffer(buffer, releaseFence, requestConfig);
if (ret != SURFACE_ERROR_OK) {
    // failed
}

BufferFlushConfig flushConfig = {
    .damage = {                   // 重绘区域
        .x = 0,                   // 起点横坐标
        .y = 0,                   // 起点纵坐标
        .w = buffer->GetWidth(),  // 区域宽度
        .h = buffer->GetHeight(), // 区域高度
    },
    .timestamp = 0 // 给消费者看的时间,0为使用当前时间
};

ret = surface->FlushBuffer(buffer, -1, flushConfig);
if (ret != SURFACE_ERROR_OK) {
    // failed
}

···

  • 分析:(1)类,方法,属性,变量先声明后使用

                     (2)变量名,方法名,类名字起名字都要见名之意

 

 

posted @ 2021-09-15 00:34  卖假药小中医  阅读(176)  评论(0编辑  收藏  举报