[android]根据init.rc启动action和service
一、init.rc语法规则
1.init.rc文件的内容主要分类
动作(Action)
命令(Commands)
服务(Services)
选项(Options)
触发(trigger)
2.动作和命令一起使用
[cpp]
on <trigger>
<command>
<command>
<command>
on <trigger>
<command>
<command>
<command>2.1.trigger是触发条件,为真执行命令
trigger有以下几种类型
[cpp]
boot
/init.conf加载完毕时触发
<name>=<value>
当<name>被设置为<value>时触发
device-added-<path>
device-removed-<path>
设备<path>被添加移除时触发
service-exited-<name>
当服务<name>退出时触发
boot
/init.conf加载完毕时触发
<name>=<value>
当<name>被设置为<value>时触发
device-added-<path>
device-removed-<path>
设备<path>被添加移除时触发
service-exited-<name>
当服务<name>退出时触发3.服务和选项一起使用
[cpp]
service <name> <pathname> [ <argument> ]*
<option>
<option>
service <name> <pathname> [ <argument> ]*
<option>
<option>3.1.option选项
[cpp]
critical
disabled
setenv <name> <value>
socket <name> <type> <perm> [ <user> [ <group> ] ]
user <username>
group <groupname> [ <groupname> ]*
oneshot
class <name>
onrestart
critical
disabled
setenv <name> <value>
socket <name> <type> <perm> [ <user> [ <group> ] ]
user <username>
group <groupname> [ <groupname> ]*
oneshot
class <name>
onrestart
二、init.rc文件的解析
1.init_parse_config_file
在system/core/init/init.c文件的main函数中调用
[cpp]
init_parse_config_file("/init.rc");
init_parse_config_file("/init.rc");函数将init.rc作为参数读取进来
[cpp]
int init_parse_config_file(const char *fn)
{
char *data;
data = read_file(fn, 0); //读取init.rc文件到data中
if (!data) return -1;
parse_config(fn, data); //解析配置
DUMP();
return 0;
}
int init_parse_config_file(const char *fn)
{
char *data;
data = read_file(fn, 0); //读取init.rc文件到data中
if (!data) return -1;
parse_config(fn, data); //解析配置
DUMP();
return 0;
}2.解析配置parse_config
[cpp]
static void parse_config(const char *fn, char *s)
{
struct parse_state state;
char *args[INIT_PARSER_MAXARGS];
int nargs;
nargs = 0;
state.filename = fn;
state.line = 1;
state.ptr = s; //指向init.rc的数据
state.nexttoken = 0;
state.parse_line = parse_line_no_op; //空操作
for (;;) {
switch (next_token(&state)) { //-->3.next_token跳过注释等,筛选需要解析的行
case T_EOF: //文件末尾
state.parse_line(&state, 0, 0); //后面参数为 0, 0所以直接返回
return;
case T_NEWLINE: //新行解析
if (nargs) { //有文本参数
int kw = lookup_keyword(args[0]); //解析关键词-->4.lookup_keyword
if (kw_is(kw, SECTION)) { //判断是否section类-->5.kw_is
state.parse_line(&state, 0, 0); //后面参数为 0, 0所以直接返回
parse_new_section(&state, kw, nargs, args); //6.parse_new_section
}
else {
state.parse_line(&state, nargs, args); //解析前一行parse_line_service或parse_line_action
}
nargs = 0; //nargs参数个数清0
}
break;
case T_TEXT: //文本
if (nargs < INIT_PARSER_MAXARGS) {
args[nargs++] = state.text; //保存文本参数,nargs++
}
break;
}
}
}
static void parse_config(const char *fn, char *s)
{
struct parse_state state;
char *args[INIT_PARSER_MAXARGS];
int nargs;
nargs = 0;
state.filename = fn;
state.line = 1;
state.ptr = s; //指向init.rc的数据
state.nexttoken = 0;
state.parse_line = parse_line_no_op; //空操作
for (;;) {
switch (next_token(&state)) { //-->3.next_token跳过注释等,筛选需要解析的行
case T_EOF: //文件末尾
state.parse_line(&state, 0, 0);&
补充:移动开发 , Android ,