软件工程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)变量名,方法名,类名字起名字都要见名之意