Android系统启动细分阶段:
Bootloader > 加载Kernel > Init进程解析init.rc文件 > Zygote启动 > SystemServer启动 > Launcher启动
Bootloader(Android系统中是uBoot):
设备通电后,会按照一定的顺序复位电路元器件,CPU是最后被复位的器件(若cpu先于I/O设备或内存,会导致CPU初始化失败)
CPU初始化后会从固定的地址取出指令去执行,这条指令就是BootLoader。BootLoader是Linux操作系统启动前执行的一段程序,它主要用于:
- 硬件设备初始化;
- 建立内存映射,将系统软硬件带到一个合适的状态;
- 加载操作系统内核;
加载Kernel
- 内核初始化;
- 加载驱动,通过LKM机制,包含Binder驱动;
- 启动Init进程。(idle(pid =0)swap,init进程(pid=1),KThreadd(pid=3));
Init进程:是用户空间的第一个进程,也是用户空间其他所有进程的祖先进程。
Init进程解析init.rc文件
Init进程初始化
解析init.rc文件
启动HAL层驱动:
启动了SM服务:
- open Binder驱动设置;
- 通过mmp建立内存映射;
- 通过ioctl告知binder驱动自己为守护进程;
- 进入循环等待;
启动Core服务:
- 启动surfaceflinger服务.(1:启动DisplayService;2:启动线程池;3:初始化surfaceflinger服务;4:surfaceflinger服务注册到ServiceManager;5:启动surfaceflinger服务线程;)
- 启动bootanim服务(bootanim服务属于非自启动服务,需要由surfaceflinger服务启动)
启动Zygote:
- 初始化AppRuntime,AppRuntime继承自AndroidRuntime;
- 根据不同的平台 ,解析不同的rc文件。(init.zygote32.rc、init.zygote32_64.rc、init.zygote64.rc、init.zygote64_32.rc)
- 启动Zygote;
init进程化身守护进程,处理子进程的死亡信号、修改属性的请求和组合键事件;
Zygote启动
AppRuntime的初始化调用的是AndroidRuntime的构造方法,此时会初始化 Skia图形系统(Android系统图形引擎即Android系统的基础图形库)
AppRuntime.start(实际调用的是AndroidRuntime.start)
- 创建启动虚拟机;
- 注册JNI;
- 调用JNI函数,从native层访问Framework层的ZygoteInit类的main方法;
ZygoteInit.main主要操作流程:1:创建Zyoget为Socket服务端;2:预加载资源和系统库;3:启动SystemServer;4:循环等待Socket接入,然后启动进程(fork出新进程,1:新进程创建Binder线程池,2:通过反射调用ActivityThread.main方法,最后Looper.loop);
SystemServer启动:
Zyoget通过fork的方式启动;(在native层设置了pid等信息并通过fork的方式启动)
SystemServer.main
- 初始化Looper为MainLooper;
- 创建SystemServerManager来管理Service(引导程序(bootstrap):AMS,ATMS,PMS,WMS... 核心服务:,其他服务:)
- 创建和启动Java服务
- 调用Looper.Loop(),循环处理消息;
PMS启动:
- 通过SystemServer调用startBootstrapServices启动,构建PMS实例并初始化;
- 扫描指定的目录,以获取apk包中AndroidMainFest.xml文件中的信息并将其存储在PMS实例中;
PMS的systemReady方法在SystemServer调用startOtherServices之后调用,并且在AMS的systemReady方法之前调用。
AMS启动:
- 通过SystemServer调用startBootstrapServices启动,LifeCycle(SystemServer子类)对象创建AMS,AMS在LifeCycle的构造函数中初始化,AMS在自己的构造函数中初始化了很多变量并且启动了一些服务;
- 将AMS纳入SystemServerManger管理;
- 最后AMS调用systemReady方法启动Launcher;
systemReady方法在SystemServer调用startOtherServices之后调用,等待其他的一些服务如PMS调用systemReady后,启动SystemUI以及Launcher进程。
AMS初始化完成在开机启动完成之后:
锁屏界面绘制完成之后,WMS会通知SurfaceFlinger关闭开机动画,随后WMS会通知AMS开机动画关闭,AMS通知系统开机完成。
Launcher启动:
- 启动SystemUI;(启动SystemUIService和锁屏服务),SystemUI启动完成后代表系统的导航栏和通知栏准备完毕;
- 启动Launcher的Activity并将其置于栈顶之后将其显示出来;
Activity的启动涉及到:
- Intent的解析
- Stack,Task的查询或创建
- Activity进程的创建
- Activity窗口的创建
- Activity的生命周期调度