Android Init进程分析番外篇:9.0的init进程 Android 8.1 源码_启动篇(一) -- 深入研究 init(转 Android 9.0 分析) Android 8.1 源码_启动篇(二) -- 深入研究 zygote(转 Android 9.0 分析)

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

========

猜你喜欢

转载自www.cnblogs.com/roger-yu/p/12228254.html
今日推荐