当前位置:操作系统 > 安卓/Android >>

[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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,