您的位置:首页 > 其它

start_class core 具体执行了啥

2016-04-28 13:22 429 查看
在android\system\core\rootdir\init.rc的 on boot最后start_class core

on boot
........
class_start core

on nonencrypted
class_start main
class_start late_start


在android\system\core\init\keyword.h中对应的定义:

KEYWORD(class_start, COMMAND, 1, do_class_start)


在android\system\core\init\builtin.c中:

int do_class_start(int nargs, char **args)
{
/* Starting a class does not start services
* which are explicitly disabled.  They must
* be started individually.
*/
service_for_each_class(args[1], service_start_if_not_disabled);
return 0;
}


在android\system\core\init\init_parse.c中:

void service_for_each_class(const char *classname,
void (*func)(struct service *svc))
{
struct listnode *node;
struct service *svc;
list_for_each(node, &service_list) {
svc = node_to_item(node, struct service, slist);
if (!strcmp(svc->classname, classname)) {
func(svc);
}
}
}


对每一个core service执行:
service_start_if_not_disabled //定义在builtin.c


static void service_start_if_not_disabled(struct service *svc)
{
if (!(svc->flags & SVC_DISABLED)) {
service_start(svc, NULL);
} else {
svc->flags |= SVC_DISABLED_START;
}
}


继而走到service_start()中,定义在android\system\init\init.c

void service_start(struct service *svc, const char *dynamic_args)
{
struct stat s;
pid_t pid;
int needs_console;
int n;
char *scon = NULL;
int rc;

//...

pid = fork();
if (pid == 0) {
//.......

execve(svc->args[0], (char**) arg_ptrs, (char**) ENV);
}
}


从init进程,fork出子进程,然后执行service进程

/system/bin/sysmon

/system/bin/logd

/sbin/healthd

/system/bin/prepare_param.sh /dev/block/platform/sdio_emmc/by-name/PARAM

/system/bin/lmkd

/system/bin/servicemanager

/system/bin/vold

/system/bin/surfaceflinger

另外

/sbin/eventd, 已经在on early-init中被启动了

被disabled的几个,也不在此时启动:

/system/bin/sh

/sbin/adbd --root_seclabel=u:r:su:s0

/system/bin/bootanimation

/system/bin/simpletest
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: