Skip to content

系统启动流程

1. 完整启动链

┌──────────────────────────────────────────────────────────────┐
│ 1. BootROM (固化在 Silicon)                                    │
│    → 验证 Bootloader 签名 → 跳转到 Bootloader                   │
├──────────────────────────────────────────────────────────────┤
│ 2. Bootloader (HiSilicon Fastboot / U-Boot)                   │
│    → 初始化 RAM/CPU/时钟 → 加载 Kernel → 跳转到 Kernel          │
├──────────────────────────────────────────────────────────────┤
│ 3. HongMeng Kernel                                            │
│    → 硬件初始化 → 内存管理 → 进程调度 → 挂载根文件系统            │
│    → 启动 Init 进程 (PID=1)                                    │
├──────────────────────────────────────────────────────────────┤
│ 4. Init 进程                                                   │
│    → 解析 init.hrc 配置 → 启动系统服务 → 启动 Zygote            │
├──────────────────────────────────────────────────────────────┤
│ 5. Zygote 进程                                                 │
│    → 预加载核心库 → 创建 Socket 监听 → fork 应用进程             │
├──────────────────────────────────────────────────────────────┤
│ 6. SystemServer (系统集成服务)                                  │
│    → 启动 AMS/WMS/PMS 等核心服务 → 系统就绪                     │
├──────────────────────────────────────────────────────────────┤
│ 7. 桌面 Launcher 启动                                           │
│    → 用户可操作界面                                            │
└──────────────────────────────────────────────────────────────┘

2. 各阶段详解

2.1 BootROM(固化的代码,不可修改)

BootROM 职责:
├── 从 ROM 固定地址读取 Bootloader 镜像
├── RSA/ECC 签名验证(防篡改)
├── 初始化基础时钟
└── 设置栈指针和入口地址,跳转到 Bootloader

安全启动链(Chain of Trust):每一级代码都验证下一级的签名,任何一环验证失败则终止启动。

2.2 Bootloader

bash
# 鸿蒙 Bootloader 初始化步骤
1. CPU 初始化(MMU/TLB/Cache)
2. DDR 初始化(RAM 测试与配置)
3. 外设初始化(UART/RTC/WDT)
4. 安全启动验证
5. 加载 Kernel 镜像到内存
6. 传递 Device Tree / HCS 参数
7. 跳转到 Kernel 入口

2.3 Kernel 启动

c
// Kernel 启动关键阶段
1. start_kernel()
   ├── setup_arch()        — 架构初始化
   ├── mm_init()           — 内存管理初始化
   ├── sched_init()        — 调度器初始化
   ├── init_IRQ()          — 中断初始化
   └── rest_init()         — 启动 Init 进程

2. fork() 创建 PID=1 的 Init 进程
3. Init 进程执行 /etc/init/init.hrc 配置
4. Kernel 等待 Init 完成根文件系统挂载
5. 系统进入多任务模式

Kernel 启动时间优化

  • 启用压缩内核(kernel 镜像压缩 40-50%)
  • 异步初始化:非关键驱动延迟初始化
  • 预分配内存池:减少启动时动态分配

2.4 Init 进程(PID=1)

Init 进程的职责:
├── 解析 init.hrc(HarmonyOS Runtime Config)配置文件
├── 启动系统守护进程(daemons)
├── 挂载文件系统分区
├── 创建 Zygote 进程
├── 处理子进程退出信号(SIGCHLD)
└── 维持系统核心服务运行

init.hrc 配置示例

hcs
// /etc/init/init.hrc 配置
service zygote "/system/bin/zygote" {
  capability = CAP_SYS_ADMIN
  oneshot = false
  critical = true
  respawn = true
  env = "ANDROID_ROOT=/system"
  env = "HOS_RUNTIME=/system/lib"
}

service system_server "/system/bin/system_server" {
  class = main
  depends = zygote
  critical = true
}

与 Android Init 对比

维度Android Init鸿蒙 Init
配置文件init.rc(脚本语言)init.hrc(HCS 结构化配置)
语法Shell-like 脚本配置即数据(数据驱动)
服务管理按 class/trigger 分组按依赖图拓扑排序启动
日志logcathilog
安全上下文SELinuxATM + SELinux

2.5 Zygote 进程

Zygote 启动流程:
├── 1. 加载基础运行库(libark、libhilog 等)
├── 2. 初始化 ArkTS 运行时环境
├── 3. 预加载常用类(Text/Image/Button 等)
├── 4. 创建 Socket 监听(/dev/socket/zygote)
├── 5. 等待 AMS 通过 Socket 发送 fork 请求
└── 6. fork() 创建应用进程(减少冷启动时间 500ms+)
arkts
// Zygote fork 应用进程的流程
// 1. AppProcessPool 向 Zygote 发送 fork 请求
// 2. Zygote fork() 子进程
// 3. 子进程初始化 ArkTS Runtime
// 4. 子进程启动 Application
// 5. 子进程启动 UIAbility

// 进程启动代码
import { app } from '@kit.AbilityKit';

// 通过 AppRuntime 启动应用
async function launchAbility(want: app.Want): Promise<number> {
  const result = await app.getApplicationContext().startAbility(want);
  return result;
}

Zygote 预加载内容

类别内容
运行时ArkTS Runtime、GC 初始化、线程池
系统库libarkui.so、libhilog.so、libace.so
UI 组件所有内置组件的 ArkTS 类加载
资源框架ResourceManager、Color/Font 缓存
网络库http/socket 模块初始化

2.6 SystemServer

SystemServer 启动的服务(部分):
├── AMS (Ability Management Service)     — 管理 Ability 生命周期
├── WMS (Window Management Service)       — 窗口管理
├── PMS (Package Management Service)      — 包管理
├── IMS (Input Manager Service)            — 输入事件分发
├── NMS (Notification Management Service)  — 通知管理
├── KMS (Keymaster Service)               — 密钥管理
├── DMS (Device Manager Service)           — 设备管理
├── BMS (Battery Management Service)       — 电池管理
├── HWS (Hardware Sensor Service)          — 传感器服务
└── DAS (Distributed Ability Service)      — 分布式能力

SystemServer 启动阶段

Phase 1: Core Services
  → 启动核心系统服务(AMS, WMS, PMS)

Phase 2: System Services
  → 启动辅助系统服务(IMS, NMS, BMS)

Phase 3: Startup Complete
  → 触发 onBootCompleted 回调
  → 启动 Launcher
  → 系统进入可交互状态

3. 启动时间分析

3.1 冷启动 vs 热启动

阶段冷启动热启动优化目标
BootROM~100ms-不可优化
Bootloader~500ms-不可优化
Kernel~1000ms-压缩内核/异步初始化
Init~200ms-精简启动服务
Zygote~3000ms-预加载优化
App onCreate~500-2000ms~100ms延迟初始化/懒加载
首屏 build~200-1000ms-首屏内容裁剪
总计~5000-8000ms~200-300ms< 3s(应用市场要求)

3.2 启动优化策略

arkts
// 1. Application onCreate 优化:延迟非关键初始化
@Entry
@Component
struct MyApp {
  @State isLoading: boolean = false;

  aboutToAppear() {
    // 延迟非关键初始化(300ms 后执行)
    setTimeout(() => {
      initNonCriticalServices();
    }, 300);
  }

  // 2. 使用 Ability 的 onWindowStageCreate 延迟加载
  //    避免在 onCreate 中做 UI 相关的初始化
}

// 3. 预编译优化:使用 HAR/HSP 预加载常用模块
// 4. 首屏精简:首屏 build 只渲染必要内容
// 5. 懒加载:非首屏组件使用 LazyForEach 按需加载

4. 启动关键路径优化

优化手段                  效果
─────────────────────────────────────────────
预加载常用组件库        减少 Zygote fork 时间 ~500ms
延迟初始化非关键服务    减少 onCreate 时间 ~300ms
首屏内容精简            减少首屏 build 时间 ~200ms
图片压缩/下采样        减少资源加载时间 ~100ms
ArkUI 编译优化         减少字节码体积 ~30%
HSP 动态共享           减少安装包体积,加快下载

5. 与 Android 启动流程对比

阶段Android鸿蒙
固件层ROM → U-BootBootROM → Bootloader
内核层Linux KernelHongMeng Kernel
Init 进程init (init.rc)init (init.hrc)
ZygoteJava ZygoteArkTS Zygote
System 服务Java SystemServerC++/ArkTS SystemServer
应用入口Activity.onCreate()UIAbility.onCreate()
预加载Java 类 + DexArkTS 类 + 运行时
多进程fork + Zygote 连接fork + Zygote Socket

6. 🎯 面试高频考点

Q1: 鸿蒙系统启动流程和 Android 有什么区别?

答要点

  • 内核不同:HongMeng 微内核 vs Linux 宏内核
  • 配置格式:HCS 结构化配置 vs init.rc 脚本
  • Zygote 语言:ArkTS 运行时 vs Java Dalvik/ART
  • 启动服务:C++/ArkTS SystemServer vs Java SystemServer
  • 统一架构:同一内核覆盖 IoT/手机/车机 vs Android 分分支

Q2: Zygote 在鸿蒙中的作用是什么?

答要点

  • 预加载核心库和 UI 组件,减少应用冷启动时间
  • 通过 fork() 创建应用进程,利用写时拷贝(Copy-on-Write)
  • 监听 Socket 接收 AMS 的启动请求
  • 与 Android 的 Zygote 原理相同,但运行环境是 ArkTS 而非 Java

Q3: 如何优化应用冷启动时间?

答要点

  • Application onCreate 中只做必要初始化
  • 非关键初始化延迟到 onForeground 或首屏渲染后
  • 使用 HSP 动态共享模块减少包体积
  • 首屏精简渲染内容,避免大量复杂组件
  • 利用 LazyForEach 按需加载列表内容
  • 图片资源按需加载和下采样

💡 面试提示:掌握从 BootROM → Launcher 的完整启动链,每个阶段负责什么、耗时多少、可优化空间多少。重点对比与 Android 的差异。