《Android的设计与实现:卷I》——第3章 3.4.5解析Action

本文详细介绍了init.rc文件中Action的解析过程,包括parse_action函数如何初始化Action结构体,并将其加入action_list链表;以及parse_line_action函数如何解析Action中的Command,并将Command加入Action的Command列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.4.5 解析Action

1.parse_action

解析Action首先从parse_action函数开始,代码如下:
static void parse_action(struct parse_state state, int nargs, charargs)
{
struct action act;
……//省略错误处理内容
act = calloc(1, sizeof(act));
act->name = args[1];
list_init(&act->commands);
/将Action的指针节点放入action_list中/
list_add_tail(&action_list, &act->alist);
return act;
}
从parse_action函数的代码可以看出,解析Action的过程与解析Service的过程十分相似。首先给新创建的Action分配存储空间,然后将Action的指针节点放入一个action_list列表中。这里又涉及两个重要的数据类型:action结构体和action_list链表。
action_list与service_list都是由list_declare宏声明,即static list_declare(action_list)。
action结构体定义在/system/core/init/init.h中,代码如下:
struct action {
/这个指针节点所在的链表存储了所有Action的指针节点 /
struct listnode alist;
/这个指针节点所在的链表存储了所有即将执行的Action的指针节点/
struct listnode qlist;
/这个指针节点所在的链表存储了所有要触发的Action的指针节点/
struct listnode tlist;
unsigned hash;
const charname;
/Action对应的Command/
struct listnode commands;
struct command current;
};

2.parse_line_action

熟悉了Action的存储形式,接着分析Action的解析过程。定位到parse_line_action函数,该函数位于init_parser.c中,代码如下:
static void parse_line_action(struct parse_state state, int nargs, charargs)
{

struct command cmd;
/通过state结构体得到当前Action的引用/
struct action *act = state->context;
int (func)(int nargs, charargs);
int kw, n;
/依然是根据关键字匹配,不过这次匹配的是Command /
kw = lookup_keyword(args[0]);
n = kw_nargs(kw);
……//省略错误处理内容
cmd = malloc(sizeof(cmd) + sizeof(char) nargs);
cmd->func = kw_func(kw);//获取Command对应的指令函数
cmd->nargs = nargs;
memcpy(cmd->args, args, sizeof(char)nargs);
/将Command加入Action的Command列表/
list_add_tail(&act->commands, &cmd->clist);

parse_line_action函数的执行过程很清晰,要比parse_line_service简单很多。
这里涉及一个重要的数据类型struct command。command结构体定义在/system/core/init/init.h中,代码如下:
struct command
{
/ list of commands in an action /
struct listnode clist;
/ command对应的执行函数/
int (func)(int nargs, charargs);
int nargs;
char args[1];
};
至此,init.rc的解析过程便告一段落。接下来开始分析Action和Service的执行阶段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值