Android启动流程源码分析(基于Android S)

本文详细介绍了Android S系统的启动过程,从电源启动到内核加载,再到init进程启动,重点分析了init.rc配置文件解析及Zygote进程的孵化。Zygote作为Android系统中孵化进程的关键,负责启动Java应用程序和服务,其启动避免了多线程环境下fork可能导致的死锁问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从上图我们可以清楚的看到Android系统的启动分为以下几个步骤

  1. 启动电源以及启动系统

当我们按下电源键时, 引导芯片代码开始从预定义的地方(固化在ROM)开始执行, 加载引导程序到RAM, 然后执行

  1. 引导程序

引导程序是在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标签

  1. 内核

Android内核与桌面Linux内核的启动方式差不多, 内核启动时, 设置缓存 被保护的存储器 计划列表 加载驱动. 当内核完成系统设置时, 它首先在系统文件中寻找"init"文件, 然后启动root进程或者系统的第一个进程(据我之前的了解这个进程叫idle进程, pid=0, 如有记错的话请大家指出)

  1. init进程

init进程是Linux系统中用户空间的第一个进程, 进程号固定为1. Kernel启动后, 在用户空间启动init进程, 并调用init中的main()方法执行init进程的职责

  1. 启动Launcher App

init进程分析

init进程是Android系统中及其重要的用户空间的第一个进程. 接下来我们看看init进程做了些什么事情.

  1. 创建和挂载启动所需要的目录文件

  2. 初始化和启动属性服务

  3. 解析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

Zygote

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值