涉及相关文件:
\system\core\init\init.cpp
\system\core\init\action.cpp
\system\core\init\action.h
\system\core\init\import_parser.cpp
\system\core\init\import_parser.h
\system\core\init\init_parser.cpp
\system\core\init\init_parser.h
\system\core\init\parser.cpp
\system\core\init\parser.h
\system\core\init\service.cpp
\system\core\init\service.h
\system\core\init\builtins.h
\system\core\init\keyword_map.h
\system\core\rootdir\init.rc
1、init.cpp中main函数分析:
int main(int argc, char** argv) {
........省略无关项,比如kernel_log设置、文件夹创建、selinux初始化文件夹权限、property初始化已经property服务的启动
const BuiltinFunctionMap function_map;
Action::set_function_map(&function_map);
从这里开始通过ActionParser、ServiceParser、ImportParser一步步解析并且执行init.tc中的内容
Parser& parser = Parser::GetInstance();
将service、on、import一次加入到section_parsers_列表中:
parser.AddSectionParser("service",std::make_unique<ServiceParser>());
parser.AddSectionParser("on", std::make_unique<ActionParser>());
parser.AddSectionParser("import", std::make_unique<ImportParser>());
parser.ParseConfig("/init.rc");
ActionManager& am = ActionManager::GetInstance();
am.QueueEventTrigger("early-init");
// Queue an action that waits for coldboot done so we know ueventd has set up all of /dev...
am.QueueBuiltinAction(wait_for_coldboot_done_action, "wait_for_coldboot_done");
// ... so that we can start queuing up actions that require stuff from /dev.
am.QueueBuiltinAction(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");
am.QueueBuiltinAction(keychord_init_action, "keychord_init");
am.QueueBuiltinAction(console_init_action, "console_init");
// Trigger all the boot actions to get us started.
am.QueueEventTrigger("init");
// Repeat mix_hwrng_into_linux_rng in case /dev/hw_random or /dev/random
// wasn't ready immediately after wait_for_coldboot_done
am.QueueBuiltinAction(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");
........
}
init_parser.h
class SectionParser {
public:
virtual ~SectionParser() {
}
virtual bool ParseSection(const std::vector<std::string>& args,
std::string* err) = 0;
virtual bool ParseLineSection(const std::vector<std::string>& args,
const std::string& filename, int line,
std::string* err) const = 0;
virtual void EndSection() = 0;
virtual void EndFile(const std::string& filename) = 0;
};
class Parser {
public:
static Parser& GetInstance();
void DumpState() const;
bool ParseConfig(const std::string& path);
void AddSectionParser(const std::string& name,
std::unique_ptr<SectionParser> parser);
private:
Parser();
void ParseData(const std::string& filename, const std::string& data);
bool ParseConfigFile(const std::string& path);
bool ParseConfigDir(const std::string&am