Android系统启动流程概览

概述

  1. 当手机电源按下时,引导芯片代码会从预定义的地方(固化在ROM)开始执行,加载引导程序BootLoader到RAM,然后执行BootLoader,引导操作系统启动
  2. BootLoader会启动swapper进程(又叫idle),pid是0,是系统的第一个进程
  3. 接下来,swapper会启动init进程(pid=1)、kthreadd进程(pid=2),以及各种驱动程序(Binder驱动,屏幕驱动等)
  4. init进程是用户空间的鼻祖,它会根据init.rc配置文件去创建对应的进程,例如ZygoteSurfaceFlinger
  5. 当SurfaceFlinger创建完成后,就有了开机画面
  6. Zygote是应用进程的鼻祖,所有的应用进程都是由Zygote进程fork出来的,Jvm虚拟机也是在Zygote中启动的,所以Zygote是贯穿native和Java层的存在
  7. Zygote启动完成后,首先会fork出SystemServer
  8. SystemServer将按照顺序启动一系列的系统服务,当所有服务都准备完毕,将通知AMS.systemReady,随后AMS会去启动桌面应用程序Launcher,随后用户就会看到桌面,到此,手机系统启动完毕

接下来就让我们细看一下每个关键进程都做了哪些事情

init进程

init进程处理的重要事情:
1. 创建和挂载 启动所需的文件目录
2. 设置selinux安全策略(权限相关)
3. 初始化和启动属性服务,注册到epoll中
4. 解析init.rc配置文件并根据配置执行任务(启动zygote、surfaceflinger等)

surfaceflinger启动后开始显示开机动画

  1. 进入循环(处理子进程的信号、检测和重启进程)

Zygote进程

Zygote native层的初始化

  • Zygote是由init进程通过解析init.zygote.rc文件而创建的,zygote所对应的可执行程序app_process,所对应的源文件是App_main.cpp,进程名为zygote。

  • App_main.cpp的main函数中会创建AppRuntime(安卓运行环境) 并调用其start函数

    runtime.start("com.android.internal.os.ZygoteInit",args,zygote);
    实际调用的是 AndroidRuntime.cpp 的 start()

start函数中主要做了如下操作:
  1. 创建java虚拟机(AndroidRuntime.cpp > startVm())
  2. 注册JNI(AndroidRuntime.cpp > startReg())
  3. 通过JNI调用com.android.internal.os.ZygoteInit.java > main(),进入到Zygote的java层

Zygote Java层的初始化

入口:ZygoteInit.java > main()
1. 创建ZygoteServer,ZygoteServer内部维护了一个socket,用于跨进程通讯,AMS就是通过ZygoteServer通知Zygote孵化app进程的
2. 预加载公共的系统资源(class、res),以供后续fork出来的App进程使用,提高App进程启动速度

  • preloadClasses:/system/etc/preloaded-classes
  • preloadResources:预加载资源,包含drawable和color资源。在应用程序中以com.android.internal.R.xxx开头的资源,便是此时由Zygote加载到内存的。
  1. 通过fork创建SystemServer进程
  2. 进入循环,监听AMS的消息

Zygote启动流程图

《Android系统启动流程概览》

SystemServer进程

SystemServer的启动

Zygote fork之后,SystemServer所在的进程会调用handleSystemServerProcess()来启动SystemServer的功能:

1.关闭父进程zygote复制而来的Socket
2. 开启Binder线程池(ZygoteInit.zygoteInit())
3. 通过反射调用入口函数,这里是SystemServer.main()

SystemServer的初始化

  1. Looper.prepareMainLooper();
  2. 加载android_servers.so库(System.loadLibrary("android_servers")

    该库包含的源码在frameworks/base/services/目录下

  3. 创建系统上下文 createSystemContext()(启动ActivityThread等)
    • system_server进程也是一个app,每个app都会对应一个Application对象(该对象 跟LoadedApk一一对应)。LoadedApk对象是APK文件在内存中的表示
    • SystemServer 对应的apk是:framework-res.apk
  4. 创建SystemServiceManager(mSystemServiceManager = new SystemServiceManager(mSystemContext);)

  5. 启动各种系统服务

    • startBootstrapServices(); 引导服务(AMS、PMS 等)
    • startCoreServices(); 核心服务
    • startOtherServices(); 其他服务(WMS、InputManager等)
    • AMS.systemReady()(里面会有启动桌面App的操作)

6.Looper.loop();

SystemServer启动流程图

《Android系统启动流程概览》

总结

《Android系统启动流程概览》