android Init.rc解析以及init初始化

来源:互联网 发布:c语言volatile 寄存器 编辑:程序博客网 时间:2024/04/29 23:10

Init.rc文件由以下四部分组成

1.  动作(Actions)

2.  命令(Commands)

3. 服务(Services)

4.  选项(Options)

在文件中每一行代表一组语句。语句把文件分成多个部分(Section),而每一部分的开头需要指定Actions或Services。也就是说,每一个Actions或 Services确定一个Section。而所有的Commands和Options只能属于最近定义的Section。如果Commands和 Options在第一个Section之前被定义,它们将被忽略。Actions和Services的名称必须唯一。如果有两个或多个Action或Service拥有同样的名称,那么init在执行它们时将抛出错误,并忽略这些Action和Service。

Actions是以关键字on开头的,然后跟一个触发器,接下来是若干命令,结构如下

on <trigger>     <command>     <command>     <command>
代码如下

on init
    sysclktz 0
    loglevel 3
    # Backward compatibility
    symlink /system/etc /etc
    symlink /sys/kernel/debug /d


Services (服务)是一个程序,他在初始化时启动,并在退出时重启(可选),结构如下,

service <name> <pathname> [ <argument> ]*            <option>            <option>
代码如下

service media /system/bin/mediaserver
    class main
    user media
    group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc mediadrm
    ioprio rt 4

在Init.c的main函数中通过init_parse_config_file("/init.rc");来解析init.rc文件,它将文件按其语法解析成为三部分,service通过list_add_tail(&service_list, &svc->slist);保存在service_list中,action通过list_add_tail(&action_list, &act->alist);保存在action_list中,通过import导入的其他配置文件则通过list_add_tail(import_list, &import->list);保存在import_list链表中,

这时init.c中需要用到的command,action以及service对象已经初始化完成,结构如下:

struct command
{
        /* list of commands in an action */
    struct listnode clist;
    int (*func)(int nargs, char **args);
    int line;
    const char *filename;
    int nargs;
    char *args[1];
};

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;
};

struct service {
        /* list of all services */
    struct listnode slist;
    const char *name;
    const char *classname;
    unsigned flags;
    pid_t pid;
    time_t time_started;    /* time of last start */
    time_t time_crashed;    /* first crash within inspection window */
    int nr_crashed;         /* number of times crashed within window */
    uid_t uid;
    gid_t gid;
    gid_t supp_gids[NR_SVC_SUPP_GIDS];
    size_t nr_supp_gids;
    char *seclabel;
    struct socketinfo *sockets;
    struct svcenvinfo *envvars;
    struct action onrestart;  /* Actions to execute on restart. */
    /* keycodes for triggering this service via /dev/keychord */
    int *keycodes;
    int nkeycodes;
    int keychord_id;
    int ioprio_class;
    int ioprio_pri;
    int nargs;
    /* "MUST BE AT THE END OF THE STRUCT" */
    char *args[1];
}; /*     ^-------'args' MUST be at the end of this struct! */



接下来init.c的main函数将进入一个无限循环,并通过如下函数来执行的command以及service的启动

execute_one_command(); 如果有未执行的command就执行,否则返回
restart_processes(); 查看是否有需要启动或重启的service,有的话启动,没有就返回


然后通过监听一个unix域套接字来处理子进程终止,设备节点,以及属性服务的事件

0 0