软件工程2021:第2次作业—— 谈谈鸿蒙操作系统
0x01 概括介绍鸿蒙操作系统
·开发背景:
我国操作系统技术发展受限;谷歌停止对华为提供GMS服务以限制华为,华为将开发鸿蒙系统提上日程。
·需求:
新时代万物互联的要求需要新的操作系统来实现;为了弥补技术发展在这方面的短板需要尽快开发属于我国自己的操作系统。
·开发历史:
2012年,华为的自有操作系统开始规划。
2017年,分布式操作系统内核1.0完成技术验证,并逐步开展内核2.0研发。
2018年,华为申请“华为鸿蒙”商标。
2019年,鸿蒙OS 1.0版本正式亮相,其关键模块均为自研,同时具备分布式架构、方舟编译器、确定时延引擎、TEE微内核形式化验证以及多终端开发IDE(Beta)。
2020年,华为正式发布HarmonyOS 2.0手机开发者Beta版本。
2021年,鸿蒙操作系统正式开启大规模商用。从6月2日开启升级后,到目前为止,鸿蒙系统升级用户已突破一个亿。
·应用场景:
用于多种物联网场景,如用于联通手机,电脑,智能家居,车联网及其他设备。
·可能趋势:
逐步抛开asop与谷歌相关代码框架;向操作一体化,智能化方向发展,着重提升各设备互联交互体验;通过开源项目集众人之力,搭建自己的代码生态体系。
0x02 关于鸿蒙套壳操作的争议
·什么是创新:
按照我的理解,创新就是利用已有的条件和基础,根据需求创造和改进,实现新的价值,创造新的事物。这一过程的性质是积极的。如vivo的originos这样大部分功夫都用在界面ui上,内核几乎完全套用安卓的也可以称为创新;鸿蒙系统在asop的基础上走出了自己的路,比起目前现有的安卓系统,不依赖gms服务,在多设备联通上更加优越,是值得学习的创新,而非简单的套壳。
·代码复用与创新的关系:
代码复用的基础上完成创新是完全合理可行,也是常用的。利用原有代码的便利,调用开发新的内容毫无疑问是创新。任何创新都不可能没有基础,凭空早就。并不能说开发中利用了各种便利的第三方库的软件就不是创新了。而鸿蒙利用的开源项目asop也有一部分是华为贡献的,在创新起步时对代码的复用是合乎权限且可以理解的。
0x03 代码风格分析
1.好的代码风格1:
代码:
import call from "@ohos.telephony.call"; let phoneNumber = "12312312312"; // 调用接口【callback方式】 call.dial(phoneNumber, {extras: false}, (err, value) => { if (err) { // 接口调用失败,err非空 console.error(`failed to dial because ${err.message}`); return; } // 接口调用成功,err为空 console.log(`success to dial: ${value}`); }); // 调用接口【Promise方式】 let promise = call.dial(phoneNumber, {extras: false}); promise.then((value) => { // 接口调用成功,此处可以实现成功场景分支代码。 console.log(`success to dial: ${value}`); }).catch((err) => { // 接口调用失败,此处可以实现失败场景分支代码。 console.error(`failed to dial because ${err.message}`); });
分析:注释详细清晰,代码简洁可读性好;接口调用场景全面,异步接口可靠性高,时钟信号不需严格同步。
2.好的代码风格2:
代码:
class CaptureSurfaceListener : public IBufferConsumerListener { public: int32_t mode_; sptr<Surface> surface_; void OnBufferAvailable() override { int32_t flushFence = 0; int64_t timestamp = 0; OHOS::Rect damage; // initialize the damage OHOS::sptr<OHOS::SurfaceBuffer> buffer = nullptr; surface_->AcquireBuffer(buffer, flushFence, timestamp, damage); if (buffer != nullptr) { void *addr = buffer->GetVirAddr(); int32_t size = buffer->GetSize(); // Save the buffer(addr) to a file. surface_->ReleaseBuffer(buffer, -1); } } };
分析:驼峰命名法令变量名便于阅读,创建缓冲区保存文件便于管理监听和后续操作。
3.好的代码风格3:
代码:
// set isBlocking = true/false for blocking/non-blocking read bytesRead = audioRecorder->Read(*buffer, bufferLen, isBlocking); while (numBuffersToRecord) { bytesRead = audioRecorder->Read(*buffer, bufferLen, isBlockingRead); if (bytesRead < 0) { break; } else if (bytesRead > 0) { fwrite(buffer, size, bytesRead, recFile); // example shows writes the recored data into a file numBuffersToRecord--; } }
分析:对read函数进行重复调用至主动停止,简化操作。