(基于openharmony5.0
)
投票机制
param get | grep ohos.boot.time
图 投票机制参数图
只有当所有的投票完成,开机动画才会退出,整理需要投票的系统应用(三方应用不参与投票)如下图所示:
以进程foundation为例:
foundation\systemabilitymgr\safwk\etc\profile\foundation.cfg
"bootevents": [
"bootevent.wms.fullscreen.ready",
"bootevent.appfwk.ready",
"bootevent.lockscreen.ready",
"bootevent.wms.ready"
],
可以看到foundation进程有4个投票事件,会在相应的时机,代码中调用SystemWriteParam()方法进行投票。如果有需要投票的地方没有投,会导致开机动画不会退出,开机动画退出会检测bootevent.boot.completed事件。
base\startup\init\services\modules\bootevent\bootevent.c
#define BOOT_EVENT_BOOT_COMPLETED "bootevent.boot.completed"
...
static int BootEventParaFireByName(const char *paramName)
{
BOOT_EVENT_PARAM_ITEM *found = NULL;
char *bootEventValue = strrchr(paramName, '.');
INIT_CHECK(bootEventValue != NULL, return 0);
bootEventValue[0] = '\0';
WriteBooteventSysParam(paramName);
found = (BOOT_EVENT_PARAM_ITEM *)OH_ListFind(&bootEventList, (void *)paramName, BootEventParaListCompareProc);
if (found == NULL) {
return 0;
}
// Already fired
if (found->timestamp[BOOTEVENT_READY].tv_sec > 0) {
return 0;
}
INIT_CHECK_RETURN_VALUE(clock_gettime(CLOCK_MONOTONIC,
&(found->timestamp[BOOTEVENT_READY])) == 0, 0);
g_bootEventNum--;
SetServiceBooteventHookMgr(NULL, paramName, 2); // 2: bootevent service has ready
// Check if all boot event params are fired
if (g_bootEventNum > 0) {
return 0;
}
// All parameters are fired, set boot completed now ...
INIT_LOGI("All boot events are fired, boot complete now ...");
//所有投票事件都已经完成
SystemWriteParam(BOOT_EVENT_BOOT_COMPLETED, "true");
SaveServiceBootEvent();
// report complete event
ReportSysEvent();
BootCompleteClearAll();
#ifndef STARTUP_INIT_TEST
HookMgrExecute(GetBootStageHookMgr(), INIT_BOOT_COMPLETE, NULL, NULL);
#endif
RemoveCmdExecutor("bootevent", -1);
return 1;
}