Appearance
系统启动流程
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 分组 | 按依赖图拓扑排序启动 |
| 日志 | logcat | hilog |
| 安全上下文 | SELinux | ATM + 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-Boot | BootROM → Bootloader |
| 内核层 | Linux Kernel | HongMeng Kernel |
| Init 进程 | init (init.rc) | init (init.hrc) |
| Zygote | Java Zygote | ArkTS Zygote |
| System 服务 | Java SystemServer | C++/ArkTS SystemServer |
| 应用入口 | Activity.onCreate() | UIAbility.onCreate() |
| 预加载 | Java 类 + Dex | ArkTS 类 + 运行时 |
| 多进程 | 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 的差异。