1.启动电源以及系统启动
当电源被启动时,引导芯片载入了预定义的引导程序(固化在ROM中),并将引导程序BootLoader加载到RAM中开始执行。
2.引导程序BootLoader
BootLoader是一个小程序,其主要作用是初始化基本的硬件设备,准备内核运行环境。 或者引导进入recovery模式
aml平台解析misc分区启动recovery逻辑
3.Linux内核启动
Android的boot.img 一般打包了kernel镜像和根文件系统ramdisk。 内核会加载启动各个驱动,装载根文件系统,并启动init进程。boot.img包含kernel 和ramdisk。
ramdisk文件结构,或者可以直接查看设备根目录
4.init进程启动
init进程是系统启动时的第一个用户空间进程。有一些重要工作:
创建和挂载启动所需的文件目录:
在系统启动过程中,init进程首先会创建和挂载所需的文件目录,这些目录包括根目录、/proc、/sys等,以确保系统能够正常运行和提供所需的资源和环境。
初始化和启动属性服务:
Android系统中的属性服务用于存储系统的属性信息,这些信息可以用于配置系统的行为和特性。init进程在启动时会初始化并启动属性服务,这确保了系统能够根据需要正确配置自身,并提供正确的服务。
解析init.rc配置文件并启动Zygote进程:
init进程会解析init.rc配置文件,该文件描述了系统在启动时需要进行的各种操作,包括启动系统服务、挂载文件系统等。其中,init.rc文件中的一项重要任务是启动Zygote进程。Zygote进程是Android系统中的一个重要进程,是所有应用程序的起点,任何新应用程序的进程都是由Zygote进程来孵化和启动的。
遍历解析rc
通过触发器启动各个阶段服务进程
zygote服务配置启动
启动其它守护进程: adb, vold, ServiceManager等
5.Zygote进程启动
Zygote进程是Android系统的关键进程,负责fork出应用进程,是所有应用进程的父进程。Zygote初始化时,会创建java虚拟机(dalvik/art)并为其注册JNI方法,预装载系统的资源文件和java类。所有fork出来的进程将继承和共享这些预加载资源。创建服务器端Socket以便接收请求,并启动SystemServer进程。
创建java虚拟机
注册jni方法
创建服务端socket
预加载资源
启动SystemServer进程
6.SystemServer进程启动
SystemServer是Zygote fork出来的第一个进程,负责启动并管理系统的各项核心binder服务。包括但不限于包管理器(PackageManagerService)、窗口管理器(WindowManagerService)、通知管理器(NotificationManagerService)、ActivityManagerService 等。
7.Launcher启动
SystemServer 加载完所有java服务后,最后会调用ActivityManagerService 的SystemReady(),发出 Intent “android.intent.category.HOME”,响应这个Intent的apk会运行起来,一般是默认的Launcher应用响应。