Android系统启动流程

589 阅读3分钟

image.png

image.png

Android系统启动细分阶段:

Bootloader > 加载Kernel > Init进程解析init.rc文件 > Zygote启动 > SystemServer启动 > Launcher启动

Bootloader(Android系统中是uBoot):

设备通电后,会按照一定的顺序复位电路元器件,CPU是最后被复位的器件(若cpu先于I/O设备或内存,会导致CPU初始化失败)

CPU初始化后会从固定的地址取出指令去执行,这条指令就是BootLoader。BootLoader是Linux操作系统启动前执行的一段程序,它主要用于:

  1. 硬件设备初始化;
  2. 建立内存映射,将系统软硬件带到一个合适的状态;
  3. 加载操作系统内核;

加载Kernel

  1. 内核初始化;
  2. 加载驱动,通过LKM机制,包含Binder驱动;
  3. 启动Init进程。(idle(pid =0)swap,init进程(pid=1),KThreadd(pid=3));

Init进程:是用户空间的第一个进程,也是用户空间其他所有进程的祖先进程。

Init进程解析init.rc文件

Init进程初始化

解析init.rc文件

启动HAL层驱动:

启动了SM服务:

  1. open Binder驱动设置;
  2. 通过mmp建立内存映射;
  3. 通过ioctl告知binder驱动自己为守护进程;
  4. 进入循环等待;

启动Core服务:

  1. 启动surfaceflinger服务.(1:启动DisplayService;2:启动线程池;3:初始化surfaceflinger服务;4:surfaceflinger服务注册到ServiceManager;5:启动surfaceflinger服务线程;)
  2. 启动bootanim服务(bootanim服务属于非自启动服务,需要由surfaceflinger服务启动)

启动Zygote:

  1. 初始化AppRuntime,AppRuntime继承自AndroidRuntime;
  2. 根据不同的平台 ,解析不同的rc文件。(init.zygote32.rc、init.zygote32_64.rc、init.zygote64.rc、init.zygote64_32.rc)
  3. 启动Zygote;

init进程化身守护进程,处理子进程的死亡信号、修改属性的请求和组合键事件;

Zygote启动

AppRuntime的初始化调用的是AndroidRuntime的构造方法,此时会初始化 Skia图形系统(Android系统图形引擎即Android系统的基础图形库)

AppRuntime.start(实际调用的是AndroidRuntime.start)

  1. 创建启动虚拟机;
  2. 注册JNI;
  3. 调用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

  1. 初始化Looper为MainLooper;
  2. 创建SystemServerManager来管理Service(引导程序(bootstrap):AMS,ATMS,PMS,WMS... 核心服务:,其他服务:)
  3. 创建和启动Java服务
  4. 调用Looper.Loop(),循环处理消息;

PMS启动:

  1. 通过SystemServer调用startBootstrapServices启动,构建PMS实例并初始化;
  2. 扫描指定的目录,以获取apk包中AndroidMainFest.xml文件中的信息并将其存储在PMS实例中;

PMS的systemReady方法在SystemServer调用startOtherServices之后调用,并且在AMS的systemReady方法之前调用。

AMS启动:

  1. 通过SystemServer调用startBootstrapServices启动,LifeCycle(SystemServer子类)对象创建AMS,AMS在LifeCycle的构造函数中初始化,AMS在自己的构造函数中初始化了很多变量并且启动了一些服务;
  2. 将AMS纳入SystemServerManger管理;
  3. 最后AMS调用systemReady方法启动Launcher;

systemReady方法在SystemServer调用startOtherServices之后调用,等待其他的一些服务如PMS调用systemReady后,启动SystemUI以及Launcher进程。

AMS初始化完成在开机启动完成之后:

锁屏界面绘制完成之后,WMS会通知SurfaceFlinger关闭开机动画,随后WMS会通知AMS开机动画关闭,AMS通知系统开机完成。

Launcher启动:

  1. 启动SystemUI;(启动SystemUIService和锁屏服务),SystemUI启动完成后代表系统的导航栏和通知栏准备完毕;
  2. 启动Launcher的Activity并将其置于栈顶之后将其显示出来;

Activity的启动涉及到:

  • Intent的解析
  • Stack,Task的查询或创建
  • Activity进程的创建
  • Activity窗口的创建
  • Activity的生命周期调度