(基于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 firedif (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 firedif (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 eventReportSysEvent();BootCompleteClearAll();
#ifndef STARTUP_INIT_TESTHookMgrExecute(GetBootStageHookMgr(), INIT_BOOT_COMPLETE, NULL, NULL);
#endifRemoveCmdExecutor("bootevent", -1);return 1;
}