[android] init进程 .rc文件中serviceaction的parsing

Posted aspirs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[android] init进程 .rc文件中serviceaction的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<ServiceParser>(&service_list, subcontexts));
    parser.AddSectionParser("on", std::make_unique<ActionParser>(&action_manager, subcontexts));
    parser.AddSectionParser("import", std::make_unique<ImportParser>(&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);
    

  

以上是关于[android] init进程 .rc文件中serviceaction的parsing的主要内容,如果未能解决你的问题,请参考以下文章

android init进程分析 init脚本解析和处理

在 Android Oreo 上使用 su 权限在 init.rc 中启动本机守护进程

android中init.rc文件的解析问题

Android系统启动流程分析

android init.rc修改问题

Android 7.0系统启动流程分析