标签:android style blog http io ar color sp for
init进程是android启动的第一个进程 进程pid为1.其主要做了如下几件事:
*解析配置文件
*根据配置文件执行操作early_init init early_boot boot
*设置属性服务
本节主要内容讲解如何解析init.rc文件和运行zygote.
1.解析init.rc配置文件
/**init.c*/
在main函数中,执行如下函数:
init_parse_config_file("/init.rc");/**init_parse.c*/int init_parse_config_file(const char *fn)
{
char *data;
data = read_file(fn, 0);
if (!data) return -1;
parse_config(fn, data);
DUMP();
return 0;
}
static void parse_config(const char *fn, char *s);
parse_config函数主要找到一个SECTION的节点开始解析
if (kw_is(kw, SECTION)) {
state.parse_line(&state, 0, 0);
parse_new_section(&state, kw, nargs, args);
}
kw_is函数执行了keywords文件 并找处指定标示 k_##symbol
/**keywords.h*/
1>定义枚举.枚举值为k_class k_mkdir等export ANDROID_ROOT /system #表示export为一个COMMAND
*如下图
/**init.rc配置文件*/
在该文件中 zygote被定义为需要执行4个操作并且拥有一个socket为660的服务,他是init的一个子进程.
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd struct action {
/* node in list of all actions */
struct listnode alist;
/* node in the queue of pending actions */
struct listnode qlist;
/* node in list of actions for a trigger */
struct listnode tlist;
unsigned hash;
const char *name;
struct listnode commands;
struct command *current;//保存restart里面的COMMOND动作
};
------------------------------------------------
static void *parse_service(struct parse_state *state, int nargs, char **args)
{
struct service *svc;
svc = calloc(1, sizeof(*svc) + sizeof(char*) * nargs);
if (!svc) {
parse_error(state, "out of memory\n");
return 0;
}
svc->name = args[1];
svc->classname = "default";
memcpy(svc->args, args + 2, sizeof(char*) * nargs);
svc->args[nargs] = 0;
svc->nargs = nargs;
svc->onrestart.name = "onrestart";
list_init(&svc->onrestart.commands);
list_add_tail(&service_list, &svc->slist);
return svc;
}static void parse_line_service(struct parse_state *state, int nargs, char **args)
{
struct service *svc = state->context;
nargs--;
args++;
kw = lookup_keyword(args[0]);
//创建Commond结构体
cmd = malloc(sizeof(*cmd) + sizeof(char*) * nargs);
cmd->func = kw_func(kw);
cmd->nargs = nargs;
memcpy(cmd->args, args, sizeof(char*) * nargs);
//添加到双向列表中
list_add_tail(&svc->onrestart.commands, &cmd->clist);
}>>设置service的启动时间 pid等等
restart_processes();//改变flag标识
标签:android style blog http io ar color sp for
原文地址:http://blog.csdn.net/qq285016127/article/details/41649591