从上图我们可以清楚的看到Android系统的启动分为以下几个步骤
-
启动电源以及启动系统
当我们按下电源键时, 引导芯片代码开始从预定义的地方(固化在ROM)开始执行, 加载引导程序到RAM, 然后执行
-
引导程序
引导程序是在Android操作系统开始运行前的一个小程序. 引导程序是运行的第一个程序, 因此它是针对特性的主板和芯片的. 设备制造商要么使用很受欢迎的引导程序比如redboot, uboot, qi bootloader或者开发自己的引导程序, 在此注意一下, 引导程序并不是Android操作系统的一部分. 引导程序是OEM厂商或运营商加锁和限制的地方.
引导程序分为两个阶段执行.
第一: 检查外部的RAM以及加载对第二阶段有用的程序
第二: 引导程序设置网络, 内存等等. 这些对于运行内核是有必要的. 为了达到特殊的目标, 引导程序可以根据配置参数或者输入数据设置内核.
传统得加载器主要是2个文件:
/external/arm-trusted-firmware/lib/romlib/init.s
这个主要是初始化堆栈, 清零BSS段, 调用main.c的_main()函数
/external/rootdev/main.c
初始化硬件(闹钟,主板,键盘, 控制台等), 创建Linux标签
-
内核
Android内核与桌面Linux内核的启动方式差不多, 内核启动时, 设置缓存 被保护的存储器 计划列表 加载驱动. 当内核完成系统设置时, 它首先在系统文件中寻找"init"文件, 然后启动root进程或者系统的第一个进程(据我之前的了解这个进程叫idle进程, pid=0, 如有记错的话请大家指出)
-
init进程
init进程是Linux系统中用户空间的第一个进程, 进程号固定为1. Kernel启动后, 在用户空间启动init进程, 并调用init中的main()方法执行init进程的职责
-
启动Launcher App
init进程分析
init进程是Android系统中及其重要的用户空间的第一个进程. 接下来我们看看init进程做了些什么事情.
-
创建和挂载启动所需要的目录文件
-
初始化和启动属性服务
-
解析init.rc配置文件并启动Zygote进程
比较重要的两个文件
/system/core/init/init.cpp
/system/core/rootdir/init.rc
在这里init.cpp里面干了啥我们就不去详细解析了, 有兴趣得同学自己去研究
init.rc解析
init.rc是什么? 它是一个非常重要的配置文件, 由android初始化语言(Android Init Language)编写的脚本, 它里面包含了Action, Service, Command, Options. 这里就不过多讲解, 有兴趣了解的同学自己google