1 前言
在之前的几篇文章中,我们基于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 4 ActionManager& am = ActionManager::GetInstance(); 5 ServiceList& sm = ServiceList::GetInstance(); 6 7 LoadBootScripts(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) { 2 Parser parser = CreateParser(action_manager, service_list); 3 4 std::string bootscript = GetProperty("ro.boot.init_rc", ""); 5 if (bootscript.empty()) { 6 parser.ParseConfig("/init.rc"); 7 if (!parser.ParseConfig("/system/etc/init")) { 8 late_import_paths.emplace_back("/system/etc/init"); 9 } 10 if (!parser.ParseConfig("/product/etc/init")) { 11 late_import_paths.emplace_back("/product/etc/init"); 12 } 13 if (!parser.ParseConfig("/odm/etc/init")) { 14 late_import_paths.emplace_back("/odm/etc/init"); 15 } 16 if (!parser.ParseConfig("/vendor/etc/init")) { 17 late_import_paths.emplace_back("/vendor/etc/init"); 18 } 19 } else { 20 parser.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
========
原文地址:https://www.cnblogs.com/roger-yu/p/12228254.html