一、概述鸿蒙操作系统
- 开发背景:我国对操作系统技术发展的需求迫在眉睫。
- 需求:面向全场景、全连接、全智能时代,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。
- 开发历史:
2012年,华为开始规划自有操作系统“鸿蒙”。
2019年5月24日,国家知识产权局商标局网站显示,华为已申请“华为鸿蒙”商标,申请日期是2018年8月24日,注册公告日期是2019年5月14日,专用权限期是从2019年5月14日到2029年5月13日。
2019年5月17日,由任教授领导的华为操作系统团队开发了自主产权操作系统——鸿蒙。
2019年8月9日,华为正式发布鸿蒙系统。同时余承东也表示,鸿蒙OS实行开源。
在中国信息化百人会2020年峰会上,华为消费者业务CEO余承东表示,鸿蒙os目前已经应用到华为智慧屏、华为手表上,未来有信心应用到1+8+N全场景终端设备上。
2020年9月10日,华为鸿蒙系统升级至华为鸿蒙系统2.0版本,即HarmonyOS 2.0。余承东表示,2020年12月份将面向开发者提供鸿蒙2.0的beta版本。
-
应用场景 :可以连接到大屏、手机、PC、音响等,未来矿山鸿蒙操作系统还有望在火电、风电和水电等领域得到应用,进一步助推我国工业制造业智能化发展。将来兼容HarmonyOS分布式功能模块的带屛的冰箱、跑步机、家居中控等智能家居设施,充电桩、POS机、ATM等智能终端设施,均有可能完成数字人民币的便捷支付、收付款。
二、关于鸿蒙是否套壳的争议
- 什么是创新:创新是指以现有的思维模式提出有别于常规或常人思路的见解为导向,利用现有的知识和物质,在特定的环境中,本着理想化需要或为满足社会需求,而改进或创造新的事物、方法、元素、路径、环境,并能获得一定有益效果的行为。就鸿蒙系统来说,创新是利用已知的知识,在此基础上进行创造,进一步发展完善。ASOP代码并不全是谷歌写的,所以鸿蒙使用ASOP基于开源项目做二次开发属于创新。
- 代码复用与创新的关系:在原有的代码基础上,适当的代码复用也是创新的一种方式。任何机构和企业都有义务为开源社区贡献代码,也能够使用和下载开源代码,并基于开源项目做二次开发。华为也是ASOP的重要贡献者,因此,我认为,代码复用可以用于创新。
三、代码风格分析
1.好的代码风格1:
···
pthread_t g_apThread;
char* g_apArg[20] = {0};
int g_apArgc = 0;
static void* ThreadMain()
{
printf("[HostapdSample]init hostapd.\n");
void *handleLibWpa = dlopen("/usr/lib/libwpa.so", RTLD_NOW | RTLD_LOCAL);
if (handleLibWpa == NULL) {
printf("[HostapdSample]dlopen libwpa failed.\n");
return NULL;
}
int (*func)(int, char **) = NULL;
func = dlsym(handleLibWpa, "ap_main");
if (func == NULL) {
dlclose(handleLibWpa);
printf("[HostapdSample]dlsym ap_main failed.\n");
return NULL;
}
int ret = func(g_apArgc, g_apArg);
printf("[HostapdSample]run ap_main failed, ret:%d.\n", ret);
for (int i = 0; i < g_apArgc; i++) {
printf("[HostapdSample]arg %d:%s.\n", i, g_apArg[i]);
}
if (dlclose(handleLibWpa) != 0) {
printf("[HostapdSample]dlclose libwpa failed.\n");
return NULL;
}
return NULL;
}
···
分析:增加了空白行,对于每一个if语句的结果清晰明了,可读性较好。
2.好的代码风格2:
···
import AppPresenter from './AppListPresenter.js';
var appPresenter;
export default {
data: {
appList: []
},
onInit() {
appPresenter = new AppPresenter(this.$app.$def.data.appModel);
// 绑定回调方法
appPresenter.getApplicationInfos(this.applicationInfosCallback.bind(this))
},
// 定义获取数据的回调方法
applicationInfosCallback(data) {
this.appList = data;
}
}
···
分析:在 AppView.js 中定义获取数据的回调方法 applicationInfosCallback(data) ,并将其绑定到 AppPresenter.getApplicationInfos(callback) 的 callback 参数。
通过添加注释,增添可读性。
3.好的代码风格3:
···
import FeatureAbility from '@ohos.ability.featureability';
//参数paramAbilityname, paramBundleName 是对应应用的abilityname,bundleName
startAbility(paramAbilityname, paramBundleName) {
FeatureAbility.startAbility({
bundleName: paramBundleName,
abilityName: paramAbilityname,
requestCode: 1,
abilityType: "PageAbility",
want:{
action: "action1",
entities: ["entity1"],
type: "PageAbility",
flags: 2,
elementName: {
deviceId : "deviceId",
bundleName : paramBundleName,
abilityName : paramAbilityname,
},
},
syncOption: 1,
}).then(data =>
console.info("Launcher promise::then : " + JSON.stringify(data))
).catch(error =>
console.info("Launcher promise::catch : " +JSON.stringify(error) )
);
}
···
分析:在开头对代码进行解释。运用接口,启动Ability。
4.不好的代码风格1:
···
for (size_t i = 0; i < argc; i++) {
napi_valuetype valueType;
napi_typeof(env, argv[i], &valueType);
if (i == 0 && valueType == napi_number) {
napi_get_value_int64(env, argv[i], &asyncContext->time);
} else if (i == 1 && valueType == napi_function) {
napi_create_reference(env, argv[i], 1, &asyncContext->callbackRef);
} else {
delete asyncContext;
NAPI_ASSERT(env, false, "type mismatch");
}
}
napi_value result = nullptr;
if (asyncContext->callbackRef == nullptr) {
napi_create_promise(env, &asyncContext->deferred, &result);
} else {
napi_get_undefined(env, &result);
}
napi_value resource = nullptr;
napi_create_string_utf8(env, "JSSystemTimeSetTime", NAPI_AUTO_LENGTH, &resource);
napi_create_async_work(
env, nullptr, resource,
[](napi_env env, void* data) {
SetTimeAsyncContext* asyncContext = (SetTimeAsyncContext*)data;
bool setTimeResult = OHOS::MiscServices::TimeServiceManager::GetInstance()->SetTime(asyncContext->time);
if (setTimeResult) {
asyncContext->status = 0;
} else {
asyncContext->status = 1;
}
},
[](napi_env env, napi_status status, void* data) {
SetTimeAsyncContext* asyncContext = (SetTimeAsyncContext*)data;
napi_value result[2] = { 0 };
if (!asyncContext->status) {
napi_get_undefined(env, &result[0]);
napi_get_boolean(env, true, &result[1]);
} else {
napi_value message = nullptr;
napi_create_string_utf8(env, "SetTime fail", NAPI_AUTO_LENGTH, &message);
napi_create_error(env, nullptr, message, &result[0]);
napi_get_undefined(env, &result[1]);
}
if (asyncContext->deferred) {
if (!asyncContext->status) {
napi_resolve_deferred(env, asyncContext->deferred, result[1]);
} else {
napi_reject_deferred(env, asyncContext->deferred, result[0]);
}
} else {
napi_value callback = nullptr;
napi_get_reference_value(env, asyncContext->callbackRef, &callback);
// 2 -> result size
napi_call_function(env, nullptr, callback, 2, result, nullptr);
napi_delete_reference(env, asyncContext->callbackRef);
}
napi_delete_async_work(env, asyncContext->work);
delete asyncContext;
},
(void*)asyncContext, &asyncContext->work);
napi_queue_async_work(env, asyncContext->work);
return result;
}
···
分析:多次使用if else语句,可读性较差。看起来很复杂。