软件工程2021:第2次作业—— 谈谈鸿蒙操作系统
一、概述鸿蒙操作系统
- 开发背景:中美合作时期时,国内一直没有可供使用且成熟的操作系统,谷歌提供安卓授权,为防止停止服务,华为未雨绸缪,为打造一个万物互联的全场景操作系统,于2012年提出自主研发鸿蒙操作系统。
- 需求:
- 兼容安卓:对于开发者而言,降低开发成本,同时可实现一次开发,多端部署。
- 多终端的适应性、连接性、便携性:满足安卓与iOS达不到的的完全适配
- 分布式架构终端OS:跨终端无缝协同
- 系统流畅:确定时延引擎和高性能IPC技术实现基于微内核架构重塑终端设备可信安全、
- 跨终端生态共享:统一IDE支撑一次性开发,多端部署
- 开发历史:
- 2012年 华为自有操作系统开始进行规划
- 2016年5月 消费者BG软件部立项研发分布式操作系统1.0版本
- 2017年5月 分布式操作系统1.0版本研发完成,开始研发2.0版本
- 2018年5月 华为申请“华为鸿蒙”商标
- 2019年5月 华为“鸿蒙”商标注册公告
- 2019年5月 华为正式发布“鸿蒙”,在华为智能屏上投入使用
- 2020年9月 鸿蒙系统升级至2.0版本,向内存128KB~128MB设备开源
- 2020年12月 华为发布基于鸿蒙OS的手机开发者Beta功能
- 2021年4月 鸿蒙OS2.0向内存128MB~4GB设备开源
- 2021年4月 华为OS2.0开发者公测版本大批量向已申请的开发者推送
- 2021年5月 鸿蒙OS2.0开启第二轮公测
- 2021年10月 鸿蒙OS计划向4GB内存以上设备开源
- 应该场景:1+8+N全场景战略
- 1--手机,
- 8--平板、电视、音响、眼镜、手表、车机、耳机、PC
- N--移动办公、智能家居、运动健康、影音娱乐及智能出行等众多业务板块
- 发展趋势:
- 基于鸿蒙的全开放体系,打造鸿蒙系统的全域的物联网体系,构建完善的5G服务生态体系
- 将鸿蒙系统利用到智能家居、智慧办公、运动健康、教育关怀等全场景多品类,构建智能硬件生态产品朋友圈
二、关于鸿蒙是否套壳的争议
- 什么是创新:(联系鸿蒙系统分析)
- 创新是指通过现有的思维模式提出另类的见解为导向,利用现有的知识和物质,在特定的环境中,为了理想化需要或为满足社会需求,而改进或创造新产物,并取得有益效果的行为。
- 鸿蒙系统的开发使用了ASOP代码,虽然全称叫安卓开源项目但是这也只是安卓系统的前身,或者可以这样说:鸿蒙和安卓是基于同一个已有代码的不同创新产物。华为有权利并且使用了ASOP代码,但是创造出的鸿蒙操作系统和安卓不同,其目标是打造鸿蒙系统全域的物联网体系而不仅仅在于安卓的目标市场,鸿蒙系统对物联网充分的适配性和开放性更满足了大众对于智能生活的要求,取得了更有益的成果,这就是鸿蒙创新。
- 代码复用与创新的关系:
- 创新本来就是基于一定基础之下的改变、进步和发展,上述在创新方面曾提及ASOP代码,华为作为ASOP重要贡献者之一,复用ASOP代码无可厚非,但是代码复用并不意味着不创新,华为在使用ASOP代码的基础上编写出的鸿蒙操作系统是创新的产物。抛开鸿蒙UI和安卓及IOS的UI是否类似这个问题不谈,至少在代码层面,华为有原创,有改变有进步并且有一个很好的发展前景能产生较有益的效果。
三、代码风格分析
- 好的代码风格1:
- 代码:
EXTERN_C_START static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = { DECLARE_NAPI_FUNCTION("write", Write), DECLARE_NAPI_FUNCTION("configure", Configure) }; NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(napi_property_descriptor), desc)); // init EventType class, Event class and Param class InitNapiClass(env, exports); return exports; } EXTERN_C_END
- 分析:
- 外部变量申明,宏定义,定义描述符,定义事件和参数
- 分段有锁紧,比较整洁,有注释,可读性强
- 好的代码风格2:
- 代码:
#ifndef BATTERYD_SUBSCRIBER_H #define BATTERYD_SUBSCRIBER_H #include "battery_info.h" #include "batteryd_api.h" #include "ipc_object_stub.h" namespace OHOS { namespace PowerMgr { class BatterydSubscriber : public IPCObjectStub { public: explicit BatterydSubscriber() : IPCObjectStub(u"ohos.powermgr.IBatterydSubscriber") {}; virtual ~BatterydSubscriber() = default; virtual int32_t Update(const BatteryInfo &info) = 0; int OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override; private: static const BatteryInfo &ParserBatteryInfo(MessageParcel &data, MessageParcel &reply, MessageOption &option); }; } // namespace PowerMgr } // namespace OHOS #endif // BATTERYD_SUBSCRIBER_
- 分析:
- 使用idndef进行条件编译可以防止多重定义,定义公开和私有变量
- 一眼就能看到相对应的大括号,对应段有注释,格式规范可读性强
- 好的代码风格3:
- 代码:
//unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L139 function funescape( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : // BMP codepoint high < 0 ? String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }
- 分析:
- 匹配十六进制字符
- 有注释,可读性强
- 不好的代码风格1:
- 代码:
unsigned char ch; char* s = textBuf_; while ((ch = *s++)) { UPDATER_CHECK_ONLY_RETURN(!(ch < ' ' || ch > '~'), ch = '?'); auto *srcP = reinterpret_cast<uint8_t*>(static_cast<char*>(fontBuf_) + ((ch - ' ') * fontWidth_)); auto *dstP = reinterpret_cast<BRGA888Pixel*>(static_cast<char*>(tmpBuf) + (textSy * viewWidth_ + textSx) * sizeof(BRGA888Pixel)); for (unsigned int j = 0; j < fontHeight_; j++) { for (unsigned int i = 0; i < fontWidth_; i++) { uint8_t a = srcP[i]; if (a > 0) { dstP[i].r = textColor_.r; dstP[i].g = textColor_.g; dstP[i].b = textColor_.b; dstP[i].a = textColor_.a; } } srcP += MAX_FONT_BUFFER_SIZE_HW; dstP = dstP + viewWidth_; } textSx += fontWidth_; }
- 分析:
- 使用多次for循环,无注释,格式不够清晰,可读性差。
- 语句过长,看起来繁琐。