android init.rc service,[android] init进程 .rc文件中service、action的parsing

init进程code位置:system/core/init

system/core/init/README.md,这个文件是描述rc文件语法的。

以service开头,表示是service;以on开头表示是Action。

对于service行或者on行,调用ParseSection(),在ParseSection中会创建Servcie或者Action对象。

然后处理service或者on行后的行(service或者action的子行)。对于每个子行,都会调用ParseLineSection(),在这个函数中,对于service,会执行对应的函数,比如对于writepid,会调用Servcie::ParseWritepid();

对于action,会执行AddCommand()。

等这个service或者action的所有子行都parse完后,在parse下一个servcie或者action前(调用ParseSection之前),会call endSection(),这个函数会call EndSection。在EndSection()中,对于service,会执行add service;对于action,会add action到action manager。

对于service,对应文件是service.cpp;对于action,对应文件是action_parser.cpp。

parse .rc文件的入口:init.cpp/LoadBootScripts()

Parser CreateParser(ActionManager& action_manager, ServiceList& service_list) {

Parser parser;

parser.AddSectionParser("service", std::make_unique(&service_list, subcontexts));

parser.AddSectionParser("on", std::make_unique(&action_manager, subcontexts));

parser.AddSectionParser("import", std::make_unique(&parser));

return parser;

}

static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_list) {

Parser parser = CreateParser(action_manager, service_list);

std::string bootscript = GetProperty("ro.boot.init_rc", "");

if (bootscript.empty()) {

parser.ParseConfig("/init.rc");

if (!parser.ParseConfig("/system/etc/init")) {

late_import_paths.emplace_back("/system/etc/init");

}

if (!parser.ParseConfig("/product/etc/init")) {

late_import_paths.emplace_back("/product/etc/init");

}

if (!parser.ParseConfig("/odm/etc/init")) {

late_import_paths.emplace_back("/odm/etc/init");

}

if (!parser.ParseConfig("/vendor/etc/init")) {

late_import_paths.emplace_back("/vendor/etc/init");

}

} else {

parser.ParseConfig(bootscript);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值