先总体来看一下Android系统启动的完整流程图:
(1)内核启动
- Android设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片上ROM会寻找Bootloader代码,并加载到内存。
- Bootloader开始执行,首先负责完成硬件的初始化,然后找到Linux内核代码,并加载到内存。
- Linux内核开始启动,初始化各种软硬件环境,加载驱动程序,挂载根文件系统,并执行init程序,由此开启Android的世界。
(2)init启动
当Linux内核启动之后,运行的第一个进程是init,这是个守护进程,确切的说,它是Linux系统中用户控件的第一个进程,所以它的进程号是1。
Linux Kernel启动后,会调用/system/core/init/Init.cpp的main()方法,进而解析init.rc文件(system/core/rootdir/init.rc)。
在init.cpp中,启动init.rc各个阶段的顺序是early_init > init > late_init,在late_init中又会去触发其他阶段的启动,所以各个阶段在init中启动的顺序如下:
early_init > init > late_init > early-fs > fs > post-fs > late_fs > post-fs-data > zygote-start > early-boot > boot
import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /init.usb.configfs.rc
import /init.${ro.zygote}.rc
on early-init
...
mkdir /dev/memcg 0700 root system
mkdir /dev/memcg/apps/ 0755 system system
mkdir /dev/memcg/system 0550 system system
start ueventd
on init
...
mkdir /dev/stune
mkdir /mnt/runtime 0700 root root
on property:sys.boot_from_charger_mode=1
class_stop charger
trigger late-init
on load_persist_props_action
load_persist_props
start logd
start logd-reinit
//启动系统核心服务
on late-init
trigger early-fs
trigger fs
trigger post-fs
trigger late-fs
trigger post-fs-data
trigger zygote-start
trigger load_persist_props_action
trigger firmware_mounts_complete
trigger early-boot
trigger boot
on post-fs
start logd
start servicemanager
start hwservicemanager
start vndservicemanager
on late-fs
class_start early_hal
on zygote-start && property:ro.crypto.state=unencrypted
exec_start update_verifier_nonencrypted
start netd
start zygote
start zygote_secondary
on zygote-start && property:ro.crypto.state=unsupported
exec_start update_verifier_nonencrypted
start netd
start zygote
start zygote_secondary
on zygote-start && property:ro.crypto.state=encrypted && property:ro.crypto.type=file
exec_start update_verifier_nonencrypted
start netd
start zygote
start zygote_secondary
//boot阶段会启动class为hal和core的服务
on boot
class_start hal
class_start core
在这个阶段你可以在设备的屏幕上看到 “Android” logo 了(即为bootanimation),接下来启动zygote进程,init 进程就会进入 loop 状态。
(3)Zygote进程
Zygote进程(frameworks/base/cmds/app_process/app_main.cpp)孵化了所有的 Android 应用进程,是 Android Framework的基础,该进程的启动也标志着Framework框架初始化启动的开始。
主要进行如下事宜:
- 注册底层功能的JNI函数到虚拟机并启动虚拟机,即调用startVm函数
- 预加载系统类和资源(preload)
- fork 并启动 system_server 核心进程
- 作为守护进程监听处理“孵化新进程”的请求
(4)SystemServer进程启动
system_server进程由Zygote进程fork而来,接下来看下system_server启动过程。
ZygoteInit.main()
->registerServerSocketFromEnv()
->preload()
->ZygoteInit.forkSystemServer()
->Zygote.forkSystemServer()
->nativeForkSystemServer()
->handleSystemServerProcess()
->ZygoteInit.zygoteInit()
->RuntimeInit.applicationInit()
->findStaticMain()
->new MethodAndArgsCaller(m, argv)//forkSystemServer的返回值(implements Runnable)
->r.run()//执行SystemServer main函数
->runSelectLoop()
//r.run()
SystemServer.main()
//先初始化SystemServer对象,并调用其run()方法。
SystemServer.run()
//启动各种服务
(5)SystemServer进程
system_server 进程启动后将初始化系统Context(设置主题),创建系统服务管理 SystemServiceManager,然后启动各种系统服务。
- 调整时间,如果系统时间比1970还要早,调整到1970年
- 初始化Looper为mainLooper
- 装载库libandroid_server.so,该库包含的源码在 frameworks/base/services/ 目录下
- 初始化系统Context
- 创建SystemServiceManager负责系统Service启动
- 启动各种服务
- 调用Looper.loop(),进入处理消息的循环
startBootstrapServices(); // 启动引导服务
//启动服务 ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。
startCoreServices(); // 启动核心服务
//启动服务 BatteryService 用于统计电池电量,需要 LightService。
//启动服务 UsageStatsService,用于统计应用使用情况。
//启动服务 WebViewUpdateService。
startOtherServices(); // 启动其他服务
//启动服务 InputManagerService,WindowManagerService,StatusBarManagerService
//等待 ServiceManager,SurfaceFlinger启动完成,然后显示启动界面。
//准备好 window, power, package, display activity服务:
// - WindowManagerService.systemReady()
// - PowerManagerService.systemReady()
// - PackageManagerService.systemReady()
// - DisplayManagerService.systemReady()
// - ActivityManagerService.systemReady()
所有的服务启动完成后会注册到 ServiceManager。
AMS服务启动完成后,会进入ActivityManagerService.systemReady(),然后启动 SystemUI,WebViewFactory,Watchdog,最后启动桌面 Launcher App。
启动桌面Launcher App,首先会通过 Zygote进程 fork一个新进程作为 App 进程,然后创建Application,创建启动Activity,最后用户才会看到桌面。
(6)启动流程总结
概述:Loader > Kernel > Native > Framework > Application
细分:BootRom > Bootloader > Kernel > Init > Zygote > SystemServer > Launcher
- Loader层主要包括Boot Rom和Boot Loader
- Kernel层主要是Android内核层
- Native层主要是包括init进程以及其fork出来的用户空间的守护进程、HAL层、开机动画等
- Framework层主要是AMS和PMS等Service的初始化
- Application层主要指SystemUI、Launcher的启动