先总体来看一下Android系统启动的完整流程图:

Android tv init 指定开机启动app android init启动流程_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的启动

Android tv init 指定开机启动app android init启动流程_Android启动_02


Android tv init 指定开机启动app android init启动流程_启动流程_03