调用LoadBootScripts方法加载/解析rc文件。先创建一个解析器,支持解析’service’, ‘on’, ‘import’。
若ro.boot.init_rc为空,则开始解析init.rc文件。
然后依次解析/system,/product,/odm,/vendor/etc/init目录rc文件。
一、加载rc文件
1 | static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_list) { |
二、创建解析器
1 | Parser CreateParser(ActionManager& action_manager, ServiceList& service_list) { |
三、解析config
调用ParseConfig方法解析rc文件时,先判断路径是目录还是文件,若是目录则先调用ParseConfigDir方法,否则直接调用ParseConfigFile方法。
1 | bool Parser::ParseConfig(const std::string& path) { |
四、解析config目录
ParseConfigDir方法先判断给定的路径是不是目录,若是目录则再判断该目录下是否包含子目录,若是子目录则直接忽略,而只处理当前路径下rc文件。
为了便于处理,会先对该目录文件进行排序处理,然后再调用ParseConfigFile方法按顺序加载/解析。
1 | bool Parser::ParseConfigDir(const std::string& path, size_t* parse_errors) { |
五、解析config文件
ParseConfigFile方法解析文件时会先读取文件内容,然后将数据传给ParseData方法。
紧接着再遍历section_parser调用其EndFile方法,然后再分析。
1 | bool Parser::ParseConfigFile(const std::string& path, size_t* parse_errors) { |
六、解析数据
1 | void Parser::ParseData(const std::string& filename, const std::string& data, size_t* parse_errors) { |
七、解析服务
1 | Result<Success> ServiceParser::EndSection() { |