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

========

原文地址:https://www.cnblogs.com/roger-yu/p/12228254.html

时间: 2024-10-23 16:46:52

Android Init进程分析番外篇:9.0的init进程的相关文章

Monkey源码分析番外篇之Android注入事件的三种方法比较

原文:http://www.pocketmagic.net/2012/04/injecting-events-programatically-on-android/#.VEoIoIuUcaV 往下分析monkey事件注入源码之前先了解下在android系统下事件注入的方式,翻译一篇国外文章如下. Method 1: Using internal APIs 方法1:使用内部APIs This approach has its risks, like it is always with intern

Android好奇宝宝_番外篇_看脸的世界_05

上一篇番外篇讲了一个炒鸡炒鸡简单的自定义ProgressBar,这一篇基于上一篇的基础扩展为SeekBar,没看过上一篇的,请先看一遍:传送门 先上效果图(2G内存的机子运行模拟器,所以有点卡): 这个效果之前不知道在哪里看到过,我也忘了. 下面进入正题: 测量大小和绘制部分沿用上一篇ProgressBar的,不清楚的请走上面的传送门. 对比上一篇的扩展: (1)SeekBar能通过触摸改变刻度 (2)SeekBar上方添加一个显示当前刻度的浮动View(后面用FloatView表示) (1)通

Monkey源码分析番外篇之WindowManager注入事件如何跳出进程间安全限制

在分析monkey源码的时候有些背景知识没有搞清楚,比如在看到monkey是使用windowmanager的injectKeyEvent方法注入事件的时候,心里就打了个疙瘩,这种方式不是只能在当前应用中注入事件吗?Google了下发现了国外一个大牛有留下蛛丝马迹描述这个问题,特意摘录下来并做相应部分的翻译,其他部分大家喜欢就看下,我就不翻译了. How it works Behind the scenes, Monkey uses several private interfaces to co

Monkey源代码分析番外篇WindowManager如何出的喷射事件的进程间的安全限制

在分析monkey源代码时的一些背景知识不明确,例如看到monkey它是用windowmanager的injectKeyEvent的喷射事件时的方法.我发现自己陷入疙瘩,这种方法不仅能够在当前的应用程序,注入的事件它?Google在国外找到下一个大牛离开的问题的叙述性说明痕迹,特意摘录下来并做对应部分的翻译,其它部分大家喜欢就看下.我就不翻译了. How it works Behind the scenes, Monkey uses several private interfaces to c

Android好奇宝宝_番外篇_看脸的世界_06

简单实现波纹效果 其实这一篇的效果实现很简单,写这篇博客重点是为了说另一件事,剧透一下:有关内存泄露的. 先说下效果的实现: 原理: 原理只有一个,就是Shader的使用.Shader我看别人翻译成着色器,其实它的作用就是为画笔增加颜色的渐变,画笔默认是一个颜色画到底,但是使用Shader可以实现从一个颜色渐变到另一个颜色. 想了解更多关于Shader的姿势,推荐博客:传送门 有了Shader,就能很简单的画出波纹的效果了,至于动画效果,只是动态改变画的大小而已. 高清源码: (1)初始化 重写

Android好奇宝宝_番外篇_看脸的世界_02

一个有吃豆人删除动画的ListView 这是一个无聊的效果,由一个无聊的程序猿,在无聊的情况下写的. 虽然这效果不中看中用,不过就当学习了. 先上图 效果一目了然,主要是: (1)移除item时执行吃豆人动画 (2)滚动时吃豆人也相应移动 (3)应对可见与不可见状态间的切换 简单原理分析: (1)吃豆人.豆.和左边的白色矩形(当然所有颜色都是可以改的,你想换成图片也行)都是用canvas画出来的. (2)问:canvas那里来的?答:ListView的canvas.具体是重写ListView的这

Android好奇宝宝_番外篇_看脸的世界_04

这一篇是记录一下本猿自定义View的一般思路,通过一个炒鸡简单的自定义ProgressBar讲解一些自定义View的基础知识.适合新手,高手勿喷,有好的指点和想法的欢迎评论. (1)确认需求 写一个自定义View,首先你要确定需求是什么.一般包括外观,事件处理,动画效果. 外观需求:ProgressBar的外观需求非常简单,就是两个矩形(当然也可以是其它形状,这里我们只实现基础的矩形)重叠显示.其中一个固定大小的当背景,一个可变宽度的来显示刻度. 事件处理:ProgressBar不是SeekBa

Android好奇宝宝_番外篇_看脸的世界_08

废话少说,先上效果图: (左侧的图片是我用window画图软件1分钟画的,所以就不要嫌丑了,You can you up no bb.) 这是我发过最挫的效果图了,不过这是由于没有图片素材导致的,就不要在意这些细节了,知道实现原理后完全可以发挥你的想象去实现更美观的效果. 这个效果也是有开源库的,不过我又把名字给忘了,不过我记得原理,于是就试着自己写了一下. 其实原理很简单,我在另一篇博客(一个有吃豆人删除动画的ListView)也说过了,这一篇当做兑换那些年少轻狂不更事时许下的诺言(是不是瞬间

Mosquitto搭建Android推送服务番外篇一:各种报错解决

文章钢要: 目前笔者在开发搭建Mosquitto服务器,在此期间遇到很多实际问题,所以走了很多弯路,在这里写出来为大家提供一些帮助. 1.安装完成后启动Mosquitto报错 执行mosquitto客户端程序时出现找不到动态库:libmosquitto.so.1 ./mosquitto_sub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file