Android系统启动简单流程:
1、BootLoader启动
开机供电,硬件电路会产生一个确定的复位时序用于硬件启动顺序,直至最后CPU启动;CPU开始执行第一条指令,该指令所在的内存地址是固定的,这个固定内存地址保存的程序就是bootloader,常用的就是U-boot,其作用就是拉起操作系统,装载用户程序;
2、Linux系统启动
内核解压,Linux初始化各种软硬件环境,加载驱动程序,挂载根文件系统,执行init服务
3、init进程
init 进程是 Linux 系统中用户空间的第一个进程,进程号为1;init进程做两件事:挂载目录,解析init.rc
4、Zygote 进程
init 进程在解析init.rc脚本时创建Zygote进程,Zygote是Android系统所有应用的父进程,都是由Zygote进程Fork出来的
5、SystemServer进程
Zygote进程初始化完成后去启动SystemServer进程,SystemServer进程去启动framework的各种核心服务
6、“ACTION_BOOT_COMPLETED” 开机广播发出,系统启动完成
bootup fail问题分析:(以MTK平台为例)
抓取UART串口log,使用自带MTKLogger,同时抓取正常log对比;
根据关键字检索,查看是挂在开机启动那个阶段,哪行函数执行出错:
“lk finished --> jump to linux kernel”----表示lk完成,进入kernel
“Kernel_init_done”--------------------------表示kernel初始化完成
“init: init first stage started”----------------表示init进程正常起来执行
“fs_mgr” 和"e2fsck"-------------------------表示在检查和mount 文件系统
“zygote”----------------------------------------表示zygote进程启动
“system_server”-----------------------------表示system_server进程启动
“BOOT_Animation:END”------------------表示开机动画正常结束
“BOOTPROF”--------------------------------开机过程中,每一个重要阶段都会打印的标志
“1:init”-------------------------------------------init阶段重要log打印
开机动画对应的启动阶段:
1、Linux内核启动的静态画面,具体在kernel/drivers/video/fbmem.c
2、Init进程启动过程中出现的静态画面,具体在system/core/init/init.c
3、系统服务启动过程中出现的动态画面,实现是在init.rc里添加了一个bootAnimation的服务,启动的时机是在surfaceFlinger启动后,改变一个系统变量,执行开机动画,等launcher起来后,AMS通知surfaceFlinger改变变量值,开机动画退出