Android系统启动流程

Contents

1. 概念

Android系统启动流程(详细版)

1.1 loader层

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

引导程序是在Android操作系统开始运行前的一个小程序,是运行的第一个程序。因此,它是针对特定的主板与芯片的,可以使用redboot、uboot、qibootloader或者开发自己的引导程序。它不是Android操作系统的一部分,引导程序是OEM厂商或者运营商加锁和限制的地方。
分两个阶段执行:

  1. 检测外部的RAM以及加载对第二阶段有用的程序;
  2. 引导程序设置网络、内存等。为了达到特殊的目标,引导程序可以根据配置参数或者输入数据设置内核。

1.2 kernel

即Android内核层。
这里一般指开机刚结束进入Android系统,Kernel层的启动流程如下:

  1. 启动swapper进程(pid=0),这是系统初始化过程kernel创建的第一个进程,用于初始化进程管理、内存管理、加载Display、Camera、Binder等驱动相关工作;
  2. 启动kthreadd进程,这是Linux系统的内核进程,会创建内核工作线程kworkder、软中断线程ksoftirqd和thermal等内核守护进程,kthreadd是所有内核进程的鼻祖。

1.3 native层

主要包括有init进程孵化的用户空间的守护进程、bootanim开机动画和hal层等。
init进程:

  • Linux系统的守护进程,是所有用户空间进程的鼻祖。
  • Linux系统中用户空间的第一个进程,进程号固定为1
  • init进程会孵化出ueventd、logd、healthd、installd、adbd等用户守护进程
  • 启动ServiceManager(Binder服务管家)、bootanim(开机动画)等重要服务
  • init进程通过解析init.rc文件后fork生成zygote进程。Zygote进程是Android系统的第一个Java进程(虚拟机进程),zygote进程是所有Java进程的父进程。

1.4 framework层

1.4.1 Zygote

init进程通过解析init.rc文件后fork生成zygote进程。
Zygote进程主要包含:

  • 加载ZygoteInit类、注册Zygote Socket服务端套接字;
  • 加载虚拟机
  • PreloadClasses;
  • PreloadResources
  • fork出System Server进程,System Server是Zygote孵化的第一个进程,负责启动和管理整个Java framework,包含ActivityManager、PowerManager等服务;

1.4.2 Media Server

Media Server进程负责启动和管理整个C++ framework,包含AudioFlinger、Camera Service等服务。

1.5 APP

  • Zygote进程孵化出的第一个App进程Launcher,这是用户看到的桌面App
  • Zygote进程还会创建Browser、Phone、Email等App进程,每个App至少运行在一个进程上
  • 所有的App进程都是由Zygote进程fork生成的。

2. Android系统启动流程

Android启动流程

2.1 硬件上电

这个阶段通常是由硬件本身的引导程序来完成的。这个引导程序通常是写死在芯片中(ROM)不依赖于操作系统
作用

  • 自检: 电源通电后,控制权首先交给BIOS(或UEFI)固件。BIOS/UEFI负责进行自检POST,Power-On Self-Test),确保各个硬件(CPU、内存、存储等)处于正常状态。如果自检发现问题,系统可能会发出蜂鸣声或在屏幕上显示错误信息。
  • 启动2.2 Boot ROM硬件初始化

2.2 Boot ROM硬件初始化[[uboot启动流程]]

在 POST 通过后,设备将进入到引导程序(bootloader)之前的准备阶段。
硬件中固化的一段代码,通常储存在ROM中。提供一个最基本的启动环境,它负责启动整个设备,但它本身并不负责操作系统的具体启动。
作用

  • 初始化硬件:一些基础硬件(如CPU、内存控制器、I/O 等)的初始化
  • 寻找2.3 引导程序Bootloader:ROM代码会寻找合适的引导程序位置(比如从eMMC、UFS、SD卡、网络等设备加载)。如果存在多重引导程序,它会决定哪个引导程序应该被加载。

2.3 引导程序Bootloader

android系统启动的第一个小程序,储存在ROM中。设备上电,CPU开始执行ROM中的bootloader代码。
流程

  1. 阶段一(汇编代码,裸机环境)
    • 设置 CPU 的「异常处理机制」(比如断电、按键中断时如何响应)。
    • 给 CPU 「超频」或「降频」,设置合适的运行频率。
    • 初始化内存控制器,让 CPU 能正确读写内存。
  2. 阶段二(C 语言代码,初步软件环境)
    • 激活闪存(Flash),让系统能读取存储的数据。
    • 加载 Android 内核Kernel)和「根文件系统」(包含系统核心文件)到内存。
    • 给内核准备启动参数(如内存大小硬件型号),然后唤醒内核开始运行
      常见工具:安卓设备中常用的 U-Boot 就是一种功能强大的 Bootloader,支持多种芯片架构。

2.4 kernel内核

  1. 阶段一(汇编代码) :
    • 检查内核是否支持当前硬件(如高通芯片用高通的驱动,联发科用联发科的)。
    • 从「汇编语言环境」切换到「C 语言环境」,为后续代码铺路。
    • 创建 0 号进程(swapper),这是内核的「祖宗进程」,负责后续核心模块初始化。
  2. 阶段二(C 语言代码,0 号进程主导):
    • 启动 内存管理(分配应用内存)、进程管理(调度 App 运行)、文件系统(读写存储)等核心模块。
    • 加载各类硬件驱动(如屏幕WiFi摄像头),让硬件能被系统识别
    • 找到并启动 init 进程(用户空间的第一个进程,进程号 1),至此内核任务基本完成,系统进入用户空间。

内核就像「管家」,管理硬件资源,为上层应用提供运行基础,但不直接和用户交互

2.5 init进程

内核会启动第一个用户空间进程 init(PID=1)。它是所有其他用户进程的父进程。

  1. 挂载虚拟文件系统:
    • 创建并挂载  /sys(硬件信息)、/dev(设备驱动)、/proc(进程信息)等系统目录,方便后续程序读取硬件和进程数据。
  2. 启动基础服务:
    • 开启 property 服务(存储系统属性,如屏幕亮度语言设置)。
    • 激活 SELinux(安全机制,防止恶意程序越权访问)。
  3. 解析执行 init.rc 文件
    通过 init.rc 脚本定义的规则,启动一系列守护进程(后台服务)。Android有多个init.rc文件,主要有init.rc特定于设备的init.xxx.rc文件
    • servicemanager:管理系统服务(如打电话、发短信的服务)。
    • mediaserver处理音频、视频播放
    • zygote:最重要的进程之一,负责「孵化」应用进程。

2.6 zygote进程

负责启动所有的Android应用程序,为每个应用程序创建新的进程。

  1. 初始化 Java 环境:
    • 加载 Android Runtime(ART) (Java 虚拟机,负责运行 Java/Kotlin 代码)。
    • 执行 ZygoteInit 类的 main 函数,进入 Java 代码逻辑。
  2. 预加载资源,加速应用启动
    • 在启动时提前加载 Android Framework 类库(如 Activity、TextView 等基础组件)和 系统资源(图片、字体、颜色值)到内存。
    • 当需要启动 App 时,Zygote 直接复制自己(fork 进程),子进程会共享这些预加载的资源,避免重复加载,让 App 启动更快。
  3. 启动 SystemServer 和监听请求
    • 先启动 2.7 SystemServer进程(系统服务的「大管家」)。
    • 开启一个 Socket 服务监听应用启动请求。当收到请求时,立即 fork 出新的进程(即 App 进程)。

2.7 SystemServer进程

负责启动和管理Android系统的关键服务。

  1. 启动核心服务:如 ActivityManagerService(负责管理应用程序的生命周期)、WindowManagerService(负责屏幕显示窗口布局)、PackageManagerService(负责应用的安装、卸载、权限校验)、其他服务(电池管理、网络管理、通知服务等)。
  2. 启动服务的管理:一旦这些服务启动,Android系统就进入了常规的服务管理阶段开始响应用户的输入、展示界面等。

2.8 启动桌面程序

当所有系统服务都已启动并正常运行后,用户将看到桌面界面Launcher应用),并能够启动其他应用

  • 启动Launcher:Launcher应用会显示设备的主屏幕,并管理应用的启动
  • 应用启动:当用户点击一个应用时,ActivityManager会处理启动请求,并根据需要创建一个新的进程来运行应用

3. 参考

posted @ 2025-07-23 11:13  伍壹丷  阅读(45)  评论(0)    收藏  举报