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域套接字来处理子进程终止,设备节点,以及属性服务的事件
- android Init.rc解析以及init初始化
- Android的init过程:初始化语言(init.rc)解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- android init.rc解析
- Android init.rc解析
- Android init.rc解析
- Android init.rc解析
- 人脸识别DEMO
- Linux echo --显示文本,打印信息
- java 字符串中特殊字符引号“ %百分号的转义
- HDOJ 1431 回文素数
- android获取屏幕像素密度DPI,与density
- android Init.rc解析以及init初始化
- 如何设计一个自动布局库:以SDAutoLayout为例
- LeetCode 28 . Implement strStr()
- Android Studio 开发问题记录
- 回车键绑定
- JS----简单表单密码强度检验
- Linux env --显示当前用户的环境变量
- 【.Net码农】依赖注入那些事儿
- Android animation