Android 系统启动流程图
init 进程
“init 进程” 是 Android系统中用户空间的第一个进程。“init 进程” 是Linux内核启动后,在用户空间启动的“系统级别”的进程。之后所有的新进程,不管是系统进程,还是用户进程都是由该进程Fock出来并启动的。源码位于 system/core/init 中。
“init 进程” 的主要作用为 Fork 并启动 “Zygote” 进程和 “ServiceManager”进程。
“ServiceManager” 进程 会启动 Binder服务管理器,用来管理所有binder 。使得 AMS、WMS、PMS等系统服务可以进行注册和获取。注册后便可以获取使用 “Binder” 进行跨进程通信。SystemService进程 和 AMS通信 或 其他进程。
Binder 是把 运行在用户空间的 Client 、Service、ServiceManager 和 运行在内核空间的 Binder 驱动程序 连接起来,实现跨进程通信。 Binder 驱动程序是核心, ServiceManager提供了辅助管理的功能(open、ioctl操作,管理和提供查询service接口), Client 、Service是在它们两个基础上的通信方,是我们自己需要实现的。
Zygote 进程
zygote 的源码位于 system/core/ rootdir 中; zygote 是通过Fork自身来创建子进程的。子进程拥有父进程的所有资源。
zygote 作用:
- 初始化 共享库、资源库、预置类库等。
- 创建JVM虚拟机示例。
- 注册 JNI ,准备调用Java 层 Main函数
- 预加载资源。
- 创建 Socket 服务端,用来进行 socket 跨进程通信的。AMS 与 Zygote 进程通信。
- 创建并启动 SystemService 系统服务进程。
SystemService 系统服务
SystemService 会初始化系统所需的所有服务和资源。
- 启动Binder线程池。
- 创建主线程 MainLooper。
- 创建系统 Context 上下文。
- 创建 SystemServiceManger 对象, 负责系统 Service 的启动。
- 启动其他服务。
- 最后启动 looper。
启动其他服务
该过程会分为三个步骤完成:
startBootstrapService()
名称 | 服务 |
---|---|
Activity管理服务 | ActivityManagerService |
电源管理服务 | PowerManagerService |
灯光服务 | LightsService |
显示服务 | DisplayManagerService |
包管理服务 | PackageManagerService |
用户服务 | UserManagerService |
传感器服务 | SensorService |
startCoreService()
名称 | 服务 |
---|---|
统计电池电量服务 | BatteryService |
使用统计服务 | UsageStatsService |
webView 服务 | WebViewUpdateService |
startOthreSevice() 该方法中启动的服务比较多,只列举个别服务:
名称 | 服务 |
---|---|
电信加载服务 | TelecomLoaderService |
相机服务 | CameraService |
闹铃服务 | AlarmManagerService |
输入服务 | InputManagerService |
window管理服务 | WindowManagerService 并传递给 AMS |
UI管理服务 | UiModeManagerService |
网络管理服务 | NetworkManagementService 、NetworkScoreService 、NetworkStatsService 、NetworkPolicyManagerService |
通知服务 | NotificationManager |
音频服务 | AudioService |
桌面服务 | LauncherAppsService |
而 AMS 会启动 Launcher 桌面,至此,系统已完整启动显示出来。