概述
- 当手机电源按下时,引导芯片代码会从预定义的地方(固化在ROM)开始执行,加载引导程序
BootLoader
到RAM,然后执行BootLoader,引导操作系统启动 - BootLoader会启动
swapper
进程(又叫idle),pid是0
,是系统的第一个进程 - 接下来,swapper会启动
init
进程(pid=1
)、kthreadd
进程(pid=2),以及各种驱动程序
(Binder驱动,屏幕驱动等) init进程是用户空间的鼻祖
,它会根据init.rc
配置文件去创建对应的进程,例如Zygote
、SurfaceFlinger
- 当SurfaceFlinger创建完成后,就有了开机画面
Zygote是应用进程的鼻祖
,所有的应用进程都是由Zygote进程fork出来的,Jvm虚拟机也是在Zygote中启动的,所以Zygote是贯穿native和Java层的存在- Zygote启动完成后,首先会fork出
SystemServer
- SystemServer将按照顺序启动一系列的系统服务,当所有服务都准备完毕,将通知
AMS.systemReady
,随后AMS会去启动桌面应用程序Launcher,随后用户就会看到桌面,到此,手机系统启动完毕
接下来就让我们细看一下每个关键进程都做了哪些事情
init进程
init进程处理的重要事情:
1. 创建和挂载 启动所需的文件目录
2. 设置selinux安全策略(权限相关)
3. 初始化和启动属性服务,注册到epoll中
4. 解析init.rc配置文件并根据配置执行任务(启动zygote、surfaceflinger等)
surfaceflinger启动后开始显示开机动画
- 进入循环(处理子进程的信号、检测和重启进程)
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函数中主要做了如下操作:
- 创建java虚拟机(
AndroidRuntime.cpp > startVm()
) - 注册JNI(
AndroidRuntime.cpp > startReg()
) - 通过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加载到内存的。
- 通过fork创建
SystemServer
进程 - 进入循环,监听AMS的消息
Zygote启动流程图
SystemServer进程
SystemServer的启动
Zygote fork之后,SystemServer所在的进程会调用handleSystemServerProcess()
来启动SystemServer的功能:
1.关闭父进程zygote复制而来的Socket
2. 开启Binder线程池(ZygoteInit.zygoteInit()
)
3. 通过反射调用入口函数,这里是SystemServer.main()
SystemServer的初始化
- Looper.prepareMainLooper();
- 加载android_servers.so库(
System.loadLibrary("android_servers")
)
该库包含的源码在frameworks/base/services/目录下
- 创建系统上下文
createSystemContext()
(启动ActivityThread等)
- system_server进程也是一个app,每个app都会对应一个Application对象(该对象 跟LoadedApk一一对应)。LoadedApk对象是APK文件在内存中的表示
- SystemServer 对应的apk是:
framework-res.apk
- 创建SystemServiceManager(
mSystemServiceManager = new SystemServiceManager(mSystemContext);
) -
启动各种系统服务
- startBootstrapServices(); 引导服务(AMS、PMS 等)
- startCoreServices(); 核心服务
- startOtherServices(); 其他服务(WMS、InputManager等)
- AMS.systemReady()(里面会有启动桌面App的操作)
6.Looper.loop();