先总体来看一下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}.rcon early-init...mkdir /dev/memcg 0700 root systemmkdir /dev/memcg/apps/ 0755 system systemmkdir /dev/memcg/system 0550 system systemstart ueventdon init...mkdir /dev/stunemkdir /mnt/runtime 0700 root rooton property:sys.boot_from_charger_mode=1class_stop chargertrigger late-initon load_persist_props_actionload_persist_propsstart logdstart logd-reinit//启动系统核心服务
on late-inittrigger early-fstrigger fstrigger post-fstrigger late-fstrigger post-fs-datatrigger zygote-starttrigger load_persist_props_actiontrigger firmware_mounts_completetrigger early-boottrigger booton post-fsstart logdstart servicemanagerstart hwservicemanagerstart vndservicemanageron late-fsclass_start early_halon zygote-start && property:ro.crypto.state=unencryptedexec_start update_verifier_nonencryptedstart netdstart zygotestart zygote_secondaryon zygote-start && property:ro.crypto.state=unsupportedexec_start update_verifier_nonencryptedstart netdstart zygotestart zygote_secondaryon zygote-start && property:ro.crypto.state=encrypted && property:ro.crypto.type=fileexec_start update_verifier_nonencryptedstart netdstart zygotestart zygote_secondary//boot阶段会启动class为hal和core的服务
on bootclass_start halclass_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系统启动完整流程(六)相关推荐

  1. Android系统启动流程完整分析(四)

    (1)ZygoteInit.main()函数 接下来进入ZygoteInit.main()函数,main()函数的主要作用就是启动SystemServer服务,并用socket监听. //framew ...

  2. Android系统完整的启动流程

    Android系统完整的启动过程,从系统层次角度可分为 Linux 系统层.Android 系统服务层.Zygote进程模型三个阶段:从开机到启动 Home Launcher 完成具体的任务细节可分为 ...

  3. Android系统启动流程—— init进程zygote进程SystemServer进程启动流程

    原文地址:https://blog.csdn.net/qq_30993595/article/details/82714409 Android系统启动流程 Android系统启动过程往细了说可以分为5 ...

  4. 从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程

    Android系统启动流程 启动流程 Loader Kernel Native Framework Application init进程 启动 rc文件规则 Actions Commands Serv ...

  5. Android系统启动流程 -- bootloader

    Android系统启动流程 -- bootloader   BootLoader:在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系 ...

  6. 【Android 系统开发】 Android 系统启动流程简介

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...

  7. Android系统启动流程分析之安装应用

    2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295)  (0)  举报  收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...

  8. 详解 Android 系统启动流程

    系统启动流程大致分以下五步: Loader(加载引导程序Boot Loader) Kernel(Linux内核层) Native(init进程) Framework(Zygote进程/SystemSe ...

  9. Android 7.1.2(Android N) Android系统启动流程

    Android 7.1.2(Android N) Android系统启动流程 源码: system/core/rootdir/ init.rc init.zygote64.rc system/core ...

最新文章

  1. C语言,统计0~9出现次数。_只愿与一人十指紧扣_新浪博客
  2. java threadgourp_Java Thread getThreadGroup()方法
  3. MySQL Query Log
  4. MyEclipse9.0正式版汉化
  5. 云端TensorFlow读取数据IO的高效方式
  6. 安卓 spinner下拉框 做模糊查询_如何用一张图来做全年/去年的部门离职率动态对比...
  7. mysql 高性能引擎_《高性能MySQL》笔记1-MySQL架构与引擎
  8. spring 面试题
  9. sql 查讯本日 本周 本月
  10. java web 润乾报表教程_润乾报表开发 基础教程.ppt
  11. cocos2d-x系列 Mac下配置cocos2d-x开发环境(android和ios)
  12. 通过百度获取IP地址对应的经纬度
  13. java 调用 easypr_Java程序执行Linux命令调用EasyPR程序识别车牌号
  14. 计算机核心期刊排名及投稿信息
  15. HDU5144 NPY and shot BestCoder Round #22 1003
  16. Unity3d 真实的植物渲染
  17. 用计算机KADIO算方差,KADIO_KD-82TL__计算器.ppt
  18. 小程序内嵌H5、H5回跳至小程序、小程序打开公众号中的文章
  19. 了解一下winsock
  20. 【C++基础系列】Vector容器

热门文章

  1. Shell 千分 逗号隔开
  2. Mysql分页Limt
  3. pip install 后面加个点是什么意思?
  4. oracle让电脑变卡以及解决方法
  5. Windows 10配置CUDA 9.2
  6. 初等证明:费马商的加法分配律证明
  7. 字符串要求字母、数字、特殊字符,至少有两项。正则表达式不好写,可以用这个方法实现。
  8. java sapi_使用Microsoft SAPI进行语音合成
  9. 《论韩愈 》——陈寅恪
  10. wepy(minUI)框架学习