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进程

作用是:把多个来源的图像数据,如需合成则进行合成 否则直接提交给display驱动进行显示

lmkd进程 Low Memory Killer Daemon

低内存杀手守护进程, 查杀进程的。会监控内存的使用情况,当达到一定阀值的时候,会去杀掉一些处于后台的、优先级低的、占用内存高的进程, 是一个守护进程,会在后台默默的为内存的健康保驾护航.

logd

log功能

servicemanager进程

为binder通信服务的,负责整个Android系统的binder通信 ,所以 需要提前启动

zygote进程

init进程直接创建的子进程中唯一可以运行java代码的进程

进程启动

选用脚本语言定义创建子进程以及顺序,后缀.rc, 可定义子进程基础信息、触发条件、前置命令、创建命令,

需要用init脚本语言来配置创建子进程的步骤如下

1. 首先 子进程在以.rc的脚本文件中,使用service关键字来配置子进程相关的信息
2. 其次 在init.rc文件中(init.rc文件到底是在哪个目录这个是不确定的)使用import关键字引入脚本文件,使用on关键字来配置子进程的触发条件,
3. 触发条件配置完毕后,如若子进程在创建之前需要配置一些前置操作或命令,则基于触发条件下配置这些信息
4. 最后 使用start关键字来配置创建子进程的命令。

子进程的基础信息会被解析到Service实例中,所有的Service实例会存放到ServiceList对象中。触发条件和它包含的命令会被解析到Action实例中,所有的Action实例会存放到ActionManager对象中.

小计

子进程的善后都需要创建进程的处理,

1. 首先我先使用sigaction函数来注册SIGCHLD信号,这样就可以监听到子进程的状态了
2. 其次使用signalfd函数为SIGCHLD信号生成一个fd(文件描述符)
3. 再次使用epoll来见监听上一步生成的fd是否有可读数据
4. 如监听到fd上有可读数据,则证明子进程的状态发生了变化,还需要使用waitpid函数来获取是哪个子进程死掉了

servicemanager

zygote

systemserver进程

ActivityManagerService

WindowManagerService

InputManagerService

PackageManagerService

surfaceflinger进程

四大组件

binder

handler

窗口

ui绘制

事件分发

类加载机制