OpenHarmony Launcher 启动流程
Launcher 是 OpenHarmony 系统启动后用户看到的第一个应用,也是整个系统的桌面入口。本文详解从 SystemServer 触发、Launcher Ability 加载、UI 渲染到桌面就绪的完整链路,并梳理核心数据结构与源码模块位置。
flowchart LR
A[SystemServer 启动] --> B[Launcher Ability 拉起]
B --> C[Ability 生命周期
onCreate → onWindowStageCreate]
C --> D[UI 渲染
Workspace + PageView]
B -.持久化.-> E[(桌面配置数据库)]
D -.绑定数据.-> F[(应用列表数据)]
一、概述
Launcher 是 OpenHarmony 系统的桌面应用,它的地位很特殊——既是普通 Ability,又是系统级入口。系统启动完成后,SystemServer 会负责拉起 Launcher,使其成为第一个与用户交互的界面。你可以把 Launcher 启动看成”系统就绪 → 桌面呈现”的最后一公里。
整个流程围绕两个核心组件展开——Ability 框架(Ability Framework) 和 窗口管理器(WindowManager)。Launcher 启动后,会创建窗口、加载桌面布局、绑定应用数据,最终呈现给用户一个可交互的桌面。
二、整体阶段划分
Launcher 启动流程分为 5 个阶段,按顺序执行:
|
阶段 |
名称 |
作用 |
|
1 |
系统就绪(SystemReady) |
SystemServer 完成核心服务初始化 |
|
2 |
Launcher 拉起(StartAbility) |
AMS 拉起 Launcher 的 UI Ability |
|
3 |
生命周期回调(Lifecycle) |
Launcher Ability 走 onCreate → onWindowStageCreate |
|
4 |
UI 渲染(Render) |
加载 Workspace 布局、PageView 分页 |
|
5 |
数据绑定(DataBind) |
绑定应用列表、桌面配置、快捷方式 |
下面逐个展开。
三、系统就绪阶段(SystemReady)
系统启动过程中,SystemServer 依次拉起各项核心服务:
系统上电
│
▼
Init 进程 → 启动 SystemServer
│
▼
SystemServer 依次拉起:
- AbilityManagerService (AMS)
- WindowManagerService (WMS)
- BundleManagerService (BMS)
- AppDataMgr
│
▼
所有核心服务就绪后 → 触发 HOME Intent
- AMS(AbilityManagerService)负责 Ability 的调度与生命周期管理
- WMS(WindowManagerService)负责窗口的创建与管理
- BMS(BundleManagerService)负责已安装应用的信息查询
- 当 BMS 完成应用扫描后,SystemServer 发出 START_HOME 信号
四、Launcher 拉起阶段(StartAbility)
SystemServer 通过 AMS 拉起 Launcher:
sequenceDiagram
participant SS as SystemServer
participant AMS as AMS
participant Launcher as Launcher Ability
SS->>AMS: 1. startLauncherAbility()
AMS->>AMS: 2. 解析 HOME Intent
AMS->>Launcher: 3. loadAbility(LauncherMainAbility)
Launcher-->>AMS: 4. abilityCreated()
AMS-->>SS: 5. launcherStarted()
详细说明:
|
步骤 |
说明 |
|
startLauncherAbility |
SystemServer 调用 AMS 接口,请求启动 HOME 类型的 Ability |
|
解析 Intent |
AMS 查找注册了 action.system.home 的 Ability,即 Launcher |
|
loadAbility |
AMS 创建 Launcher 的 Ability 实例,分配 AbilityRecord |
|
abilityCreated |
Launcher Ability 完成实例化,回调 AMS |
|
launcherStarted |
AMS 通知 SystemServer,Launcher 已启动 |
4.1 HOME Intent 匹配规则
Launcher 在 module.json5 中声明自己为 HOME Ability:
{
"abilities": [
{
"name": "MainAbility",
"skills": [
{
"actions": ["action.system.home"],
"entities": ["entity.system.home"]
}
]
}
]
}
AMS 启动时扫描所有已安装应用的 module.json5,找到声明了 action.system.home 的 Ability 作为 Launcher。
4.2 多 Launcher 选择
如果系统中安装了多个 Launcher 应用:
- AMS 维护一个 Launcher Ability 列表
- 默认选择第一个匹配的 Ability
- 用户可在设置中切换默认 Launcher
- 切换后 AMS 会销毁旧 Launcher,拉起新 Launcher
五、生命周期回调阶段(Lifecycle)
Launcher Ability 被拉起后,走标准的 UI Ability 生命周期:
flowchart LR
A[onCreate] --> B[onWindowStageCreate]
B --> C[onWindowStageActive]
C --> D[onForeground]
D --> E[桌面就绪]
|
回调 |
说明 |
|
onCreate |
Ability 创建,初始化全局资源、数据库连接 |
|
onWindowStageCreate |
创建窗口舞台,加载 UI 布局(ArkUI 页面) |
|
onWindowStageActive |
窗口进入活跃状态,开始渲染 |
|
onForeground |
Ability 进入前台,用户可见可交互 |
5.1 onCreate 中的关键初始化
|
初始化项 |
说明 |
|
LauncherModel |
桌面数据模型,管理应用列表、桌面配置 |
|
RDB 数据库 |
本地持久化桌面布局、分页顺序、文件夹结构 |
|
EventHub |
注册系统事件监听(应用安装/卸载/更新) |
|
DragController |
初始化拖拽控制器 |
5.2 onWindowStageCreate 中的 UI 加载
onWindowStageCreate(windowStage: window.WindowStage) {
windowStage.loadContent('pages/Launcher', (err, data) => {
if (err) return;
// 页面加载完成后,初始化 Workspace
this.launcherModel.initWorkspace();
});
}
六、UI 渲染阶段(Render)
Launcher 的 UI 结构为多层嵌套:
flowchart TB
A[LauncherRoot] --> B[Workspace]
B --> C[PageView - 分页容器]
C --> D[Page 0 - 主桌面]
C --> E[Page 1 - 扩展桌面]
C --> F[Page N - ...]
D --> G[GridLayout - 网格布局]
G --> H[AppIcon x N]
E --> I[DockBar - 底部导航栏]
|
组件 |
说明 |
|
Workspace |
桌面根容器,管理所有页面和过渡动画 |
|
PageView |
分页容器,支持左右滑动切换桌面页 |
|
GridLayout |
网格布局,排列应用图标 |
|
AppIcon |
单个应用图标组件 |
|
DockBar |
底部固定导航栏(常用应用) |
6.1 渲染流程
- ArkUI 引擎解析 pages/Launcher.ets 页面文件
- 构建组件树:Workspace → PageView → GridLayout → AppIcon
- LauncherModel 从数据库读取桌面配置(每页应用列表、排列顺序)
- 为每个应用创建 AppIcon 组件,绑定点击/长按事件
- ArkUI 引擎执行布局测量与绘制,呈现到窗口 Surface
6.2 首帧渲染优化
|
优化策略 |
说明 |
|
延迟加载 |
非首屏页面延迟初始化,减少首帧耗时 |
|
缓存图标 |
应用图标位图缓存到内存,避免重复解码 |
|
预加载 |
在 onCreate 阶段预读数据库,减少 onWindowStageCreate 等待 |
七、数据绑定阶段(DataBind)
UI 渲染的同时,Launcher 需要绑定两类核心数据:
7.1 应用列表数据
Launcher 通过 BMS 获取已安装应用列表:
async loadAppList() {
let bundleInfo = await bundleManager.getBundleInfos();
let appList = bundleInfo.filter(info => info.allowLauncherShow);
this.launcherModel.setAppList(appList);
}
|
数据字段 |
说明 |
|
appName |
应用名称 |
|
bundleName |
应用包名 |
|
abilityName |
入口 Ability 名 |
|
iconPath |
应用图标资源路径 |
|
labelId |
应用标签资源 ID |
|
installedTime |
安装时间(用于排序) |
7.2 桌面配置数据
桌面布局从本地 RDB 数据库读取:
|
表 |
字段 |
说明 |
|
app_item |
page_index, grid_x, grid_y |
应用在桌面上的位置 |
|
page_config |
page_id, page_name |
分页配置 |
|
folder_item |
folder_id, app_list |
文件夹内容 |
|
dock_item |
position, bundle_name |
底部导航栏配置 |
八、Launcher 启动的生命周期
系统启动
│
▼
SystemServer 就绪 → AMS 拉起 Launcher
│
▼
Launcher onCreate → 初始化数据模型
│
▼
onWindowStageCreate → 加载 UI 布局
│
▼
UI 渲染 → 数据绑定 → 桌面就绪
│
▼
用户交互(点击/滑动/拖拽)
│
▼
Home 键 → 回到 Launcher(不重新启动,直接切前台)
|
特性 |
说明 |
|
单例模式 |
Launcher 只有一个实例,全程常驻 |
|
Home 键回切 |
按 Home 键不重新启动 Launcher,而是通过 onActive 回切 |
|
重启恢复 |
异常崩溃后 AMS 会重新拉起 Launcher,桌面配置从数据库恢复 |
|
配置持久化 |
用户调整桌面布局后立即写入 RDB 数据库 |
九、关键代码模块位置
源码层级(OpenHarmony 仓库路径):
|
模块 |
路径 |
说明 |
|
Launcher 应用 |
applications/standard/launcher/ |
Launcher 主应用代码 |
|
Launcher Ability |
applications/standard/launcher/product/phone/src/main/ets/ |
Ability 入口与页面 |
|
AMS |
foundation/ability/ability_runtime/ |
Ability 调度服务 |
|
WMS |
foundation/window/window_manager/ |
窗口管理服务 |
|
BMS |
foundation/bundlemanager/bundle_framework/ |
应用包管理服务 |
|
ArkUI 引擎 |
foundation/arkui/ace_engine/ |
UI 渲染引擎 |
十、一张图总结
flowchart TB
A[SystemServer 启动] --> B[AMS 拉起 Launcher]
B --> C[Ability 生命周期
onCreate]
C --> D[onWindowStageCreate
加载 ArkUI 页面]
D --> E[UI 渲染
Workspace + PageView]
E --> F[数据绑定
BMS 应用列表 + RDB 配置]
B -.持久化.-> G[(桌面配置数据库)]
F -.图标资源.-> H[(BMS 应用数据)]
E -.首帧优化.-> I[缓存 + 预加载]
十一、延伸话题
如果你感兴趣,可以进一步聊这几个方向:
- Launcher 与多窗口模式的交互 —— 当系统进入分屏或自由窗口模式时,Launcher 如何调整自身状态
- 桌面动画体系 —— 页面切换动画、图标拖拽动画、文件夹展开动画的实现机制
- Launcher 的性能监控 —— 如何通过 Trace 和 HiLog 定位 Launcher 启动慢、卡顿问题
更多推荐
所有评论(0)