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系统分区与升级

posted @ 2017-07-31 16:52  帅气好男人_jack  阅读(15)  评论(0编辑  收藏  举报  来源