Android Init进程分析番外篇(9.0的init进程)

莫道桑榆晚,为霞尚满天。这篇文章主要讲述Android Init进程分析番外篇:9.0的init进程相关的知识,希望能为你提供帮助。
1 前言【Android Init进程分析番外篇(9.0的init进程)】在之前的几篇文章中,我们基于android 4.4源码分析了init进程的启动及事件处理逻辑。目前Android版本已然更新到Android 10了,很多代码及服务架构都做了大范围的调整重构,这其中也包括init相关的代码。
但是,万变不离其宗,很多核心思想和处理逻辑Android还是都保留了下来,只是在写作上做了更好的功能封装和逻辑分割。
接下来笔者就非常简略的说一下Android 9.0 的init进程。
2 Android 9.0 init 分析对于9.0的init笔者不想做过多的分析了,虽然相比于4.4在代码上确实做了很大的调整,但你仔细去阅读9.0的init代码时,可以发现很多功能都和原有代码十分相似,仅仅在功能上做了更好的分割和封装,代码流程看起来更加简洁清晰。
关于9.0 init进程的分析建议参考如下两篇博文:
Android 8.1 源码_启动篇(一) -- 深入研究 init(转 Android 9.0 分析)
Android 8.1 源码_启动篇(二) -- 深入研究 zygote(转 Android 9.0 分析)

3 Android 9.0 init的几点补充知识 3.1 rc初始化脚本文件有哪些?
对于这个问题,我们先看源码,在init的main()函数中:
http://androidxref.com/9.0.0_r3/xref/system/core/init/init.cpp#714

1 int main(int argc, char** argv) { 2... 3 4ActionManager& am = ActionManager::GetInstance(); 5ServiceList& sm = ServiceList::GetInstance(); 6 7LoadBootScripts(am, sm); ... 8 }

调用LoadBootScripts()来加载和解析init.rc文件,LoadBootScripts()函数的定义如下:
http://androidxref.com/9.0.0_r3/xref/system/core/init/init.cpp#110

1 static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_list) { 2Parser parser = CreateParser(action_manager, service_list); 3 4std::string bootscript = GetProperty("ro.boot.init_rc", ""); 5if (bootscript.empty()) { 6parser.ParseConfig("/init.rc"); 7if (!parser.ParseConfig("/system/etc/init")) { 8late_import_paths.emplace_back("/system/etc/init"); 9} 10if (!parser.ParseConfig("/product/etc/init")) { 11late_import_paths.emplace_back("/product/etc/init"); 12} 13if (!parser.ParseConfig("/odm/etc/init")) { 14late_import_paths.emplace_back("/odm/etc/init"); 15} 16if (!parser.ParseConfig("/vendor/etc/init")) { 17late_import_paths.emplace_back("/vendor/etc/init"); 18} 19} else { 20parser.ParseConfig(bootscript); 21} 22 }

分析:
1. 首先获取属性值"ro.boot.init_rc"的内容,如果有指定rc文件,则解析指定的文件;
2. 如果没有在"ro.boot.init_rc"指定要解析的rc文件,则首先解析"/init.rc",然后依次去解析"/system/etc/init" 、"/product/etc/init"、"/odm/etc/init"、"/vendor/etc/init" 目录下的所有rc 文件。
 
 
 
========
99999999
========

    推荐阅读