Android系统的启动流程简介
此篇文章简要介绍android系统的启动流程。即从按下电源到启动系统桌面的过程。目的是让大家对android系统的启动过程有个简单的认识。
开启电源
说起android系统的启动,第一步肯定是开启电源。
那开启电源后发生了什么事呢?
开启电源后,首先引导芯片代码从预定义的地方(ROM)开始执行,将BootLoader引导程序加载到RAM中,然后执行引导程序。此处引导程序的作用就是拉起来并运行Linux内核。
启动Linux内核
当linux内核启动时会完成一些系统设置,比如设置缓存、加载驱动等。然后就会启动系统的第一个进程,即init进程。
启动init进程
init进程是系统的第一个进程。它在启动的过程中做了很多的事情。比如:
1、创建和挂载了启动所需的文件目录。这些文件目录只有在系统运行的过程中才存在。当系统停止运行后,这些文件目录会被移除。
2、初始化和启动了属性服务。此处的属性服务类似于window的注册表。用来记录一些用户和软件的使用信息,以便于在系统或软件重启后进行一些相应的初始化工作。
3、启动了Zygote进程(进程孵化器)
启动Zygote进程
从上一步中我们知道在init进程中启动了Zygote进程。Zygote进程也被称为进程孵化器。因为后续系统的进程都是通过fock它来创建的。
而在Zygote进程的启动过程中也做了很多的事情,如下:
1、创建了Java虚拟机并为java虚拟机注册了JNI方法。此处之所以需要注册JNI是因为需要调用java框架层的Zygote方法。而此前我们的代码逻辑都是在native中。
2、创建了一个Server端的socket。用来监听AMS的请求。即等待AMS请求创建新的应用程序进程。(实现位于java框架层的Zygote代码中)
3、启动了SystemServer进程。(实现位于java框架层的Zygote代码中)
启动SystemServer进程
上面刚刚说过后续系统的进程都会通过fock Zygote进程来创建。SystemServer进程正是如此创建。
从上面的内容中我们可以知道Zygote在java框架层中启动了SystemServer进程。
而SystemServer进程又做了哪些事呢。
首先SystemServer在native中启动了Binder线程池,用于与其他的进程进行通信。
其次通过创建SystemServiceManager,使用SystemServiceManager间接启动了其他的系统服务。系统服务主要分为三种类型:引导服务、核心服务、其他服务。
部分系统服务如下:
引导服务 | 作用 |
---|---|
Installer | 系统安装apk时的一个服务类,启动完成Installer服务之后才能启动其他的系统服务 |
ActivityManagerService | 负责四大组件的启动、切换、调度 |
PowerManagerService | 计算系统中和power相关的计算,并决策系统应该如何反应 |
LightsService | 管理和显示背光LED |
DisplayManagerService | 用来管理所有显示设备 |
UserManagerService | 多用户模式管理 |
SensorService | 为系统提供各种传感器服务 |
PackageManagerService | 用来对apk进行安装、解析、删除、卸载等操作 |
… | … |
核心服务 | 作用 |
---|---|
DropBoxManagerService | 用来生成和管理系统运行时的一些日志文件 |
BatteryService | 管理电池相关的服务 |
UsageStatsService | 收集用户使用每个app的频率及时长 |
WebViewUpdateService | WebView更新服务 |
其他服务 | 作用 |
---|---|
CameraService | 摄像头相关服务 |
AlarmManagerService | 全局定时器管理服务 |
WindowManagerService | 窗口管理服务 |
NotificationManagerService | 通知管理服务 |
LocationManagerService | 定位管理服务 |
… | … |
启动Launcher应用程序(桌面)
上面说过SystemServer进程在启动过程中会启动其他的系统服务,其中就包括PackageManagerService服务。而PackageManagerService服务在启动后会将系统中的应用程序(预置应用)安装完成。这里就包括了Launcher应用程序。这时候在此前已经启动的ActivityManagerService服务就会将Launcher应用程序启动起来。
以上就是从按下电源到启动系统桌面(Launcher)的过程。