本篇以从按下开机键开始至设备桌面图标出现进行分析。
Boot ROM
设备通电后,硬件自检,确保各个硬件组件(CPU、内存、存储设备等)处于正常工作状态。
这个阶段过程通常是由硬件自身的引导程序完成的。
这个引导程序通常是写死在芯片里(ROM),不依赖操作系统。
Bootloader
长按开机键,设备通电,从Boot ROM开始,Boot ROM是芯片上的一段只读存储器,存储设备的启动代码,一般是固定的,用于检测基本硬件的存在,验证 Bootloader 的完整性和安全性,并加载BootLoader到RAM,将控制权移交给BootLoader。
BootLoader对硬件进行基本初始化,从存储设备中读取Android系统Linux内核镜像,通常是boot.img文件,将内核加载到内存中,并将控制权移交给内核。
Linux内核启动
内核启动后会完成复杂的硬件初始化并挂载根文件系统,然后执行第一个用户空间进程init
,将控制权移交给init
。
init进程
init
是Android的第一个用户空间进程,它的PID为1。init
解析init.rc
脚本文件,定义系统初始化的行为等。
启动Zygote进程,Zygote
在init.rc
文件中定义并通过init
启动。
init
调用/system/bin/app_process
可执行文件启动 ART(Android Runtime)或 Dalvik 虚拟机,并执行 ZygoteInit.main()
来启动Zygote
。
init
把控制权移交给了Zygote
。
Zygote进程
Zygote 是 Android 应用运行时环境的核心,加载虚拟机、类、系统资源,启动SystemServer进程。SystemServer进程是Zygote进程孵化的第一个进程。
Zygote的任务
等待应用启动请求,接收请求后,fork() 创建子进程,所有的App进程都是由Zygote孵化而来的。
SystemServer
SystemServer是一个很重要的进程,系统里面重要的服务都是在这个进程里面开启的,比如ActivityManagerService、PackageManagerService、WindowManagerService,负责管理应用程序和系统资源。
Launcher
当 SystemServer
启动完成后,Android 系统会启动第一个前台进程:Launcher。
ActivityManagerService
会根据 AndroidManifest.xml
中的配置,启动标记为 MAIN
和 LAUNCHER
的应用,Launcher 加载桌面布局和图标资源。
Launcher进程是Zygote孵化出来的第一个App进程。