一、框架图

二、简略流程

上电->启动BootROM->加载bootloader到RAM->。。。

三、基本流程

一、Bootloader阶段(从硬件到加载内核)

技术栈:芯片固件、引导加载程序、设备树

  1. BootROM (芯片内部ROM)
    • 原理:这是芯片上电后执行的第一段不可更改的代码,固化在CPU内部。它根据预定义的引脚电平(如音量键)确定启动模式(正常启动/Recovery/Download)。
    • 技术:读取eMMC/UFS的预定义地址(如 0x0),加载主Bootloader(如U-Boot)到内部SRAM并执行。
  2. 主Bootloader (如U-Boot, Little Kernel)
    • 流程
      a. 初始化:初始化更复杂的硬件,如DDR内存、存储控制器、显示控制器。
      b. 加载:从存储的特定分区(如 boot)加载 boot.img 到内存。boot.img 包含内核与初始内存盘。
      c. 验证:验证内核签名(如果设备已解锁)。在A/B设备上,还会决定从哪个Slot(A或B)启动。
      d. 跳转:将CPU控制权交给内核,并传递设备树信息。
    • ROM开发关注点boot.img的打包格式、kernel cmdline参数、设备树的编译与包含。

二、内核与早期用户空间阶段(建立运行环境)

技术栈:Linux内核、Init进程、设备树

  1. 内核启动
    • 流程:内核解压并初始化自身,解析Bootloader传递的设备树来识别硬件,初始化CPU调度、内存管理、驱动框架。
    • 关键动作:加载驱动模块,并挂载由boot.img中的ramdisk 构成的初始根文件系统(rootfs)。
    • 技术ramdisk是一个临时的、内存中的根文件系统,包含启动所必需的最小文件,如init程序、驱动模块和fstab文件。
  2. 第一阶段 Init (first_stage_init)
    • 流程:内核启动的第一个用户空间进程就是 init。它首先执行first_stage_init
    • 核心任务
      a. 挂载早期分区:解析 ramdisk 中的 /fstab.<device>,挂载 systemvendor 等分区到 /system_root/vendor
      b. 准备环境:为切换到下一阶段做准备。
    • ROM开发关注点device/目录下的fstab文件是设备挂载的蓝图,定义了分区、文件系统、挂载点。

三、系统服务启动阶段(软件世界的构建)

技术栈:Binder、Zygote、SystemServer、SELinux

  1. 第二阶段 Init (second_stage_main)

    • 流程:切换根目录到/system,并执行 /system/bin/init
    • 核心任务
      a. 初始化关键目录:创建并设置 /dev/proc/sys 等目录权限。
      b. 初始化属性服务:启动 property service,这是系统全局配置中心。
      c. 加载 SELinux 策略:进入安全增强模式。
      d. 解析并执行 init.rc 脚本:这是启动所有系统服务的总剧本
  2. Zygote 进程孵化

    • 原理init.rc 中会启动 zygote 服务(对应 /system/bin/app_process)。Zygote 是 “孵化器” ,它预加载了Android框架的类库和资源。当需要启动新App时,Zygote通过fork自身来快速创建新进程,极大节省内存和启动时间。
    • 流程:Zygote启动后,会 forksystem_server 进程。
  3. SystemServer 启动(核心)

    • 流程system_server 是Android系统服务的“大管家”,它在 run 方法中逐步启动所有核心服务。

    • 关键服务启动顺序与原理

      服务 缩写 启动时机/依赖 核心作用
      ActivityManagerService AMS 较早启动 应用生命周期、四大组件调度的中枢
      PackageManagerService PMS 依赖Installer 应用安装、解析、权限管理
      WindowManagerService WMS 依赖DisplayManager 窗口管理、Surface分配、输入事件派发
      DisplayManagerService DMS 较早启动 显示设备管理
      InputManagerService IMS 依赖WMS 输入设备管理、事件流处理
    • 技术:这些服务大多通过Binder IPC机制向应用提供能力。Binder驱动在内核启动时已加载,此时SystemServer会将自己注册为Binder上下文管理者

四、应用层启动(Launcher出现)

技术栈:ActivityManager、应用进程模型

  1. 启动HOME Activity
    • 流程:当核心服务就绪后,AMS会查找 Intent.CATEGORY_HOME 的Activity。它通过PMS查询所有已安装应用,找到默认Launcher(如 com.google.android.apps.nexuslauncher)。
    • 进程创建:AMS请求Zygote fork 出Launcher应用进程。
    • Activity启动:在新进程中,AMS指导Launcher完成Activity的创建、onCreate生命周期,并最终调用WMS为其创建窗口和Surface。
  2. Launcher渲染界面
    • 流程:Launcher加载布局,从PMS查询所有已安装应用,显示图标。WMS将Launcher的Surface与SurfaceFlinger合成,最终输出到屏幕。
分类: 基础

0 条评论

发表回复

您的电子邮箱地址不会被公开。