linux 中一切皆文件,
开机的时候走的流程
1、 开机boot 会调用kernel,然后执行一个 init(pid=1) 的方法,在这个方法里面会通过 Android 的 Zygote (孵化器)开启一些列的 服务
SystemServer AMS WMS PKMS PMS 等等 , 然后开启 launcher
2、开启 media server
补充细节
1、init(pid=1)会执行 init.c 中的 main 方法, 主要会初始化一些属性
2、解析 init.rc 文件,开启 binder 和 socket 服务
3、启动 Zygote 进程
4、zygote中会启动不同的服务
总结: init 方法就是 为了 启动app,开机等做一些前提准备和配置
launcher 启动 app
1、从 zygote 中 fork(复刻) 一个 子进程 来作为要启动的 app 的进程
2、如果开机,就启动 zygote ,如果启动 app ,就是 fork 。两种都会使用runtime 来启动JVM、socket 之类的
3、如果是启动 app 。需要创建虚拟机,创建线程,创建自己的zygote,加载资源(字体,recource,openGL,class类等),主动进行一次GC,fork一次SystemServer进程(在这里面启动AMS,WMS 等各种服务)
补充细节
1、fork 函数 的作用是创建一个 子进程 ,所以他会返回两次结果,
一次=0,表示接下来进入子进程 执行流程 。
不等于 0 表示 接下来要继续执行 父进程 代码
2、fork 是复制整个空间数据的一种行为,
如果父进程有不在执行的线程,则不执行的线程直接不复制,直接蒸发掉,有可能有 死锁的 问题
3、也就是说启动一个 app 就fork 一个 zygote