Android 系统启动流程

未命名文件 (3).png

首先是init 进程启动,init 进程是Android 系统用户空间中启动的第一个进程,启动之后加载配置文件,init.rc文件中存放的主要就是一些可执行程序路径的参数;负责启动zygote进程和其他系统服务进程
启动进程:
1、fork + handle
2、fork + execve 清空了父进程继承过来的环境

zegote进程启动之后执行了execve 调用,调用加载了一个可执行程序,所以zygote 进程虽然是init 进程启动的,但是没有继承init 进程的属性
1、创建虚拟机
2、注册关键的JNI接口
3、切换到java 调用
4、preload 资源
5、启动systemserver 进程
6、Loop处理消息,有请求过来,执行runOnce 函数,
1)读取参数列表,ams 跨进程发送过来的
2)fork 一个子进程
3)在子进程中执行ActivityThread main 函数
zygote是多线程的,但fork 时候会停了其他所有进程,fork 完成之后再重新启动;
zygote 进程跨进程通信机制是socket,并不是binder,binder 机制是system server 的

SystemServer启动
startSystenServer方法中创建SystemServer 进程,之后首先会初始化一些通用环境,然后开启binder 机制,启动binder线程池,然后调用applicationInit,applicationInit中其实主要执行了SeystemServer 的main方法,main方法中执行了SeystemServer的run 方法,在run 方法中首先
1、调用prepareMainlooper
2、然后加载系统lib 库
3、然后创建上下文,
4、启动系统服务,包含ams、pms、pkms 等,ams 启动完成之后就会启动launcher,启动之后回去加载应用列表到桌面显示
5、Looper.Loop

你可能感兴趣的:(Android 系统启动流程)