init进程
概述
init进程并非鼻祖进程, 真正的鼻祖是进程id为0的 swapper进程(idele进程).
init的进程(pid=1), 是Android用户空间所有进程的鼻祖, 还有一个兄弟进程kthread进程(pid=2), 是Android内核空间所有进程的鼻祖.
init会 fork/clone 多个子进程, vold\adbd\lmkd\logd\surfaceflinger\servicemanager\zygote(systemserver(AMS/WMS/PMS)/launcher/phone/camera)
surfaceflinger进程
1 2
| 作用是:把多个来源的图像数据,如需合成则进行合成 否则直接提交给display驱动进行显示
|
lmkd进程 Low Memory Killer Daemon
1 2
| 低内存杀手守护进程, 查杀进程的。会监控内存的使用情况,当达到一定阀值的时候,会去杀掉一些处于后台的、优先级低的、占用内存高的进程, 是一个守护进程,会在后台默默的为内存的健康保驾护航.
|
logd
servicemanager进程
1 2
| 为binder通信服务的,负责整个Android系统的binder通信 ,所以 需要提前启动
|
zygote进程
1 2
| init进程直接创建的子进程中唯一可以运行java代码的进程
|
进程启动
1 2 3 4 5 6 7 8 9 10 11
| 选用脚本语言定义创建子进程以及顺序,后缀.rc, 可定义子进程基础信息、触发条件、前置命令、创建命令,
需要用init脚本语言来配置创建子进程的步骤如下
1. 首先 子进程在以.rc的脚本文件中,使用service关键字来配置子进程相关的信息 2. 其次 在init.rc文件中(init.rc文件到底是在哪个目录这个是不确定的)使用import关键字引入脚本文件,使用on关键字来配置子进程的触发条件, 3. 触发条件配置完毕后,如若子进程在创建之前需要配置一些前置操作或命令,则基于触发条件下配置这些信息 4. 最后 使用start关键字来配置创建子进程的命令。
子进程的基础信息会被解析到Service实例中,所有的Service实例会存放到ServiceList对象中。触发条件和它包含的命令会被解析到Action实例中,所有的Action实例会存放到ActionManager对象中.
|
小计
1 2 3 4 5 6 7
| 子进程的善后都需要创建进程的处理,
1. 首先我先使用sigaction函数来注册SIGCHLD信号,这样就可以监听到子进程的状态了 2. 其次使用signalfd函数为SIGCHLD信号生成一个fd(文件描述符) 3. 再次使用epoll来见监听上一步生成的fd是否有可读数据 4. 如监听到fd上有可读数据,则证明子进程的状态发生了变化,还需要使用waitpid函数来获取是哪个子进程死掉了
|
servicemanager
zygote
systemserver进程
ActivityManagerService
WindowManagerService
PackageManagerService
surfaceflinger进程
四大组件
binder
handler
窗口
ui绘制
事件分发
类加载机制