总结Android系统启动完整流程(六)
先总体来看一下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系统启动完整流程(六)相关推荐
- Android系统启动流程完整分析(四)
(1)ZygoteInit.main()函数 接下来进入ZygoteInit.main()函数,main()函数的主要作用就是启动SystemServer服务,并用socket监听. //framew ...
- Android系统完整的启动流程
Android系统完整的启动过程,从系统层次角度可分为 Linux 系统层.Android 系统服务层.Zygote进程模型三个阶段:从开机到启动 Home Launcher 完成具体的任务细节可分为 ...
- Android系统启动流程—— init进程zygote进程SystemServer进程启动流程
原文地址:https://blog.csdn.net/qq_30993595/article/details/82714409 Android系统启动流程 Android系统启动过程往细了说可以分为5 ...
- 从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程
Android系统启动流程 启动流程 Loader Kernel Native Framework Application init进程 启动 rc文件规则 Actions Commands Serv ...
- Android系统启动流程 -- bootloader
Android系统启动流程 -- bootloader BootLoader:在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系 ...
- 【Android 系统开发】 Android 系统启动流程简介
作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...
- Android系统启动流程分析之安装应用
2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295) (0) 举报 收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...
- 详解 Android 系统启动流程
系统启动流程大致分以下五步: Loader(加载引导程序Boot Loader) Kernel(Linux内核层) Native(init进程) Framework(Zygote进程/SystemSe ...
- Android 7.1.2(Android N) Android系统启动流程
Android 7.1.2(Android N) Android系统启动流程 源码: system/core/rootdir/ init.rc init.zygote64.rc system/core ...
最新文章
- C语言,统计0~9出现次数。_只愿与一人十指紧扣_新浪博客
- java threadgourp_Java Thread getThreadGroup()方法
- MySQL Query Log
- MyEclipse9.0正式版汉化
- 云端TensorFlow读取数据IO的高效方式
- 安卓 spinner下拉框 做模糊查询_如何用一张图来做全年/去年的部门离职率动态对比...
- mysql 高性能引擎_《高性能MySQL》笔记1-MySQL架构与引擎
- spring 面试题
- sql 查讯本日 本周 本月
- java web 润乾报表教程_润乾报表开发 基础教程.ppt
- cocos2d-x系列 Mac下配置cocos2d-x开发环境(android和ios)
- 通过百度获取IP地址对应的经纬度
- java 调用 easypr_Java程序执行Linux命令调用EasyPR程序识别车牌号
- 计算机核心期刊排名及投稿信息
- HDU5144 NPY and shot BestCoder Round #22 1003
- Unity3d 真实的植物渲染
- 用计算机KADIO算方差,KADIO_KD-82TL__计算器.ppt
- 小程序内嵌H5、H5回跳至小程序、小程序打开公众号中的文章
- 了解一下winsock
- 【C++基础系列】Vector容器