软件工程2021:第2次作业—— 谈谈鸿蒙操作系统
一、概述鸿蒙操作系统
· 开发背景
技术战爆发后,华为在操作系统受限的背景下推出主打物联网时代的“鸿蒙系统”。
· 需求
打破国外对手机系统的封锁,国内的手机厂商长期以来都没有自己的系统,而华为的鸿蒙系统就是真正自主研发的。鸿蒙系统让国内的手机市场流动起来,让国内手机市场真正重视研发,现在的国产厂商在手机的组件方面经验十足了,因而价格也逐渐下压,但手机最核心芯片与系统仍需依赖国外。
从全球操作系统来说,美国的安卓和苹果的iOS已经掌控了这一领域,华为鸿蒙系统有望成为全球第三大操作系统。从美国科技当前禁令的角度看,芯片与系统是所有国产企业最薄弱的一节,外海用户离不开GMS套件,被谷歌禁用后,鸿蒙系统2.0版本仍继续完善外国APP适配,目前有超出6万应用软件加入鸿蒙移动操作系统。
· 开发历史
2012年9月,华为开始规划自有操作系统“鸿蒙”。华为“2012诺亚方舟实验室”专家座谈会上,任正非提出了要做终端操作系统防范于未然,要在“断了我们粮食的时候,备份系统要能用得上。”
2017年,鸿蒙OS内核1.0完成技术验证,并逐步开展内核2.0研发。
2018年,鸿蒙内核2.0已被应用于终端TEE。
2019年8月9日,华为正式发布鸿蒙系统,鸿蒙OS实行开源。此时,在美国等西方禁令影响下,华为芯片来源被切断,手机运营系统也受到压制,华为正式发布鸿蒙系统。
2020年9月10日,华为鸿蒙系统升级至华为鸿蒙系统2.0版本,即Harmonyos 2.0,并面向128KB-128MB终端设备开源。同年12月,手机鸿蒙系统os2.0开放Beta测试版本。
2021年4月22日,Harmonyos应用开发在线体验网站上线。5月18日,华为宣布将HiLink与Harmony OS统一为鸿蒙智联,计划在6月2日正式举办鸿蒙产品发布会。
· 应用场景与发展趋势
鸿蒙OS是一款“面向未来”的操作系统,一款基于微内核的面向全场景的分布式操作系统,现已适配智慧屏,未来它将适配手机、平板、电脑、智能汽车、可穿戴设备等多终端设备。华为鸿蒙操作系统将打通手机、电脑、平板、电视、工业自动化控制、无人驾驶 、车机设备、智能穿戴统一成一个操作系统,并且该系统是面向下一代技术而设计的,能兼容全部安卓应用的所有Web应用,着力构建一个跨终端的融合共享生态,重塑安全可靠的运行环境,为消费者打造全场景智慧生活新体验。
二、关于鸿蒙是否套壳的争议
· 什么是创新(联系鸿蒙系统分析):
自从鸿蒙OS2.0正式发布以后主要的争议有两点,一是鸿蒙OS到底是自主研发创新还是“套壳”Android。创新的定义是人的创造性实践行为,这种实践可以实现利益总量的增加,需要对事物和原来的认识的利用再创造来实现,以形成新的物质形态。鸿蒙打破设备之间的藩篱,是消费者所期待的,能带来更高的效率,更好的体验。而多设备交互,是HarmonyOS的一大创新。有了它,内容流转更便捷,用户可以轻松操控多个设备,就如同操作一台设备一样简单。HarmonyOS全新的多设备控制中心,带来了简约直观的连接方式,手机、平板、电脑、音箱、耳机等一拉即合,方便用户控制多设备。
· 代码复用与创新的关系:
鸿蒙系统的部分代码是基于安卓开源项目ASOP,并不是所有Android代码都是 Google开发的,绝大部分代码来自开源社区。鸿蒙也会吸收社区的优秀技术和代码,用了AOSP的开源代码。鸿蒙复用ASOP开源项目的部分代码,使其可以兼容安卓应用,这是因为用户已经习惯了安卓系统,鸿蒙系统不能一上来就全部推翻安卓系统,先模仿,再要慢慢地改进,最后使其成为一个领先于安卓的操作系统。
三、代码风格分析
· 好的代码风格1
代码示例:
“···
const RunningLock *lock = CreateRunningLock("runinglock_example", RUNNINGLOCK_BACKGROUND, RUNNINGLOCK_FLAG_NONE);
if (lock == NULL) {
return;
}
BOOL ret = AcquireRunningLock(lock);
if (ret == FLASE) {
DestroyRunningLock(lock);
return;
}
ReleaseRunningLock(lock);
DestroyRunningLock(lock); // Must release runninglock before destroyed
分析:使用驼峰命名法,增加代码可读性;变量名见名知意;使用指针,提高程序的编译效率和执行速度,使程序更加简洁。
· 好的代码风格2
代码示例:
“···
// 打开或创建文件
const char fileName[] = "testfile";
int fd = UtilsFileOpen(fileName, O_RDWR_FS | O_CREAT_FS | O_TRUNC_FS, 0);
// 向文件写入特定大小的数据
const char defValue[] = "test case of file system.";
int ret = UtilsFileWrite(fd, defValue, strlen(defValue));
// 关闭文件
UtilsFileClose(fd);
// 获取文件大小
int fileLen = 0;
ret = UtilsFileStat(fileName, &fileLen);
printf("file size = %d\n", fileLen);
// 重新定位文件读/写偏移量
int fd1 = UtilsFileOpen(fileName, O_RDWR_FS, 0);
ret = UtilsFileSeek(fd1, 5, SEEK_SET_FS);
// 读取特定长度的文件数据
char buf[32] = {0};
int readLen = UtilsFileRead(fd1, buf, 32);
ret = UtilsFileClose(fd1);
printf("read len = %d : buf = %s\n", readLen, buf);
// 删除指定文件
ret = UtilsFileDelete(fileName);
分析:每段代码前有中文注释,方便阅读理解代码;每个步骤中间加个空格,提升段落感。
· 好的代码风格3
代码示例:
“···
class Test_inline
{
public:
Test_inline(int a,int b):m_a(a),m_b(b){}
virtual ~Test_inline()
{
m_a = 0;
m_b = 0;
}
int Min() //直接在声明中定义方法其实就是内联函数,等价于inline int Min()
{
return m_a < m_b ? m_a : m_b;
}
inline int Max() //也可以强制加上内联函数关键字inline
{
return m_a > m_b ? m_a : m_b;
}
private:
int m_a;
int m_b;
};
分析:类的内联函数代替C语言中的宏定义作用,若代码执行时间很短,则将函数定义为内联函数,节省调用时间。
在函数前面加上内联函数的关键字inline,该函数则为内联函数,在头文件的声明中直接实现方法函数,其本身自动就成为内联函数。
· 不好的代码风格
代码示例:
“···
private boolean isEligible(int age){
if(age>18){
return true;
}else{
return false;
}
}
分析:一个方法中使用多个退出点(return语句),容易出错。