8、Android 系统启动流程分析

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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容