Init进程启动 —>Zygote进程启动 —>SystemServer进程启动 —>Launcher启动
Init 进程启动
- BootROM
电源按下时,执行固化代码(ROM),将 BootLoader 加载到 RAM。 - BootLoader
将 Linux 内核加载到内存并启动。 - Linux Kernel
完成缓存、驱动、根文件系统等初始化
然后在用户空间启动第一个进程init。 - init 进程
- 创建和挂载启动所需的文件目录,
例如 /dev 设备节点, /proc 进程信息等虚拟文件系统。 - 初始化和启动属性服务
一种全局键值对配置机制,可以看做Windows的注册表,记录用户、软件的一些使用信息,即使系统、软件重启,也能够根据记录进行相应的初始化。 - 解析Init.rc配置文件,并启动Zygote进程
- 创建和挂载启动所需的文件目录,
Zygote 进程启动
1. init 启动 Zygote
- Android 启动过程中,
init会解析init.rc配置文件 - 在启动脚本里会定义
zygote服务: 找到service zygote配置节,执行对应的可执行文件:/system/bin/app_process并传入特定的参数-Xzygote /system/bin --zygote --start-system-server init根据这个配置 forkZygote
2. app_process 进入 ZygoteInit (native层)
zygote服务对应的可执行入口通常是app_process对应app_main文件app_process的main()函数中:- 创建AndroidRuntime实例,调用
start()方法:- 启动 Dalvik / ART 虚拟机。
- 注册 JNI 函数(
register_jni_procs)。 - 通过 JNI 调用
ZygoteInit.java的main()方法(由Java语言编写,之前为C/C++),从Native层进入Java框架层。
- 创建AndroidRuntime实例,调用
3. Zygote 初始化(Java 层)
ZygoteInit.main()核心工作:- 注册 Zygote 的 Socket 服务端(
/dev/socket/zygote),用于接收 AMS 的 fork 请求。 - 预加载系统资源(耗时但一次完成,所有子进程共享):
- 预加载类(
preloadClasses,读取preloaded-classes文件) - 预加载资源(
preloadResources,framework-res.apk) - 预加载 OpenGL、WebView、系统库等。
- 预加载类(
- 启动SystemServer:通过
forkSystemServer()创建子进程,运行系统核心服务(如 AMS、PMS)。
- 注册 Zygote 的 Socket 服务端(
4. 进入循环监听(ZygoteInit.main())
- 完成上述工作后,
Zygote调用runSelectLoop(),进入无限循环。 - 通过 Socket 监听 AMS 发来的 fork 请求,为后续应用进程的创建做好准备。
- 调用
Zygote.forkAndSpecialize()克隆自身,然后在新进程中执行目标应用的main()方法(如ActivityThread.main())。
SystemServer 进程启动
1. 进程创建:Zygote 中 forkSystemServer()
- ZygoteInit 在完成预加载后,通过
forkSystemServer()创建子进程。(底层是fork()) - 子进程初始化:
- 关闭Zygote进程继承的
Socket - 调用
handleSystemServerProcess():- 启动 Binder 线程池
- 进入SystemServer的main方法
- 关闭Zygote进程继承的
2. 入口函数:SystemServer.main()
- 首先设置当前进程名:
Process.setArgV0("system_server")。 - 配置环境:准备系统时间、语言、设置虚拟机低内存阈值、加载 动态库
libandroid_servers.so。 - 创建
SystemServiceManager:对系统服务进行创建、启动和生命周期管理
启动系统服务,分为三个类别:
在
run()中先启动引导服务startBootstrapServices()(这些服务之间依赖较少,启动较早):Installer:系统安装APK时的服务类,完成之后才能启动其他服务- 启动
ActivityManagerService、PowerManagerService、PackageManagerService等服务。
启动核心服务
startCoreServices():BatteryService电池管理服务、WebViewUpdateService等。
启动其他服务
startOtherServices():- 如输入法、定位管理等服务
- 最后调用
AMS.systemReady(),完成:- 启动
Launcher
- 启动
3. 进入消息循环
- 最后调用
Looper.loop()进入消息循环,持续处理系统级 Binder 调用和内部消息。
Launcher 启动
系统启动的最后一步是启动一个应用程序用来显示系统中已经安装的应用程序,这个应用程序就叫做Launcher
两个功能:
- 作为 Android 系统的启动器,用于启动应用程序
- 作为 Android 系统的桌面,用于显示和管理应用程序的快捷图标或者其他桌面组件
- 触发:
SystemServer在startOtherServices()方法最后调用AMS.systemReady(),标志着系统核心服务已就绪,开始启动用户可见界面。 - 构建 Intent:
AMS.systemReady()内部执行startHomeOnAllDisplays(),创建隐式 Intent(ACTION_MAIN+CATEGORY_HOME),从PackageManagerService查询匹配的 Launcher 组件。 - 创建进程:AMS 向 Zygote 发送 fork 请求,Zygote fork出 Launcher 子进程,并调用
ActivityThread.main()初始化主线程,最终执行Launcher的onCreate()加载桌面布局。。 - 界面加载:Launcher的
Activity完成布局渲染后,用户可见桌面图标及小部件,系统启动流程至此完成
从Init进程到Launcher启动:
init进程→Zygote进程→forkSystemServer→SystemServer.main()→startBootstrapServices()(启动AMS、PMS等)→startOtherServices()→AMS.systemReady()→startHomeActivityLocked()→ 构建CATEGORY_HOME Intent → Zygote fork Launcher进程 → Launcher.onCreate()加载应用列表并显示桌面。