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  窗口管理器(WindowManagerLauncher 启动后,会创建窗口、加载桌面布局、绑定应用数据,最终呈现给用户一个可交互的桌面。

二、整体阶段划分

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

  • AMSAbilityManagerService)负责 Ability 的调度与生命周期管理
  • WMSWindowManagerService)负责窗口的创建与管理
  • BMSBundleManagerService)负责已安装应用的信息查询
  •  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 通知 SystemServerLauncher 已启动

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 应用:

  1. AMS 维护一个 Launcher Ability 列表
  2. 默认选择第一个匹配的 Ability
  3. 用户可在设置中切换默认 Launcher
  4. 切换后 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 渲染流程

  1. ArkUI 引擎解析 pages/Launcher.ets 页面文件
  2. 构建组件树:Workspace → PageView → GridLayout → AppIcon
  3. LauncherModel 从数据库读取桌面配置(每页应用列表、排列顺序)
  4. 为每个应用创建 AppIcon 组件,绑定点击/长按事件
  5. 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 启动慢、卡顿问题
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐