前置知识: HarmonyOS

Stage模型与FA模型区别

78 minAdvanced2026/6/14

HarmonyOS Stage模型与FA模型对比详解。

Stage 模型与 FA 模型区别:从 Ability 到 UIAbility 的范式跃迁

本章是理解 HarmonyOS 应用框架的”宪法级”内容。FA(Feature Ability)模型与 Stage 模型不仅是两种 API 风格的差异,更代表了 HarmonyOS 在多设备、分布式、原子化服务场景下应用范式的根本性重构。本章按 MIT 6.831/Stanford CS193P/CMU 17-643 等课程的标准组织,覆盖历史动机、形式化定义、工程实践与案例研究。


1. 学习目标

本章按照 Bloom 教育目标分类法(Bloom’s Taxonomy)的六个层级组织学习目标。读者完成本章后应能够:

1.1 Remember(记忆)

  • R1:复述 FA 模型与 Stage 模型的定义、组件构成与历史版本归属。
  • R2:列举 FA 模型中的四种 Ability 类型(Page、Service、Data、Form)。
  • R3:列举 Stage 模型中的 Ability 类型(UIAbility、ServiceExtensionAbility、FormExtensionAbility、ShareExtensionAbility、DataShareExtensionAbility)。
  • R4:复述 module.json5config.json 的作用区别。

1.2 Understand(理解)

  • U1:解释 Stage 模型为何以 UIAbility 取代 Page Ability,背后的窗口与生命周期抽象差异。
  • U2:解释 ExtensionAbility 机制如何实现”原子化服务”的按需加载。
  • U3:阐明 Stage 模型中 AbilityStage、HAP、HSP、APP Pack 的层次关系。
  • U4:对比 FA 模型与 Stage 模型的进程模型差异(同进程多 Ability vs. 多实例隔离)。

1.3 Apply(应用)

  • A1:使用 ArkTS 在 DevEco Studio 中创建一个 Stage 模型的 EntryAbility。
  • A2:在 module.json5 中正确配置 extensionAbilities 字段。
  • A3:实现一个 FormExtensionAbility,向系统提供桌面卡片服务。

1.4 Analyze(分析)

  • An1:分析 FA 模型在同进程 Page 跳转中存在的内存与状态管理问题,论证 Stage 模型的改进点。
  • An2:分析 Stage 模型通过 WindowStage 实现窗口复用对性能的影响。
  • An3:分析 module.json5deviceTypes 字段如何与 Ability 类型共同决定跨设备部署能力。

1.5 Evaluate(评价)

  • E1:评价一个现有 FA 模型项目迁移到 Stage 模型的成本与收益。
  • E2:评价 Stage 模型在多设备协同场景下的架构合理性。
  • E3:评价 OpenHarmony 与 HarmonyOS NEXT 在 API 兼容性策略上的取舍。

1.6 Create(创造)

  • C1:设计一个基于 Stage 模型的多设备协同办公应用,明确 Ability 拆分策略。
  • C2:设计 FA → Stage 的自动化迁移工具的核心算法与转换规则。
  • C3:基于 ExtensionAbility 设计一个可被第三方应用调用的”原子化翻译服务”。

2. 历史动机与发展脉络

2.1 HarmonyOS 1.0(2019):FA 模型的诞生

HarmonyOS 1.0 于 2019 年 8 月 9 日在华为开发者大会(HDC 2019)上发布,最初搭载于荣耀智慧屏。其应用模型被称为 FA 模型(Feature Ability Model),设计上参考了 Android 的 Activity/Service 模型,并融合了 LiteOS A 的轻量化特性。

FA 模型的核心设计动机:

  1. 生态兼容:降低 Android 开发者迁移成本,沿用”页面+服务+数据”三元组。
  2. 多设备适配:通过 config.json 中的 deviceType 字段支持手机、平板、智慧屏、穿戴。
  3. 原子化理念雏形:Service Ability 与 Data Ability 可被跨进程调用,为后续原子化服务奠基。

FA 模型在 2019-2021 年间承担了 HarmonyOS 1.0/2.0 的全部应用生态,但随着多设备协同场景的复杂化,其局限性逐渐暴露。

2.2 HarmonyOS 2.0(2020):原子化服务浮现

HarmonyOS 2.0 引入”原子化服务”概念,但仍基于 FA 模型。Service Ability 可被独立分发,形成”无图标安装即可用”的服务卡片雏形。FA 模型在同进程下承载 Page/Service/Data 三类 Ability,导致:

  • 内存占用高:Page 与 Service 共享进程,无法独立回收。
  • 生命周期耦合:Page 切换触发整个进程的 GC,影响服务响应。
  • 跨设备调度粒度粗:远程启动只能拉起整个 Ability,无法按需拉起子服务。

2.3 HarmonyOS 3.0(2022):Stage 模型登场

HarmonyOS 3.0 引入 Stage 模型,与 FA 模型并存,并作为推荐模型。Stage 模型的设计目标:

设计目标解决的 FA 模型问题
UIAbility 与业务分离Page 与 Service 耦合
ExtensionAbility 按需加载Service 常驻进程
多实例支持同 Ability 多开需求
WindowStage 抽象窗口与 UIAbility 解耦
原生分布式调度跨设备 FA 调用复杂

Stage 模型在 HarmonyOS 3.1(2023 年 3 月发布的 API 9)成为推荐模型,FA 模型进入维护模式。

2.4 HarmonyOS 4.0(2023):Stage 模型全面铺开

HarmonyOS 4.0(API 10)于 2023 年 8 月发布,DevEco Studio 4.0 默认创建 Stage 模型工程,FA 模型新建工程入口被收起。关键变化:

  • ArkTS 1.2 成为 Stage 模型唯一推荐语言(FA 模型支持 Java/JS)。
  • ArkUI 声明式范式(@Component/@Builder)在 Stage 模型中得到完整支持。
  • 分布式软总线 v3 对接 Stage 模型的 distributedScheduler,跨设备启动性能提升 40%。

2.5 HarmonyOS NEXT(2024):纯血鸿蒙

HarmonyOS NEXT(星河版,API 11+)于 2024 年 10 月正式发布,完全移除 FA 模型和 AOSP 兼容层。Stage 模型成为唯一应用框架。这是 HarmonyOS 历史上最大的一次架构断裂:

  • 不再支持 Java,仅 ArkTS。
  • 不再支持 config.json,仅 module.json5
  • 不再支持 Android 应用直接运行。

这一决策使系统二进制体积减少 30%,启动速度提升 20%,但要求所有应用使用 Stage 模型重写。

2.6 OpenHarmony 演进

OpenHarmony 是 HarmonyOS 的开源版本,由 OpenAtom 基金会托管。其演进与 HarmonyOS 同步:

OpenHarmony 版本发布时间对应 HarmonyOS关键变化
1.02020-09HarmonyOS 1.0首次开源,仅 LiteOS
2.02021-06HarmonyOS 2.0引入标准系统(Linux 内核)
3.02021-09HarmonyOS 3.0引入 Stage 模型 API
3.22023-03HarmonyOS 3.1Stage 模型稳定
4.02023-10HarmonyOS 4.0ArkTS 1.2
5.02024-10HarmonyOS NEXT纯 ArkTS,移除 FA

2.7 FA 与 Stage 模型时间线总览

2019 ──── HarmonyOS 1.0 ──── FA 模型唯一
2020 ──── HarmonyOS 2.0 ──── FA + 原子化服务
2022 ──── HarmonyOS 3.0 ──── FA + Stage 并存(Stage 推荐)
2023 ──── HarmonyOS 3.1 ──── Stage API 9 稳定
2023 ──── HarmonyOS 4.0  ──── Stage 默认,FA 收起
2024 ──── HarmonyOS NEXT ─── Stage 唯一,FA 移除

3. 形式化定义

3.1 FA 模型的形式化定义

定义 FA 模型应用为五元组:

FA=A,P,C,M,L\mathcal{FA} = \langle \mathcal{A}, \mathcal{P}, \mathcal{C}, \mathcal{M}, \mathcal{L} \rangle

其中:

  • A={a1,a2,,an}\mathcal{A} = \{a_1, a_2, \dots, a_n\} 为 Ability 集合,每个 ai{Page,Service,Data,Form}a_i \in \{ \text{Page}, \text{Service}, \text{Data}, \text{Form} \}
  • P:A{process name}\mathcal{P}: \mathcal{A} \to \{\text{process name}\} 为进程映射函数,默认所有 Ability 映射到同一进程。
  • C:A×AWant\mathcal{C}: \mathcal{A} \times \mathcal{A} \to \text{Want} 为 Ability 间调用关系。
  • M\mathcal{M}config.json 配置描述。
  • L:A{lifecycle states}\mathcal{L}: \mathcal{A} \to \{\text{lifecycle states}\} 为生命周期映射,其中 Page Ability 生命周期为 7 状态机:UninitializedInitialActiveInactiveBackgroundForeground\text{Uninitialized} \to \text{Initial} \to \text{Active} \to \text{Inactive} \to \text{Background} \to \text{Foreground}

3.2 Stage 模型的形式化定义

定义 Stage 模型应用为七元组:

S=U,E,W,H,D,M,L\mathcal{S} = \langle \mathcal{U}, \mathcal{E}, \mathcal{W}, \mathcal{H}, \mathcal{D}, \mathcal{M}, \mathcal{L} \rangle

其中:

  • U={u1,,um}\mathcal{U} = \{u_1, \dots, u_m\} 为 UIAbility 集合。
  • E={e1,,ek}\mathcal{E} = \{e_1, \dots, e_k\} 为 ExtensionAbility 集合,ei{Service,Form,Share,DataShare,InputMethod,}e_i \in \{\text{Service}, \text{Form}, \text{Share}, \text{DataShare}, \text{InputMethod}, \dots\}
  • W:UWindowStage\mathcal{W}: \mathcal{U} \to \mathcal{W}\text{indowStage} 为窗口舞台映射,每个 UIAbility 对应一个 WindowStage。
  • H={h1,,hp}\mathcal{H} = \{h_1, \dots, h_p\} 为 HAP(Harmony Ability Package)集合。
  • D:H×U2device types\mathcal{D}: \mathcal{H} \times \mathcal{U} \to 2^{\text{device types}} 为设备类型部署函数。
  • M\mathcal{M}module.json5 配置描述。
  • L:U{Create,WindowStageCreate,WindowStageActive,WindowStageInactive,WindowStageDestroy,Foreground,Background,Destroy}\mathcal{L}: \mathcal{U} \to \{\text{Create}, \text{WindowStageCreate}, \text{WindowStageActive}, \text{WindowStageInactive}, \text{WindowStageDestroy}, \text{Foreground}, \text{Background}, \text{Destroy}\} 为生命周期状态机。

3.3 两模型的核心代数差异

进程模型

FA 模型默认 ai,ajA:P(ai)=P(aj)\forall a_i, a_j \in \mathcal{A}: \mathcal{P}(a_i) = \mathcal{P}(a_j)(同进程)。

Stage 模型允许 ui,ej:P(ui)P(ej)\exists u_i, e_j: \mathcal{P}(u_i) \neq \mathcal{P}(e_j)(UIAbility 与 ExtensionAbility 默认跨进程)。

实例模型

FA 模型:ai:instance(ai){0,1}\forall a_i: \text{instance}(a_i) \in \{0, 1\}(单实例,singleton 模式)。

Stage 模型:ui:instance(ui)1\exists u_i: |\text{instance}(u_i)| \geq 1(支持 multiton/specified 模式)。

生命周期耦合

FA 模型的 Page Ability 状态转换:

 onStart  onActive  onInactive  onBackground  onForeground  onStop \text{ onStart } \to \text{ onActive } \to \text{ onInactive } \to \text{ onBackground } \to \text{ onForeground } \to \text{ onStop }

Stage 模型的 UIAbility 状态转换:

 onCreate  onWindowStageCreate  onForeground  onBackground  onWindowStageDestroy  onDestroy \text{ onCreate } \to \text{ onWindowStageCreate } \to \text{ onForeground } \to \text{ onBackground } \to \text{ onWindowStageDestroy } \to \text{ onDestroy }

关键差异:Stage 模型显式分离了”窗口创建”与”前台切换”两个阶段,使 UIAbility 可在无窗口状态下执行后台逻辑。

3.4 ArkTS 类型系统中的形式化

// FA 模型 Ability 抽象(Java 版本,HarmonyOS NEXT 移除)
public abstract class Ability {
    public void onStart(Intent intent);
    public void onActive();
    public void onInactive();
    public void onBackground();
    public void onForeground();
    public void onStop();
}

// Stage 模型 UIAbility 抽象(ArkTS,HarmonyOS 3.0+)
export default class UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void;
  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void;
  onWindowStageCreate(windowStage: window.WindowStage): void;
  onWindowStageDestroy(): void;
  onForeground(): void;
  onBackground(): void;
  onDestroy(): void;
  onConfigurationUpdate(newConfig: Configuration): void;
  onMemoryLevel(level: AbilityConstant.MemoryLevel): void;
}

类型签名揭示了 Stage 模型的设计哲学:通过 WantLaunchParam 显式传递启动上下文,通过 window.WindowStage 显式管理窗口,通过 MemoryLevel 回调实现内存压力协同。


4. 理论推导与原理解析

4.1 多实例的成本-收益模型

设一个 UIAbility 的内存占用为 MuiM_{ui},进程开销为 MprocM_{proc}。FA 模型中,启动一个新 Page 需复用现有进程,节省 MprocM_{proc},但所有 Page 共享 MuiM_{ui} 的局部状态。Stage 模型允许新实例,开销为 Mproc+MuiM_{proc} + M_{ui}

定义多实例收益函数:

R(n)=i=1nv(si)nMuin/kMprocR(n) = \sum_{i=1}^{n} v(s_i) - n \cdot M_{ui} - \lceil n / k \rceil \cdot M_{proc}

其中 v(si)v(s_i) 为第 ii 个实例的状态价值,kk 为单进程最大实例数(Stage 模型可配置)。

R(n)>0R(n) > 0 时多实例收益为正。对于多账号聊天、多窗口文档编辑场景,v(si)v(s_i) 高,Stage 模型多实例显著优于 FA 模型。

4.2 ExtensionAbility 的按需加载

ExtensionAbility 的进程模型可形式化为:

Lifecycle(ei)={Createdif  request r:target(r)=eiDestroyedif r in [tTidle,t]\text{Lifecycle}(e_i) = \begin{cases} \text{Created} & \text{if } \exists \text{ request } r: \text{target}(r) = e_i \\ \text{Destroyed} & \text{if } \nexists r \text{ in } [t - T_{\text{idle}}, t] \end{cases}

其中 TidleT_{\text{idle}} 为空闲超时(系统默认 5 分钟,可配置)。此模型实现”按需拉起、空闲销毁”的服务模型,相比 FA 模型 Service Ability 的常驻模式,内存节省可达 60%。

4.3 WindowStage 的窗口复用原理

WindowStage 抽象将”窗口”与”Ability”解耦。设窗口集合 W\mathcal{W},UIAbility 集合 U\mathcal{U}。FA 模型中 W=U|\mathcal{W}| = |\mathcal{U}|(一一绑定)。Stage 模型中:

uiU:!wiW:stage(ui)=wi\forall u_i \in \mathcal{U}: \exists! w_i \in \mathcal{W}: \text{stage}(u_i) = w_i

但 UIAbility 销毁后 wiw_i 可被另一个 UIAbility 复用(窗口转场动画)。这一设计使得页面切换不强制销毁窗口,转场动画可由窗口管理器(Window Manager Service, WMS)统一调度,性能提升 30%。

4.4 跨设备调用的形式化

设本地设备 d0d_0,远程设备集合 {d1,,dk}\{d_1, \dots, d_k\}。跨设备启动 UIAbility 的语义为:

startAbility(w)    dj:route(w,dj)instantiate(uw,dj)\text{startAbility}(w) \implies \exists d_j: \text{route}(w, d_j) \wedge \text{instantiate}(u_w, d_j)

其中 route(w,dj)\text{route}(w, d_j) 由分布式软总线(Distributed Soft Bus, DSoftBus)完成设备发现与路由,instantiate(uw,dj)\text{instantiate}(u_w, d_j)djd_j 上实例化 ww 指定的 UIAbility。

Stage 模型的分布式调度通过 distributedScheduler 接口暴露,相比 FA 模型需通过 featureAbility.startAbilityForResult 间接调用,API 表达力更强。

4.5 状态保存与恢复的语义

Stage 模型的 onSaveDataonRestoreData 实现跨设备迁移的状态同步,可形式化为:

Migrate(ui,d0,dj)=Serialize(state(ui,d0))DSoftBusDeserialize(_,dj)ui\text{Migrate}(u_i, d_0, d_j) = \text{Serialize}(\text{state}(u_i, d_0)) \xrightarrow{\text{DSoftBus}} \text{Deserialize}(\_, d_j) \to u_i'

要求 state(ui,d0)\text{state}(u_i, d_0) 可序列化。Stage 模型使用 ArkTS 的 JSON.stringify 与自定义 parcellable 接口实现,FA 模型仅支持 Parcelable Java 接口,序列化能力弱。


5. 代码示例

5.1 Stage 模型 EntryAbility 完整示例

以下是一个企业级 Stage 模型 UIAbility 完整示例,覆盖生命周期、窗口管理、Want 处理、状态保存。

// entry/src/main/ets/entryability/EntryAbility.ets
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

const DOMAIN = 0x0001;
const TAG = 'EntryAbility';

/**
 * EntryAbility - 应用主入口 UIAbility
 * 演示 Stage 模型完整生命周期、窗口管理、Want 处理
 * 兼容 HarmonyOS 4.0 (API 10) 与 HarmonyOS NEXT (API 11+)
 */
export default class EntryAbility extends UIAbility {
  // 应用级状态:在 onCreate 中初始化,销毁前持久化
  private appState: Record<string, Object> = {};
  // WindowStage 引用:onWindowStageCreate 中获取
  private windowStage: window.WindowStage | null = null;

  /**
   * Ability 创建时回调,仅执行一次
   * 适合做:全局资源初始化、数据库连接、第三方 SDK 初始化
   * @param want 启动参数,包含 bundleName、abilityName、parameters
   * @param launchParam 启动模式参数,区分 cold/warm/hot 启动
   */
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(DOMAIN, TAG, 'onCreate: launchReason=%{public}s', launchParam.launchReason);

    // 解析启动参数
    const params = want.parameters as Record<string, Object>;
    if (params && params['userId']) {
      this.appState['userId'] = params['userId'];
      hilog.info(DOMAIN, TAG, 'Received userId=%{public}s', params['userId']);
    }

    // 初始化全局资源(实际项目中应异步)
    this.initializeApp();
  }

  /**
   * WindowStage 创建回调
   * 此时窗口已分配但未显示,应加载首屏页面
   * @param windowStage 窗口舞台,承载 ArkUI 页面树
   */
  onWindowStageCreate(windowStage: window.WindowStage): void {
    hilog.info(DOMAIN, TAG, 'onWindowStageCreate');
    this.windowStage = windowStage;

    // 加载首页面,参数通过 Want 传递到首页
    const loadParam: Record<string, Object> = {
      'initialRoute': 'pages/Index',
      'userId': this.appState['userId'] ?? ''
    };

    windowStage.loadContent('pages/Index', loadParam, (err: BusinessError) => {
      if (err.code) {
        hilog.error(DOMAIN, TAG, 'loadContent failed: %{public}s', err.message);
        return;
      }
      hilog.info(DOMAIN, TAG, 'loadContent succeed');
    });

    // 设置窗口沉浸式状态栏(可选)
    this.configWindowStyle(windowStage);
  }

  /**
   * 配置窗口沉浸式样式
   */
  private async configWindowStyle(windowStage: window.WindowStage): Promise<void> {
    try {
      const mainWin = await windowStage.getMainWindow();
      await mainWin.setWindowLayoutFullScreen(true);
      await mainWin.setWindowSystemBarProperties({
        statusBarContentColor: '#FFFFFF',
        navigationBarContentColor: '#FFFFFF'
      });
    } catch (err) {
      const e = err as BusinessError;
      hilog.error(DOMAIN, TAG, 'configWindowStyle failed: %{public}s', e.message);
    }
  }

  /**
   * WindowStage 销毁回调
   * 释放 UI 相关资源,如动画定时器、手势监听
   */
  onWindowStageDestroy(): void {
    hilog.info(DOMAIN, TAG, 'onWindowStageDestroy');
    this.windowStage = null;
  }

  /**
   * 切到前台回调
   * 适合做:恢复动画、刷新数据、激活传感器
   */
  onForeground(): void {
    hilog.info(DOMAIN, TAG, 'onForeground');
    // 通知 ArkUI 页面恢复
    this.emitToUI('onAppForeground', {});
  }

  /**
   * 切到后台回调
   * 适合做:暂停动画、停止定位、降低帧率
   */
  onBackground(): void {
    hilog.info(DOMAIN, TAG, 'onBackground');
    this.emitToUI('onAppBackground', {});
  }

  /**
   * 系统配置变化回调(如语言切换、横竖屏、深色模式)
   * @param newConfig 新配置对象
   */
  onConfigurationUpdate(newConfig: Configuration): void {
    hilog.info(DOMAIN, TAG, 'onConfigurationUpdate: language=%{public}s', newConfig.language);
  }

  /**
   * 内存压力等级变化回调
   * @param level TRIM_MEMORY_RUNNING / TRIM_MEMORY_BACKGROUND / TRIM_MEMORY_MODERATE
   */
  onMemoryLevel(level: AbilityConstant.MemoryLevel): void {
    hilog.warn(DOMAIN, TAG, 'onMemoryLevel: %{public}d', level);
    if (level === AbilityConstant.MemoryLevel.MEMORY_LEVEL_CRITICAL) {
      // 释放非关键缓存
      this.appState['imageCache'] = {};
    }
  }

  /**
   * 新 Want 到达回调(启动模式为 singleton/multiton 时触发)
   * 适合做:处理深链、外部唤起
   */
  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(DOMAIN, TAG, 'onNewWant: action=%{public}s', want.action);
    this.emitToUI('onNewWant', { want });
  }

  /**
   * Ability 销毁回调
   * 释放所有资源、保存持久化状态
   */
  onDestroy(): void {
    hilog.info(DOMAIN, TAG, 'onDestroy');
    this.persistState();
  }

  /**
   * 跨设备迁移:保存状态
   * @param wantParam 迁移参数容器,写入需要传输到目标设备的数据
   */
  onSaveData(wantParam: Record<string, Object>): void {
    wantParam['appState'] = JSON.stringify(this.appState);
    hilog.info(DOMAIN, TAG, 'onSaveData: state size=%{public}d', JSON.stringify(this.appState).length);
  }

  /**
   * 跨设备迁移:恢复状态
   * @param wantParam 接收到的迁移参数
   */
  onRestoreData(wantParam: Record<string, Object>): void {
    const raw = wantParam['appState'] as string;
    if (raw) {
      this.appState = JSON.parse(raw);
      hilog.info(DOMAIN, TAG, 'onRestoreData: restored keys=%{public}d', Object.keys(this.appState).length);
    }
  }

  // ============ 私有辅助方法 ============

  private initializeApp(): void {
    // 实际项目中:初始化数据库、网络层、日志埋点
    this.appState['launchTime'] = Date.now();
  }

  private persistState(): void {
    // 实际项目中:写入 preferences 或分布式 KV
  }

  private emitToUI(event: string, data: Object): void {
    // 通过 EventHub 向 ArkUI 页面广播事件
    this.context.eventHub.emit(event, data);
  }
}

5.2 完整 module.json5 配置(Stage 模型)

// entry/src/main/module.json5
{
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet",
      "2in1",
      "car",
      "wearable",
      "tv"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "description": "$string:EntryAbility_desc",
        "icon": "$media:app_icon",
        "label": "$string:EntryAbility_label",
        "startWindowIcon": "$media:app_icon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": ["entity.system.home"],
            "actions": ["action.system.home"]
          },
          {
            // 深链支持
            "uris": [
              {
                "scheme": "fandex",
                "host": "app",
                "pathStartWith": "/home"
              }
            ]
          }
        ],
        "launchType": "singleton",
        // 启动模式:singleton / multiton / specified
        "orientation": "auto_rotation",
        "metadata": [
          {
            "name": "ohos.module.meta",
            "value": "stage"
          }
        ]
      },
      {
        "name": "SecondaryAbility",
        "srcEntry": "./ets/secondaryability/SecondaryAbility.ets",
        "label": "$string:SecondaryAbility_label",
        "launchType": "multiton", // 多实例
        "exported": false
      }
    ],
    "extensionAbilities": [
      {
        "name": "FormExtAbility",
        "srcEntry": "./ets/formextability/FormExtAbility.ets",
        "type": "form",
        "metadata": [
          {
            "name": "ohos.extension.form",
            "resource": "$profile:form_config"
          }
        ]
      },
      {
        "name": "ServiceExtAbility",
        "srcEntry": "./ets/serviceextability/ServiceExtAbility.ets",
        "type": "service",
        "exported": true,
        "skills": [
          {
            "actions": ["action.fandex.SYNC_DATA"]
          }
        ]
      },
      {
        "name": "ShareExtAbility",
        "srcEntry": "./ets/shareextability/ShareExtAbility.ets",
        "type": "share",
        "exported": true
      },
      {
        "name": "DataShareExtAbility",
        "srcEntry": "./ets/datashareextability/DataShareExtAbility.ets",
        "type": "dataShare",
        "exported": true,
        "uri": "datashare://com.fandex.app/data"
      }
    ],
    "requestPermissions": [
      { "name": "ohos.permission.INTERNET" },
      {
        "name": "ohos.permission.CAMERA",
        "reason": "$string:camera_reason",
        "usedScene": {
          "abilities": ["EntryAbility"],
          "when": "inuse"
        }
      }
    ]
  }
}

5.3 FA 模型对照示例(config.json)

以下为同一应用在 FA 模型下的 config.json(HarmonyOS 4.0 维护版本,HarmonyOS NEXT 已移除)。

// entry/src/main/config.json (FA 模型,HarmonyOS 4.0 及之前)
{
  "app": {
    "bundleName": "com.fandex.app",
    "vendor": "FANDEX",
    "version": {
      "code": 1,
      "name": "1.0.0"
    },
    "apiVersion": {
      "compatible": 8,
      "target": 10,
      "releaseType": "Release"
    }
  },
  "deviceConfig": {
    "default": {
      "process": "com.fandex.app.main"
    }
  },
  "module": {
    "package": "com.fandex.app.entry",
    "name": ".MainAbility",
    "deviceTypes": ["phone", "tablet", "tv", "wearable"],
    "distro": {
      "deliveryWithInstall": true,
      "moduleName": "entry",
      "moduleType": "entry"
    },
    "abilities": [
      {
        "name": ".MainAbility",
        "icon": "$media:app_icon",
        "label": "$string:MainAbility_label",
        "type": "page", // FA 模型四种类型之一
        "launchType": "singleton",
        "skills": [
          {
            "entities": ["entity.system.home"],
            "actions": ["action.system.home"]
          }
        ]
      },
      {
        "name": ".SecondaryAbility",
        "type": "page",
        "launchType": "standard"
      }
    ],
    "defPermissions": [
      {
        "name": "com.fandex.app.permission.SYNC",
        "grantMode": "user_grant"
      }
    ],
    "reqPermissions": [
      { "name": "ohos.permission.INTERNET" },
      {
        "name": "ohos.permission.CAMERA",
        "reason": "$string:camera_reason",
        "usedScene": {
          "ability": [".MainAbility"],
          "when": "inuse"
        }
      }
    ]
  }
}

5.4 FormExtensionAbility 实现

// entry/src/main/ets/formextability/FormExtAbility.ets
import { FormExtensionAbility, formBindingData, formInfo } from '@kit.FormKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

const DOMAIN = 0x0001;
const TAG = 'FormExtAbility';

/**
 * FormExtensionAbility - 桌面卡片服务
 * Stage 模型专属类型,FA 模型使用 Form Ability
 */
export default class FormExtAbility extends FormExtensionAbility {

  /**
   * 卡片创建时回调
   * @param formId 卡片唯一 ID
   * @param want 启动参数
   */
  onAddForm(want: Want): formBindingData.FormBindingData {
    hilog.info(DOMAIN, TAG, 'onAddForm');
    const formId = want.parameters?.[formInfo.FormParam.IDENTITY_KEY] as string;
    const tempFlag = want.parameters?.[formInfo.FormParam.TEMP_FORM_KEY] as boolean;

    // 返回卡片初始数据
    return formBindingData.createFormBindingData({
      'title': 'FANDEX 实时',
      'value': '0.00',
      'lastUpdate': new Date().toLocaleString()
    });
  }

  /**
   * 卡片更新回调(系统定时或应用主动触发)
   */
  onUpdateForm(formId: string): void {
    hilog.info(DOMAIN, TAG, 'onUpdateForm: %{public}s', formId);
    // 异步获取最新数据并更新卡片
    this.fetchLatestData().then(data => {
      formProvider.updateForm(formId, formBindingData.createFormBindingData(data));
    });
  }

  /**
   * 卡片被点击时回调
   */
  onCastToNormalForm(formId: string): void {
    hilog.info(DOMAIN, TAG, 'onCastToNormalForm: %{public}s', formId);
  }

  /**
   * 卡片可见性变化
   */
  onFormEvent(formId: string, message: string): void {
    hilog.info(DOMAIN, TAG, 'onFormEvent: %{public}s, msg=%{public}s', formId, message);
  }

  /**
   * 卡片删除
   */
  onRemoveForm(formId: string): void {
    hilog.info(DOMAIN, TAG, 'onRemoveForm: %{public}s', formId);
  }

  /**
   * 卡片转场(跨设备迁移)
   */
  onAcquireFormState(want: Want): formInfo.FormState {
    return formInfo.FormState.READY;
  }

  private async fetchLatestData(): Promise<Record<string, string>> {
    // 实际项目:从分布式 KV 或网络获取
    return {
      'title': 'FANDEX 实时',
      'value': (Math.random() * 100).toFixed(2),
      'lastUpdate': new Date().toLocaleString()
    };
  }
}

import { formProvider } from '@kit.FormKit';
import { Want } from '@kit.AbilityKit';

5.5 ServiceExtensionAbility 实现

// entry/src/main/ets/serviceextability/ServiceExtAbility.ets
import { ServiceExtensionAbility, Want, ipcRpc } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

const DOMAIN = 0x0001;
const TAG = 'ServiceExtAbility';

/**
 * ServiceExtensionAbility - 后台服务
 * 替代 FA 模型 Service Ability
 * 与 UIAbility 默认在不同进程,可独立销毁
 */
export default class ServiceExtAbility extends ServiceExtensionAbility {

  onCreate(want: Want): void {
    hilog.info(DOMAIN, TAG, 'onCreate: action=%{public}s', want.action);
  }

  /**
   * 处理客户端 connectAbility 请求
   * 返回 IPC 桩对象供客户端调用
   */
  onConnect(want: Want): rpc.RemoteObject {
    hilog.info(DOMAIN, TAG, 'onConnect');
    return new SyncStub('SyncStub');
  }

  onDisconnect(want: Want): void {
    hilog.info(DOMAIN, TAG, 'onDisconnect');
  }

  /**
   * 处理 startAbility 请求(无返回值)
   */
  onRequest(want: Want, startId: number): void {
    hilog.info(DOMAIN, TAG, 'onRequest: startId=%{public}d', startId);
    this.handleBackgroundSync(want);
  }

  onDestroy(): void {
    hilog.info(DOMAIN, TAG, 'onDestroy');
  }

  private async handleBackgroundSync(want: Want): Promise<void> {
    const action = want.action;
    switch (action) {
      case 'action.fandex.SYNC_DATA':
        await this.syncDistributedData();
        break;
      case 'action.fandex.PUSH_NOTIFICATION':
        await this.sendPushNotification(want.parameters);
        break;
      default:
        hilog.warn(DOMAIN, TAG, 'Unknown action: %{public}s', action);
    }
  }

  private async syncDistributedData(): Promise<void> {
    // 实际项目:调用分布式 KV 同步
  }

  private async sendPushNotification(params: Record<string, Object>): Promise<void> {
    // 实际项目:通过 notificationManager 发送通知
  }
}

/**
 * IPC 桩:处理跨进程调用
 */
class SyncStub extends ipcRpc.RemoteObject {
  constructor(descriptor: string) {
    super(descriptor);
  }

  onRemoteRequest(code: number, data: rpc.MessageSequence, reply: rpc.MessageSequence, option: rpc.MessageOption): boolean {
    switch (code) {
      case 1: { // SYNC_CMD_GET
        const key = data.readString();
        const value = this.handleGet(key);
        reply.writeString(value);
        return true;
      }
      case 2: { // SYNC_CMD_PUT
        const key = data.readString();
        const value = data.readString();
        this.handlePut(key, value);
        reply.writeInt(0);
        return true;
      }
      default:
        return false;
    }
  }

  private handleGet(key: string): string {
    // 实际实现:从分布式 KV 读取
    return '';
  }

  private handlePut(key: string, value: string): void {
    // 实际实现:写入分布式 KV
  }
}

import { rpc } from '@kit.IPC&CPKit';

5.6 跨设备迁移实现

// entry/src/main/ets/entryability/EntryAbility.ets(续)
// 跨设备迁移示例

import { distributedScheduler } from '@kit.DistributedServiceKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

class MigrationManager {
  private context: UIAbilityContext;

  constructor(context: UIAbilityContext) {
    this.context = context;
  }

  /**
   * 触发迁移到目标设备
   * @param targetDeviceId 目标设备 ID(通过 DeviceManager 获取)
   */
  async migrateTo(targetDeviceId: string): Promise<void> {
    try {
      // Stage 模型专用 API:continueAbility
      await this.context.continueAbility('com.fandex.app', targetDeviceId);
      hilog.info(0x0001, 'Migration', 'migrateTo succeed: %{public}s', targetDeviceId);
    } catch (err) {
      const e = err as BusinessError;
      hilog.error(0x0001, 'Migration', 'migrateTo failed: %{public}s', e.message);
    }
  }

  /**
   * 注册为可迁移 Ability
   */
  registerMigration(): void {
    this.context.on('continueStateChange', (state: string) => {
      hilog.info(0x0001, 'Migration', 'continueState: %{public}s', state);
    });
  }
}

6. 对比分析

6.1 Stage 模型 vs FA 模型核心对比

维度FA 模型Stage 模型
推荐度维护模式(HarmonyOS 4.0 维护,NEXT 移除)推荐(HarmonyOS 3.1+,NEXT 唯一)
首次引入HarmonyOS 1.0(2019)HarmonyOS 3.0(2022)
主要语言Java / JS / ArkTSArkTS(NEXT 仅 ArkTS)
UI 框架JS UI(类 Web) / Java UIArkUI 声明式
Ability 类型Page / Service / Data / FormUIAbility + 5 类 ExtensionAbility
配置文件config.json(JSON)module.json5(JSON5,支持注释)
进程模型默认同进程共享默认跨进程隔离
实例模式singleton / standardsingleton / multiton / specified
生命周期7 状态机8 状态机(显式分离 WindowStage)
窗口管理与 Ability 强绑定WindowStage 抽象,可复用
跨设备调度featureAbility.startAbilityForResultcontext.startAbility / distributedScheduler
状态保存ParcelableJSON + 自定义序列化
多设备部署deviceType 字段deviceTypes 字段 + 多 HSP
原子化服务Service Ability 拆分ExtensionAbility 按需加载
后台服务Service 常驻ServiceExtensionAbility 可配置存活

6.2 与 Android 应用框架对比

维度AndroidStage 模型
UI 组件ActivityUIAbility
后台服务ServiceServiceExtensionAbility
数据共享ContentProviderDataShareExtensionAbility
卡片AppWidgetProviderFormExtensionAbility
分享Share IntentShareExtensionAbility
生命周期onCreate/onStart/onResume/onPause/onStop/onDestroyonCreate/onWindowStageCreate/onForeground/onBackground/onWindowStageDestroy/onDestroy
配置文件AndroidManifest.xml(XML)module.json5(JSON5)
启动模式standard/singleTop/singleTask/singleInstancesingleton/multiton/specified
多窗口ActivityOptions(API 24+)WindowStage 原生支持
跨设备无原生(需自研)distributedScheduler 原生

6.3 与 iOS 应用框架对比

维度iOSStage 模型
UI 组件UIViewControllerUIAbility
后台任务Background Tasks / BGTaskSchedulerServiceExtensionAbility
数据共享App Group + CloudKitDataShareExtensionAbility + 分布式 KV
卡片WidgetKitFormExtensionAbility
分享UIActivityViewControllerShareExtensionAbility
生命周期viewDidLoad/viewWillAppear/viewDidAppearonCreate/onWindowStageCreate/onForeground
配置文件Info.plist(plist)module.json5(JSON5)
多窗口UISceneSession(iOS 13+)WindowStage
跨设备Handoff / Continuity(应用层)distributedScheduler(系统层)

6.4 与 Flutter / React Native 对比

维度FlutterReact NativeStage 模型
渲染机制Skia 自绘原生组件桥接ArkUI(自绘 + 部分原生)
语言DartJS/TSArkTS
应用模型单 Isolate 多 Page单 Bridge 多 ComponentUIAbility + ExtensionAbility
多实例Navigator 栈Navigation 容器launchType: multiton
跨进程不原生支持不原生支持ExtensionAbility 原生跨进程
跨设备不原生支持不原生支持DSoftBus + distributedScheduler
配置pubspec.yamlpackage.jsonmodule.json5
平台覆盖Android/iOS/Web/DesktopAndroid/iOSHarmonyOS 全场景

6.5 配置文件差异详细对比

配置字段FA 模型 (config.json)Stage 模型 (module.json5)
应用包名app.bundleNameapp.bundleName
模块名module.packagemodule.name
模块类型module.distro.moduleTypemodule.type
设备类型module.deviceTypesmodule.deviceTypes
主入口module.name(类名)module.mainElement
Ability 列表module.abilities[]module.abilities[] + module.extensionAbilities[]
Ability 类型type: "page"/"service"/"data"/"form"type: "UIAbility" 或 ExtensionAbility 的 type: "form"/"service"/"share"/"dataShare"
启动模式launchType: "singleton"/"standard"launchType: "singleton"/"multiton"/"specified"
权限请求module.reqPermissions[]module.requestPermissions[]
权限定义module.defPermissions[]module.definePermissions[]
元数据module.metadata[]module.metadata[]
页面配置module.js[]module.pages: "$profile:main_pages"
数据 URIData Ability uriDataShareExtensionAbility uri

7. 常见陷阱与最佳实践

7.1 生命周期陷阱

陷阱 1:在 onCreate 中调用 WindowStage API

错误代码

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  // 错误:此时 WindowStage 尚未创建
  this.windowStage.loadContent('pages/Index'); // 抛出 NullPointerException
}

正确做法:在 onWindowStageCreate 中操作 WindowStage。

onWindowStageCreate(windowStage: window.WindowStage): void {
  windowStage.loadContent('pages/Index');
}

原理:Stage 模型显式分离了 Ability 创建与窗口创建。onCreate 时 UIAbility 对象已存在但窗口未分配,调用窗口 API 会失败。

陷阱 2:onBackground 中释放关键资源

错误代码

onBackground(): void {
  this.httpClient.close(); // 错误:切到后台立即关闭会导致返回前台时无法恢复
}

正确做法:根据资源类型分层释放。

onBackground(): void {
  // 仅释放 UI 相关、可快速重建的资源
  this.cancelAnimationTimers();
  // 网络连接保持,仅在 onDestroy 中关闭
}

onMemoryLevel(level: AbilityConstant.MemoryLevel): void {
  // 内存压力时才释放非关键资源
  if (level === AbilityConstant.MemoryLevel.MEMORY_LEVEL_CRITICAL) {
    this.httpClient.close();
  }
}

陷阱 3:onNewWant 误用

错误代码

onCreate(want: Want): void {
  this.processDeepLink(want); // 仅在冷启动时调用
}

// 单实例模式下二次启动不会触发 onCreate,但 onNewWant 会被调用
// 开发者忘记在 onNewWant 中处理深链

正确做法:在 onCreate 与 onNewWant 中都处理。

onCreate(want: Want): void {
  this.processDeepLink(want);
}

onNewWant(want: Want): void {
  this.processDeepLink(want);
}

private processDeepLink(want: Want): void {
  const uri = want.uri;
  if (uri && uri.startsWith('fandex://')) {
    this.context.eventHub.emit('deepLink', uri);
  }
}

7.2 ExtensionAbility 陷阱

陷阱 4:在 FormExtensionAbility 中执行耗时操作

错误代码

onAddForm(want: Want): formBindingData.FormBindingData {
  const data = this.syncFetchFromNetwork(); // 阻塞主线程 5s
  return formBindingData.createFormBindingData(data);
}

正确做法:onAddForm 应在 16ms 内返回,耗时操作通过定时更新完成。

onAddForm(want: Want): formBindingData.FormBindingData {
  // 立即返回占位数据
  return formBindingData.createFormBindingData({ 'title': '加载中...' });
  // 异步更新在 onUpdateForm 中触发
}

onUpdateForm(formId: string): void {
  this.asyncFetch().then(data => {
    formProvider.updateForm(formId, formBindingData.createFormBindingData(data));
  });
}

陷阱 5:ExtensionAbility 与 UIAbility 共享代码导致循环依赖

问题:UIAbility 引用 ExtensionAbility 的工具类,ExtensionAbility 又引用 UIAbility 的页面常量。

正确做法:使用 HSP(Harmony Shared Package)抽取公共代码。

project/
├── entry/                  # 主应用(UIAbility)
├── form_feature/           # 卡片模块(FormExtensionAbility)
└── common/                 # HSP 公共模块
    └── src/main/ets/
        ├── constants/      # 共享常量
        ├── utils/          # 共享工具
        └── models/         # 共享数据模型

7.3 跨设备迁移陷阱

陷阱 6:onSaveData 序列化超限

问题:Stage 模型跨设备迁移的数据量上限为 100KB(HarmonyOS 4.0),超限会被截断。

正确做法:大数据通过分布式 KV 同步,onSaveData 仅传引用。

onSaveData(wantParam: Record<string, Object>): void {
  // 错误:传输整个图像 buffer
  // wantParam['image'] = this.imageBase64;

  // 正确:传输分布式 KV 的 key
  wantParam['imageKey'] = this.imageKey; // 几十字节
}

onRestoreData(wantParam: Record<string, Object>): void {
  const key = wantParam['imageKey'] as string;
  // 通过分布式 KV 获取实际数据
  this.loadImageFromKV(key);
}

陷阱 7:迁移未注册可迁移 Ability

问题:未在 module.json5 中声明 continuable: true,调用 continueAbility 会失败。

{
  "abilities": [{
    "name": "EntryAbility",
    "continuable": true  // 必须声明
  }]
}

7.4 module.json5 配置陷阱

陷阱 8:deviceTypes 与 ExtensionAbility 类型不匹配

问题:在穿戴设备上声明 FormExtensionAbility,但卡片在穿戴上不支持。

正确做法:使用 metadata 标记支持的设备范围。

{
  "extensionAbilities": [{
    "name": "FormExtAbility",
    "type": "form",
    "metadata": [{
      "name": "ohos.extension.form.supported",
      "value": "phone,tablet,tv"
    }]
  }]
}

陷阱 9:launchType 与 exported 误用

问题:将 multiton 模式的 Ability 设为 exported: true,导致外部应用反复唤起新实例,耗尽内存。

正确做法:对外暴露的 Ability 用 singleton,内部 Ability 用 multiton

7.5 性能陷阱

陷阱 10:onWindowStageCreate 中加载大资源

问题:在 loadContent 前同步加载大型 JSON 配置文件,导致首屏白屏。

正确做法:首屏仅加载必要资源,其他异步加载。

onWindowStageCreate(windowStage: window.WindowStage): void {
  // 立即加载首屏(占位 UI)
  windowStage.loadContent('pages/Splash', (err) => {
    if (!err.code) {
      // 异步加载实际首页所需数据
      this.preloadHomeData().then(() => {
        this.context.eventHub.emit('homeReady');
      });
    }
  });
}

7.6 最佳实践清单

实践项描述
使用 ArkTS 而非 Java/JSNEXT 仅支持 ArkTS,FA 模型 Java/JS 路径已废弃
始终使用 module.json5不再创建 config.json,新工程默认 Stage
ExtensionAbility 按需加载不要把服务逻辑塞进 UIAbility
HSP 抽取公共代码避免循环依赖与重复代码
分布式数据用 KV,迁移数据用 Want迁移数据 < 100KB
测试 launchType 行为singleton/multiton/specified 行为差异显著
监听 onMemoryLevel内存压力时主动释放资源
配置 deviceTypes 精确避免在不适配设备上崩溃

8. 工程实践

8.1 DevEco Studio 工程结构

DevEco Studio 5.0+ 创建 Stage 模型工程的默认结构:

FandexApp/
├── AppScope/                     # 应用级配置
│   ├── app.json5                 # 应用全局配置(bundleName、版本)
│   └── resources/                # 应用级资源(图标、字符串)
├── entry/                        # 主入口模块(HAP)
│   ├── src/
│   │   ├── main/
│   │   │   ├── ets/              # ArkTS 源码
│   │   │   │   ├── entryability/
│   │   │   │   │   └── EntryAbility.ets
│   │   │   │   ├── pages/        # ArkUI 页面
│   │   │   │   │   └── Index.ets
│   │   │   │   ├── components/   # 自定义组件
│   │   │   │   ├── model/        # 数据模型
│   │   │   │   └── utils/
│   │   │   ├── resources/        # 模块资源
│   │   │   └── module.json5      # 模块配置(Stage 模型核心)
│   │   ├── ohosTest/             # 单元测试
│   │   └── test/                 # UITest
│   ├── build-profile.json5       # 模块构建配置
│   ├── hvigorfile.ts             # Hvigor 构建脚本
│   └── obfuscation-rules.txt     # 代码混淆规则
├── library/                      # HSP 共享模块(可选)
├── feature_form/                 # 卡片特性模块(可选)
├── build-profile.json5           # 工程级构建配置
├── hvigorfile.ts                 # 工程级 Hvigor 脚本
├── hvigorw                       # Hvigor 包装器(Unix)
├── hvigorw.bat                   # Hvigor 包装器(Windows)
├── hvigorw.js                    # Hvigor 包装器入口
├── oh-package.json5              # 工程依赖配置
└── code-linter.json5             # 代码检查配置

8.2 app.json5 全局配置

// AppScope/app.json5
{
  "app": {
    "bundleName": "com.fandex.app",
    "vendor": "FANDEX",
    "versionCode": 1000000,
    "versionName": "1.0.0",
    "icon": "$media:app_icon",
    "label": "$string:app_name",
    "minAPIVersion": 10,           // 最低 API 版本(HarmonyOS 4.0)
    "targetAPIVersion": 12,        // 目标 API 版本(HarmonyOS NEXT)
    "apiReleaseType": "Release",
    "debug": false
  }
}

8.3 hvigor 构建配置

// build-profile.json5
{
  "app": {
    "signingConfigs": [
      {
        "name": "default",
        "type": "HarmonyOS",
        "material": {
          "certpath": "/path/to/cert.cer",
          "storePassword": "${KEYSTORE_PWD}",
          "keyAlias": "fandex_key",
          "keyPassword": "${KEY_PWD}",
          "profile": "/path/to/profile.p7b",
          "signAlg": "SHA256withECDSA",
          "storeFile": "/path/to/keystore.p12"
        }
      }
    ],
    "products": [
      {
        "name": "default",
        "signingConfig": "default",
        "compatibleSdkVersion": "4.0.0(10)",
        "runtimeOS": "HarmonyOS"
      },
      {
        "name": "next",
        "signingConfig": "default",
        "compatibleSdkVersion": "5.0.0(12)",
        "runtimeOS": "HarmonyOS"
      }
    ],
    "buildMode": "debug"
  },
  "modules": [
    { "name": "entry", "srcPath": "./entry", "targets": [{ "name": "default" }] }
  ]
}

8.4 签名与发布

Stage 模型应用签名流程:

  1. 生成密钥库:DevEco Studio → Build → Generate Key And CSR。
  2. 申请证书:在华为开发者联盟申请调试证书或正式证书。
  3. 创建 Profile:根据 bundleName 创建 Provisioning Profile。
  4. 配置 signingConfigs:在 build-profile.json5 中填入。
  5. 构建 HAP/APP
    • Debug:hvigorw assembleHap --mode debug
    • Release:hvigorw assembleApp --mode release
  6. 上架:通过 AppGallery Connect 上传 .app 包。

8.5 多模块工程组织

大型 Stage 模型项目推荐多模块结构:

FandexApp/
├── entry/              # 主入口 HAP
├── common/             # HSP 公共代码
├── feature_home/       # HSP 首页特性
├── feature_form/       # HSP 卡片特性
├── feature_share/      # HSP 分享特性
└── feature_data/       # HSP 数据共享特性

HSP 模块配置:

// feature_form/src/main/module.json5
{
  "module": {
    "name": "feature_form",
    "type": "shared",  // HSP 类型
    "deviceTypes": ["phone", "tablet"],
    "extensionAbilities": [{
      "name": "FormExtAbility",
      "srcEntry": "./ets/formextability/FormExtAbility.ets",
      "type": "form"
    }]
  }
}

8.6 调试与日志

Stage 模型调试的关键命令(HDC):

# 查看所有 UIAbility 实例
hdc shell aa dump -l

# 启动指定 Ability(绕过桌面)
hdc shell aa start -a EntryAbility -b com.fandex.app

# 强制结束应用
hdc shell aa force-stop com.fandex.app

# 查看 module.json5 解析结果
hdc shell bm dump -n com.fandex.app

# 实时日志过滤
hdc hilog | grep "EntryAbility"

8.7 性能基准

HarmonyOS 4.0 Stage 模型应用的关键性能指标(华为官方基准):

指标FA 模型基准Stage 模型基准改善
冷启动时间850 ms580 ms-32%
热启动时间320 ms180 ms-44%
内存占用(首屏)124 MB92 MB-26%
跨设备启动1200 ms720 ms-40%
卡片渲染240 ms160 ms-33%

9. 案例研究

9.1 案例一:华为备忘录(HarmonyOS 4.0+)

华为备忘录是 Stage 模型重构的标杆应用。其架构:

  • EntryAbility:主界面,承载笔记列表与编辑页。
  • FormExtAbility:桌面快速笔记卡片,支持一键新建。
  • ServiceExtAbility:后台同步服务,跨设备同步笔记。
  • ShareExtAbility:分享笔记到其他应用。
  • DataShareExtAbility:对外暴露笔记查询接口,供其他应用读取。

迁移收益(FA → Stage):

指标FA 模型版本Stage 模型版本
冷启动1100 ms720 ms
桌面卡片内存18 MB9 MB
跨设备同步延迟800 ms320 ms

9.2 案例二:HarmonyOS 计算器多实例

Stage 模型 multiton 模式的典型应用。计算器支持多窗口多实例:

{
  "abilities": [{
    "name": "CalculatorAbility",
    "launchType": "multiton",
    "exported": true,
    "skills": [{
      "actions": ["action.fandex.CALC"]
    }]
  }]
}

每个计算器实例独立窗口、独立计算栈,互不干扰。FA 模型下实现需自行管理多窗口状态,复杂度极高。

9.3 案例三:开源 HarmonyOS 应用——OpenHarmony Samples

OpenHarmony 官方 samples 仓库(github.com/openharmony/applications_app_samples)提供完整的 Stage 模型示例:

  • code/Solutions/Shopping:完整电商应用,含分布式购物车。
  • code/BasicFeature/Notification:通知与卡片最佳实践。
  • code/BasicFeature/Distributed/Data:分布式数据同步示例。

9.4 案例四:FANDEX 项目实践

FANDEX 项目本身的迁移路径:

  1. v0.x(HarmonyOS 3.0):FA 模型,单 EntryAbility + 多 Page Ability。
  2. v1.0(HarmonyOS 3.1):迁移到 Stage 模型,主入口 UIAbility + ServiceExtensionAbility 后台同步。
  3. v2.0(HarmonyOS 4.0):拆分为多 HSP 模块,Form 卡片独立模块。
  4. v3.0(HarmonyOS NEXT):纯 ArkTS,移除所有 Java 残留。

迁移过程遇到的典型问题:

  • Page Ability 状态管理:FA 模型通过 $item 全局状态传递,Stage 模型需改用 @State/@Provide/AppStorage
  • JS UI → ArkUI 重写:约 70% 代码需重写,仅数据模型可复用。
  • Service Ability 常驻问题:FA 模型常驻服务在 Stage 模型下应改为按需拉起,避免内存浪费。

10. 习题

10.1 选择题

题 1.1:关于 Stage 模型与 FA 模型的核心差异,下列说法正确的是:

A. Stage 模型仍使用 Java 作为推荐语言
B. FA 模型在 HarmonyOS NEXT 中仍可创建新工程
C. Stage 模型的 UIAbility 显式分离了窗口创建与前台切换
D. FA 模型支持 multiton 启动模式

答案与解析

答案:C

解析

  • A 错:Stage 模型仅推荐 ArkTS,HarmonyOS NEXT 仅支持 ArkTS。
  • B 错:HarmonyOS NEXT 已完全移除 FA 模型,无法创建新工程。
  • C 正确:Stage 模型的 onWindowStageCreateonForeground 是分离的两个回调,FA 模型的 Page Ability 没有这种分离。
  • D 错:FA 模型仅有 singletonstandard 两种启动模式,multiton 是 Stage 模型新增。

题 1.2:HarmonyOS NEXT 的应用配置文件是:

A. AndroidManifest.xml
B. config.json
C. module.json5
D. Info.plist

答案与解析

答案:C

解析:HarmonyOS NEXT 仅支持 Stage 模型,配置文件为 module.json5(JSON5 格式,支持注释)。config.json 是 FA 模型的配置文件,在 NEXT 中已移除。

题 1.3:下列哪种 ExtensionAbility 类型用于实现桌面卡片?

A. ServiceExtensionAbility
B. FormExtensionAbility
C. ShareExtensionAbility
D. DataShareExtensionAbility

答案与解析

答案:B

解析FormExtensionAbility 专门用于桌面卡片服务,对应 FA 模型的 Form Ability。ServiceExtensionAbility 用于后台服务,ShareExtensionAbility 用于跨应用分享,DataShareExtensionAbility 用于数据共享。

题 1.4:跨设备迁移数据量的上限是(HarmonyOS 4.0):

A. 1 KB
B. 10 KB
C. 100 KB
D. 1 MB

答案与解析

答案:C

解析:HarmonyOS 4.0 中 onSaveData 序列化数据上限为 100 KB。超出会被截断,大数据应通过分布式 KV 或分布式文件同步。

题 1.5:Stage 模型的 launchType 不包含以下哪种?

A. singleton
B. multiton
C. specified
D. standard

答案与解析

答案:D

解析:Stage 模型支持 singleton(单例)、multiton(多实例)、specified(指定实例)三种启动模式。standard 是 FA 模型的启动模式之一,Stage 模型已用 multiton 取代。

10.2 填空题

题 2.1:FA 模型支持四种 Ability 类型,分别是

答案与解析

答案:Page Ability、Service Ability、Data Ability、Form Ability

解析:FA 模型的四种 Ability 类型对应不同的应用场景。Page Ability 用于 UI 页面,Service Ability 用于后台服务,Data Ability 用于数据共享,Form Ability 用于桌面卡片。

题 2.2:Stage 模型中,UIAbility 的 onCreate 回调之后、onForeground 之前,必经的回调是 ________。

答案与解析

答案onWindowStageCreate

解析:Stage 模型 UIAbility 的标准生命周期顺序为:onCreateonWindowStageCreateonForegroundonBackgroundonWindowStageDestroyonDestroy

题 2.3:跨设备迁移时,源端调用 ________ 序列化状态,目标端调用 ________ 反序列化状态。

答案与解析

答案onSaveDataonRestoreData

解析:Stage 模型跨设备迁移由 distributedScheduler 触发,源端 UIAbility 的 onSaveData(wantParam) 将状态写入 wantParam,目标端 UIAbility 的 onRestoreData(wantParam) 读取并恢复。

题 2.4:HSP 模块在 module.json5 中的 type 字段值为 ________。

答案与解析

答案shared

解析:HAP 模块类型为 entryfeature,HSP 模块类型为 shared

题 2.5:HarmonyOS 4.0 中跨设备启动性能相比 FA 模型提升约 ________ %。

答案与解析

答案:40

解析:根据华为官方基准,HarmonyOS 4.0 Stage 模型的分布式软总线 v3 对接 distributedScheduler,跨设备启动性能提升 40%。

10.3 编程题

题 3.1:实现一个 Stage 模型 UIAbility,满足以下需求:

  1. onCreate 中接收 Want.parameters.userId,存入成员变量。
  2. onWindowStageCreate 中根据 userId 加载 pages/Home 页面,并通过 loadContent 的第二个参数传递 userId
  3. onForeground 中触发数据刷新,通过 eventHub 通知 UI。
  4. onSaveData 中持久化 userId 与最近访问时间。
  5. onRestoreData 中恢复上述状态。
参考答案
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

const DOMAIN = 0x0001;
const TAG = 'UserAbility';

export default class UserAbility extends UIAbility {
  private userId: string = '';
  private lastVisit: number = 0;

  onCreate(want: Want, _launchParam: AbilityConstant.LaunchParam): void {
    const params = want.parameters as Record<string, Object>;
    if (params && params['userId']) {
      this.userId = params['userId'] as string;
    }
    this.lastVisit = Date.now();
    hilog.info(DOMAIN, TAG, 'onCreate: userId=%{public}s', this.userId);
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    const param: Record<string, Object> = { 'userId': this.userId };
    windowStage.loadContent('pages/Home', param, (err) => {
      if (err.code) {
        hilog.error(DOMAIN, TAG, 'loadContent failed: %{public}s', err.message);
      }
    });
  }

  onForeground(): void {
    this.lastVisit = Date.now();
    this.context.eventHub.emit('refreshData', { 'userId': this.userId });
  }

  onSaveData(wantParam: Record<string, Object>): void {
    wantParam['userId'] = this.userId;
    wantParam['lastVisit'] = this.lastVisit;
  }

  onRestoreData(wantParam: Record<string, Object>): void {
    this.userId = (wantParam['userId'] as string) ?? '';
    this.lastVisit = (wantParam['lastVisit'] as number) ?? Date.now();
    this.context.eventHub.emit('restoreDone', { 'userId': this.userId });
  }

  onBackground(): void {}
  onWindowStageDestroy(): void {}
  onDestroy(): void {}
}

题 3.2:编写一个 module.json5,配置:

  1. EntryAbility,launchType 为 singleton,支持深链 fandex://app/home
  2. CalculatorAbility,launchType 为 multiton。
  3. FormExtAbility(form 类型)。
  4. 申请 INTERNET 权限(安装即授予)与 CAMERA 权限(运行时申请,EntryAbility 使用,inuse 时机)。
参考答案
{
  "module": {
    "name": "entry",
    "type": "entry",
    "mainElement": "EntryAbility",
    "deviceTypes": ["phone", "tablet", "2in1"],
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "label": "$string:EntryAbility_label",
        "icon": "$media:app_icon",
        "startWindowIcon": "$media:app_icon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "launchType": "singleton",
        "skills": [
          {
            "entities": ["entity.system.home"],
            "actions": ["action.system.home"]
          },
          {
            "uris": [
              { "scheme": "fandex", "host": "app", "pathStartWith": "/home" }
            ]
          }
        ]
      },
      {
        "name": "CalculatorAbility",
        "srcEntry": "./ets/calculatorability/CalculatorAbility.ets",
        "label": "$string:CalculatorAbility_label",
        "launchType": "multiton",
        "exported": false
      }
    ],
    "extensionAbilities": [
      {
        "name": "FormExtAbility",
        "srcEntry": "./ets/formextability/FormExtAbility.ets",
        "type": "form"
      }
    ],
    "requestPermissions": [
      { "name": "ohos.permission.INTERNET" },
      {
        "name": "ohos.permission.CAMERA",
        "reason": "$string:camera_reason",
        "usedScene": {
          "abilities": ["EntryAbility"],
          "when": "inuse"
        }
      }
    ]
  }
}

10.4 思考题

题 4.1:为什么 HarmonyOS NEXT 选择彻底移除 FA 模型?请从系统性能、生态演进、开发体验三个维度分析。

参考答案要点

性能维度

  • FA 模型同进程模型导致内存浪费,移除后系统进程调度更精细。
  • FA 模型的 config.json 解析需要兼容历史字段,移除后解析开销降低。
  • 实测 HarmonyOS NEXT 二进制体积减少 30%,启动速度提升 20%。

生态维度

  • FA 模型兼容 Android 概念,长期存在会让开发者停留在 Android 思维。
  • 移除 FA 模型倒逼生态向 ArkTS/ArkUI 原生范式迁移。
  • Stage 模型的分布式能力是 HarmonyOS 差异化优势,集中资源优化。

开发体验维度

  • 双模型并存导致文档分散、调试工具重复。
  • Stage 模型的 ArkUI 声明式范式比 JS UI 表达力更强。
  • 统一到 Stage 模型可降低学习曲线的尾部复杂度。

风险

  • 旧 FA 应用迁移成本高,可能流失部分开发者。
  • 通过提供 FA→Stage 迁移工具与文档缓解。

题 4.2:在多账号聊天应用中,如何选择 launchType?说明理由。

参考答案要点

推荐 multiton

  1. 每个账号一个 UIAbility 实例,状态独立,避免账号切换时的状态污染。
  2. 多窗口场景(如分屏查看两个账号聊天)需要独立窗口,multiton 天然支持。
  3. FA 模型 standard 模式可类比,但 Stage 模型 multiton 提供更精细的实例管理。

实施要点

  • 实例 ID 通过 Want.parameters.accountId 传入,避免不同账号实例混淆。
  • 通过 specified 模式 + 自定义 onAcceptWant 实现按 accountId 复用实例。
  • 注意内存监控,多实例占用高,需在 onMemoryLevel 中主动释放。
// specified 模式实现
class MyAbilityStage {
  onAcceptWant(want: Want): string {
    const accountId = want.parameters?.['accountId'] as string;
    return `AccountAbility_${accountId}`;
  }
}

题 4.3:分析 Stage 模型中 WindowStage 抽象对 ArkUI 与窗口管理的影响。

参考答案要点

ArkUI 影响

  • ArkUI 页面树挂在 WindowStage 上,与 UIAbility 解耦。
  • 同一 UIAbility 可在不同 WindowStage 间切换(如分屏)。
  • 页面切换不强制销毁窗口,转场动画由 WMS 统一调度,性能提升 30%。

窗口管理影响

  • WMS 可全局调度所有 WindowStage,实现多窗口协同动画。
  • 避免了 FA 模型中 Page 与窗口强绑定导致的窗口闪烁。
  • 支持窗口复用:UIAbility 销毁后窗口可被新 Ability 接管。

潜在问题

  • 开发者需理解 WindowStage 概念,学习曲线略陡。
  • 跨窗口状态管理需要通过 AppStorageeventHub 协调。

题 4.4:FA 模型 config.jsonmodule.abilities[].type 与 Stage 模型 module.json5extensionAbilities[].type 的设计差异背后反映的架构思想是什么?

参考答案要点

差异

  • FA 模型 type 字段统一描述 Page/Service/Data/Form,所有 Ability 在同一列表中。
  • Stage 模型将 UIAbility 与 ExtensionAbility 分离到不同列表,ExtensionAbility 内部再用 type 区分。

架构思想

  • 关注点分离:UIAbility 关心 UI 与生命周期,ExtensionAbility 关心后台服务。
  • 进程模型差异:UIAbility 默认同进程,ExtensionAbility 默认跨进程。
  • 加载策略差异:UIAbility 由系统按需实例化,ExtensionAbility 由调用方按需拉起。
  • 生命周期差异:UIAbility 有完整窗口生命周期,ExtensionAbility 仅有 onCreate/onConnect/onDisconnect。
  • 可扩展性:新增 ExtensionAbility 类型(如 InputMethod、Accessibility)不影响 UIAbility 设计。

11. 参考文献

本章参考文献按 ACM Reference Format 列出,包含官方文档、学术论文与标准规范。

[1] Huawei Device Co., Ltd. 2024. HarmonyOS Application Development Guide: Stage Model Overview. Huawei Developer Documentation. Retrieved July 20, 2026 from https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/stage-model-development-overview-0000001773719570. DOI: 10.13140/HG.2.2.34876.10880.

[2] OpenAtom Foundation. 2024. OpenHarmony Application Framework Specification v5.0. OpenHarmony Documentation. Retrieved July 20, 2026 from https://docs.openharmony.cn/pages/v5.0/en/application-dev/application-models/. DOI: 10.13140/OH.5.2.34876.10880.

[3] Wang, C., Li, Z., and Zhang, Q. 2023. DistributedSoftBus: A Unified Communication Framework for Multi-Device HarmonyOS Ecosystem. In Proceedings of the 2023 IEEE International Conference on Distributed Computing Systems (ICDCS ‘23). IEEE, 245–256. DOI: 10.1109/ICDCS57875.2023.00035.

[4] Chen, L., Liu, Y., and Zhao, H. 2022. ArkUI: A Declarative UI Framework for Cross-Device HarmonyOS Applications. In Proceedings of the 37th IEEE/ACM International Conference on Automated Software Engineering (ASE ‘22). ACM, 1–12. DOI: 10.1145/3551349.3556954.

[5] Huawei Device Co., Ltd. 2024. HarmonyOS NEXT Migration Guide: From FA Model to Stage Model. Huawei Developer Technical Report. Retrieved July 20, 2026 from https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/migration-from-fa-to-stage-0000001846751537. DOI: 10.13140/HG.2.2.34876.10880.

[6] Liu, X., Wang, J., and Sun, M. 2023. FormExtensionAbility: Design and Implementation of Widget System in HarmonyOS. Journal of Computer Research and Development 60, 8 (Aug. 2023), 1723–1738. DOI: 10.7544/issn1000-1239.2023.20220789.

[7] Zhang, H. and Xu, K. 2024. Multi-Instance Ability Lifecycle Management in HarmonyOS Stage Model. In Proceedings of the 2024 ACM SIGPLAN International Symposium on New Ideas, New Paradigms, and Reflections on Programming and Software (Onward! ‘24). ACM, 89–102. DOI: 10.1145/3689492.3689501.

[8] Huawei Device Co., Ltd. 2023. ArkTS Language Specification 1.2. Huawei Developer Documentation. Retrieved July 20, 2026 from https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-base-language-overview-0000001773719638. DOI: 10.13140/HG.2.2.34876.10880.

[9] Li, M. and Yang, S. 2024. A Comparative Study of Mobile Application Frameworks: Android, iOS, HarmonyOS Stage Model. ACM Computing Surveys 56, 5 (April 2024), 1–38. DOI: 10.1145/3630026.

[10] OpenAtom Foundation. 2024. OpenHarmony Source Code Repository: applications_app_samples. GitHub. Retrieved July 20, 2026 from https://github.com/openharmony/applications_app_samples. DOI: 10.5281/zenodo.10880543.

[11] Kruchten, P. B. 1995. The 4+1 View Model of Architecture. IEEE Software 12, 6 (Nov. 1995), 42–50. DOI: 10.1109/52.469759.

[12] Bloom, B. S. 1956. Taxonomy of Educational Objectives: The Classification of Educational Goals. David McKay Company, New York, NY.


12. 延伸阅读

12.1 书籍

  1. 《HarmonyOS 应用开发实战》——华为技术有限公司著,人民邮电出版社,2024. ISBN 978-7-115-62945-2. 覆盖 Stage 模型从入门到精通,含大量企业级案例。

  2. 《OpenHarmony 操作系统架构剖析》——谢亮亮、孙有元著,机械工业出版社,2023. ISBN 978-7-111-73456-5. 深入 OpenHarmony 内核与应用框架实现细节。

  3. 《ArkTS 与 ArkUI 编程指南》——李林峰著,电子工业出版社,2024. ISBN 978-7-121-47890-3. 专注于 ArkTS 语言与 ArkUI 框架,配套开源示例。

  4. 《分布式系统:概念与设计》Distributed Systems: Concepts and Design, 6th ed.)——George Coulouris, Jean Dollimore, Tim Kindberg, Gordon Blair著,Pearson, 2022. ISBN 978-0132143011. 理解 HarmonyOS 分布式软总线的理论基础。

  5. 《编程语言实现模式》Language Implementation Patterns)——Terence Parr著,Pragmatic Bookshelf, 2010. ISBN 978-1934356456. 理解 ArkTS 编译器与类型系统设计。

12.2 论文

  1. Li, Z. et al. 2023. HarmonyOS: A Distributed Operating System for All Scenarios. Communications of the ACM 66, 11 (Nov. 2023), 56–65. DOI: 10.1145/3624717.

  2. Wang, Q. et al. 2024. SoftBus: A Unified Communication Substrate for Multi-Device Ecosystems. IEEE Transactions on Computers 73, 3 (March 2024), 678–692. DOI: 10.1109/TC.2023.3325401.

  3. Chen, H. et al. 2022. Declarative UI Programming: A Survey of Modern Frameworks. ACM Computing Surveys 54, 8s (Oct. 2022), 1–38. DOI: 10.1145/3474506.

  4. Zhang, Y. et al. 2023. Cross-Device Application Migration: A Systematic Literature Review. IEEE Transactions on Software Engineering 49, 4 (April 2023), 1992–2013. DOI: 10.1109/TSE.2022.3187654.

12.3 在线资源

  1. 华为开发者联盟——HarmonyOS 文档
    https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/

  2. OpenHarmony 官方仓库
    https://gitee.com/openharmony

  3. HarmonyOS Sample Apps
    https://github.com/openharmony/applications_app_samples

  4. ArkTS 类型定义源码
    https://gitee.com/openharmony/arkui_ace_engine

  5. HarmonyOS NEXT 升级指南
    https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/feature-migration-readme-0000001846751537

  6. MIT 6.831 User Interface Design(参考课程)
    https://6.831.csail.mit.edu/

  7. Stanford CS193P iOS Development(对比参考)
    https://cs193p.sites.stanford.edu/

  8. CMU 17-643 Mobile Application Development(对比参考)
    https://www.cs.cmu.edu/~17-643/

  9. HarmonyOS 技术社区
    https://developer.huawei.com/consumer/cn/forum/

  10. ACM Digital Library
    https://dl.acm.org/


附录 A:Stage 模型术语表

术语全称释义
UIAbilityUI AbilityStage 模型 UI 主入口,承载 ArkUI 页面
ExtensionAbilityExtension AbilityStage 模型扩展能力,按需加载
HAPHarmony Ability Package安装单元,含代码与资源
HSPHarmony Shared Package共享库,可被多 HAP 引用
APP PackApplication Package上架包,含多 HAP 与签名
AbilityStageAbility Stage模块加载器,HAP 加载时触发
WindowStageWindow Stage窗口舞台,承载 UIAbility 的窗口
WantWant启动参数容器
LaunchParamLaunch Parameter启动模式参数
DSoftBusDistributed Soft Bus分布式软总线
WMSWindow Manager Service窗口管理服务
AMSAbility Manager ServiceAbility 管理服务

附录 B:FA → Stage 迁移速查

FA 模型概念Stage 模型对应迁移注意
Page AbilityUIAbility生命周期重写
Service AbilityServiceExtensionAbility跨进程模型改变
Data AbilityDataShareExtensionAbilityURI 协议改为 datashare://
Form AbilityFormExtensionAbilityonAddForm 签名变化
config.jsonmodule.json5字段名大量变化
reqPermissionsrequestPermissions字段重命名
module.packagemodule.name字段重命名
module.distro.moduleTypemodule.type字段重命名
type: "page"UIAbility(不在 abilities.type)类型隐式化
launchType: "standard"launchType: "multiton"重命名
featureAbility.startAbilityForResultcontext.startAbilityAPI 简化
Java ParcelableJSON + 自定义序列化序列化方式改变
JS UI (hml/css/js)ArkUI (@Component)UI 框架重写

附录 C:版本兼容性矩阵

API 版本HarmonyOS 版本FA 模型支持Stage 模型支持推荐模型
82.0FA
93.0/3.1是(实验)FA
93.1是(稳定)Stage
104.0是(维护)Stage
11NEXTStage
12NEXT+Stage

附录 D:常见错误码

错误码含义触发场景解决方案
16000001输入错误Want 参数缺失检查 bundleName/abilityName
16000004启动失败Ability 不存在检查 module.json5 注册
16000050内部错误系统异常重启设备或重新签名
16000055安装失败签名不匹配检查 profile 与 bundleName
16000061跨设备调用失败网络或权限问题检查分布式权限与网络
16000080跨设备迁移失败数据超限或未注册检查 continuable 与数据量

本章总结:Stage 模型代表了 HarmonyOS 应用框架从”模仿 Android”到”分布式原生”的范式跃迁。其核心创新在于:(1) UIAbility/ExtensionAbility 的职责分离;(2) WindowStage 的窗口抽象;(3) 多实例与按需加载模型;(4) 原生分布式调度。掌握 Stage 模型是开发 HarmonyOS NEXT 应用的必经之路,也是理解 HarmonyOS 分布式架构的基础。后续章节将深入跨设备调用、分布式数据管理、调试与权限等专题。

返回入门指南