App启动流程
Android系统开机启动流程
第一幅图是参考dennis-huang的Android N 的开机启动流程概述,后面两幅图是自己画的
首先,我们打开手机电源后,一般来说会启动固化在ROM中的第一行地址,这里一般是厂商定制boot程序,它主要负责拉起启动系统的第一个程序bootloader;
拉起后,BootLoader专门负责将Linux系统内核Kerne加载到内存运行,Kernel运行后创建的第一个进程就是init进程,之后所有的进程都是有init创建fork的;
init进程一般有一个init.rc配置文件,主要是启动的相关参数,如需要启动的服务zygote、servicemanager还有虚拟机等等,其他还有一些守护进程;servicemanager主要是binder服务端进程,会注册所有binder服务,而zygote则是要所有Android应用进程始祖类;
在zygote进程中,会启动一个localServerSocket服务,主要用于监听其他进程的服务请求,进而孵化出一个新的应用进程,与此同时,zygote中会创建许多系统所需要的服务,如AMS、PMS等各种服务,最后在启动我们的第一个App进程 – Launcher
Android分区
跟紧上面系统启动,补充分区说明
Android分区大致有以下几类:
- bootloader 分区
- recovery分区
- fastboot分区
- boot分区
- system分区
- data分区
- cache分区
- modem分区
bootloader分区
我们都知道开机后会执行ROM中的boot程序,也就会进去bootloader分区,整个BootLoader过程分两个阶段,primary bootloader和secondary stage bootloader;
primary bootloader主要是对我们的设备硬件进行检查
而secondary stage bootloader则是对设备硬件进行初始化,以及获取设备的信息如内存等;
进入第二个阶段前,会根据用户指令(如音量home组合键)决定进入recovery、fastboot或者正常的启动模式
fastboot
顾明思议,就是快速刷机启动的意思;它是一个快速刷机的协议,正常刷机会同时刷入所有的img镜像,而fastboot则可以快速刷入部分img,如:
adb reboot bootloader
fastboot flash boot boot.img
fastboot reboot
快速刷入boot.img,重启就能刷机成功
recovery分区
recovery是一种标准的刷机协议;recovery实质是一个小型的Linux系统,在BootLoader的第二个阶段直接会进去recovery分区,启动它,recovery模式可以清除数据,重新刷机等操作
boot分区
如果设备正常启动,会进去boot分区,这里会启动init进程,在init.rc中的配置文件是init进程的启动参数,需要做哪些事情,其中部分配置脚本会进入system分区;boot分区然后还会启动一个app_process的进程,它就是所有Android应用的孵化器进程Zygote
Zygote
Zygote和上面开机流程就有点联系了,Zygote还会创建一个SystemServer进程,SystemServer进程会启动系统的许多服务,如AMS PMS 等等;
System分区
system分区主要存放了系统的一些资源和核心应用;如system/lib app framework fonts media等信息
data分区
data分区主要存放用户下载的App以及一些App数据
Cache分区
用户下载的一些缓存资源信息
Modem分区
是手机通讯的分区,用于手机通信方面的分区
android源码编译后的镜像文件
boot.img 内核镜像文件,其一般包含ramdisk.img文件镜像,
ramdisk.img包含系统启动的重要init文件和init.rc配置文件
system.img也就是system目录的镜像文件,包含framework\lib\fonts\app等文件,最后会挂载到根目录下面
userdata.img对应的是用户数据镜像,包含用户安装的app以及用户的配置文件
recovery.img对应recovery相关的文件
cache.img缓存镜像用于存储系统或用户应用产生的临时数据
Application启动流程
Activity启动流程以及占坑式启动Activity原理
知识点更新
以上是Android老的non-A/B架构模式,自Android 10开始,支持动态分区,谷歌设计了A/B架构分区模式,分为A、B两个槽,系统可以运行在A槽,而当系统OTA升级时,默默在B槽上下载OTA包、然后升级,然后系统重启从B槽开始,用户对升级无感知,只会对重启感知;
A、B每个槽可能都会有自己system、vendor、boot分区,从而启动也不同;
动态分区在编译打包时,可能会将system、vendor等镜像包都会打到super.img包中,从而你会发现编译成功的img没有这些img
更多细节参考Android系统分区与升级