• Android Init进程分析番外篇:9.0的init进程


    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

    ========

  • 相关阅读:
    图像压缩算法
    Haar-like特征来龙去脉
    Haar-like特征来龙去脉
    DSP VLIB实验
    DSP VLIB实验
    “主宰世界”的10种算法短评
    “主宰世界”的10种算法短评
    matlab截取图像
    matlab截取图像
    matlab求取积分
  • 原文地址:https://www.cnblogs.com/roger-yu/p/12228254.html
Copyright © 2020-2023  润新知