软件工程2021:第2次作业—— 谈谈鸿蒙操作系统
一、概述鸿蒙操作系统
-
开发背景
2021年,我国近百分之九十的用户使用安卓系统,百分之三十三的用户使用苹果系统,而处处被美国制裁的中国和华为急需自己的手机操作系统来紧跟科技潮流,此时华为自研的鸿蒙系统诞生了。
-
需求:
在芯片被美国制裁之后,华为遭受重创。而在中国相对薄弱的芯片和操作系统上,华为成功研发出自己的操作系统,打破了安卓和苹果两家独大的局面,为华为争取了更多的话语权,打破了中国手机在操作系统上对外国的依赖。同时鸿蒙使用的微内核架构大大增强了鸿蒙系统的可扩展性,可以移植到内存更小的智能家电上,实现万物互联。
-
开发历史:
2012年9月,华为开始规划自有操作系统“鸿蒙”。
2017年,鸿蒙内核1.0完成技术认证
2018年,鸿蒙内核2.0用于终端TEE
2019年5月24日,国家知识产权局商标局网站显示,华为已申请“华为鸿蒙”商标,申请日期是2018年8月24日,注册公告日期是2019年5月14日,专用权限期是从2019年5月14日到2029年5月13日。
2019年5月17日,由某教授领导的华为操作系统团队开发了自主产权操作系统——鸿蒙。
2019年8月9日,华为正式发布鸿蒙系统(HongmengOS),实行开源。
2020年9月10日,华为在HDC开发者大会上如约发布鸿蒙 2.0,并面向应用开发者发布Beta版本。明年鸿蒙将全面支持华为手机。鸿蒙HarmonyOS正式开源,今年年底首先对国内开发者发布针对智能手机的HarmonyOS beta版本。
-
应用场景:
鸿蒙系统由于其是基于微内核的全场景分布式OS,所以十分适合用于物联网,可以保证很低的时延,比如手机与电脑的文件共享,智能电视、智能手表、音箱、空调的互联,能够真正用一个系统打通所有智能电子设备。
-
发展趋势:
鸿蒙系统由于通过使用确定时延引擎和高性能 IPC 两大技术解决现有系统性能不足的问题,能够大大减少时延,使得系统使用十分流畅,而且万物互联的操作十分简单,必将受到消费者的欢迎。从开发者的角度来看,鸿蒙使用统一的IDE,支持一次开发后多端部署,能够大幅度提高开发的效率,让软件的开发成本更加低廉。作为一个对消费者与开发者都友好的系统,相信发展前景一定十分光明,能够在物联网领域占领一席之地甚至领军地位。
二、关于鸿蒙是否套壳的争议
-
什么是创新:
以我的愚见看来,创新应该是实现一些目前未曾实现或者没有人想过的功能,能做到与众不同,独一无二的就是创新。无论是从头到尾都是自己实现的,还是在前人的基础上完成的,只要有前人未曾完成之处,就为创新。因为我并没有很好的安卓开发的基础,对移动端开发了解较少,所以在CSDN上查阅资料之后,了解到鸿蒙系统在一些地方的确使用了安卓的成果,但是在安卓的一些工作之外,鸿蒙实现了分布式软总线的技术,具体为:
1、分布式任务调度
2、分布式数据服务
3、分布式文件服务
与安卓不同,华为努力的方向是定义了以Ability为核心的应用开发框架,使其可以屏蔽不同操作系统的差异,使开发的代码可以在不同操作系统中运行,以及定义了一个以「分布式软总线」为名的自有RPC协议框架,以此RPC协议为基础封装了一系列常用的API,屏蔽了设备之间的繁琐、多种多样、差异很大的通讯方式,提供了稳定、统一、可靠的近场通讯协议。虽然不了解其中的代码工作量,但是在一定程度上,已经可以说是进行了自己的创新,相信随着时间的推移,我们也能做出更加完美更加完善的操作系统。
-
代码复用与创新的关系:
代码复用在某种程度上可能确实会给创新带来质疑,特别是用到了别人的代码,比如HarmonyOS的HarmonyApplication继承自Android的Application,但作为新出现的系统,对已经存在十几年的成熟开源系统中有部分的引用,也是可以理解的。在我看来站在巨人的肩膀上的创新也能称为创新。特别是华为的鸿蒙在理念上已经和安卓有了区别,而且也做出了和安卓不同的特点。所以在我看来,代码复用并不影响创新,区别在于是否全是代码的复用还是有自己的代码,有自己的想法和内容。
三、代码风格分析
1、好的代码风格
-
代码:
namespace OHOS {
namespace CameraStandard {
class CameraInfo : public RefBase {
public:
enum ConnectionType {
CONNECTION_BUILD_IN = 0,
CONNECTION_USB_PLUGIN,
CONNECTION_REMOTE
};
CameraInfo() = default;
CameraInfo(std::string cameraID, std::shared_ptr<CameraMetadata> metadata);
~CameraInfo();
std::string GetID();
std::shared_ptr<CameraMetadata> GetMetadata();
void SetMetadata(std::shared_ptr<CameraMetadata> metadata);
camera_position_enum_t GetPosition();
camera_type_enum_t GetCameraType();
ConnectionType GetConnectionType();
private:
std::string cameraID_;
std::shared_ptr<CameraMetadata> metadata_;
camera_position_enum_t cameraPosition_ = OHOS_CAMERA_POSITION_OTHER;
camera_type_enum_t cameraType_ = OHOS_CAMERA_TYPE_UNSPECIFIED;
ConnectionType connectionType_ = CONNECTION_BUILD_IN;
void init(common_metadata_header_t *metadataHeader);
};
} // namespace CameraStandard
} // namespace OHOS
-
分析:
这段代码成员变量命名易懂且声明为private,保证了类的安全性,同时对这些成员进行操作的方法的命名也都是用了大驼峰的方法统一命名了,并且最后对于花括号的注释清晰简洁。
2、好的代码风格
-
代码:
/*
* startIdx
* |
* 0 0 0 0 0 0 0 0 X X X X X X X X 0 0 0 0 0 0
* |
* endIdx
*/
STATIC UINT32 OsCirBufWriteLinear(CirBuf *cirbufCB, const CHAR *buf, UINT32 size)
{
UINT32 cpSize;
errno_t err;
cpSize = (cirbufCB->remain < size) ? cirbufCB->remain : size;
if (cpSize == 0) {
return 0;
}
err = memcpy_s(cirbufCB->fifo + cirbufCB->endIdx, cirbufCB->remain, buf, cpSize);
if (err != EOK) {
return 0;
}
cirbufCB->remain -= cpSize;
cirbufCB->endIdx += cpSize;
return cpSize;
}
-
分析:
这个注释很有意思,用图形的样子解释了自己的变量的含义,之前没有见过,以后可以参考参考,虽然不知道算不算好的代码风格。
3、不好的代码风格
-
代码:
while (n >= 8) {
if (*(const uint64_t *)(s1) != *(const uint64_t *)(s2)) {
goto L8_byte_diff;
}
s1 += 8;
s2 += 8;
n -= 8;
}
if (n == 0) return 0;
/* L4_byte_cmp */
if (n >= 4) {
if (*(const uint32_t *)(s1) != *(const uint32_t *)(s2)) {
goto L4_byte_diff;
}
s1 += 4;
s2 += 4;
n -= 4;
}
if (n == 0) return 0;
L4_byte_diff:
for (; n && (*s1 == *s2); n--, s1++, s2++);
return n ? *s1 - *s2 : 0;
L8_byte_diff:
if (*(const uint32_t *)(s1) != *(const uint32_t *)(s2)) {
goto L4_byte_diff;
}
s1 += 4;
s2 += 4;
n -= 4;
goto L4_byte_diff;
-
分析:
这段代码使用了C特有的goto语句,它使得难以追踪程序的控制流,使程序难以理解和难以修改。
4、不好的代码风格
-
代码:
if ((pstZ->pstParent == pstNilT) && (pstZ->pstLeft == pstNilT) && (pstZ->pstRight == pstNilT) &&
(pstTree->pstRoot != pstZ)) {
return;
}
-
分析:
这段代码if语句里条件太多,可以一个条件换一行,比较清晰,而不是三个写在一行,另一个放不下就放在下面。