Stage 模型下,Entry / Feature / Library 的职责划分是什么?Feature 模块如何被按需加载?多 HAP 如何通信?
1️⃣ Stage 模型下 HAP 模块的职责划分
HarmonyOS 项目可以分为 Entry / Feature / Library 三类 HAP 模块:
| 模块类型 | 主要职责 | 典型内容 | 备注 |
|---|---|---|---|
| Entry HAP | 应用入口模块 | MainAbility、全局配置、App 生命周期管理 | 每个应用必须有一个 Entry,负责应用启动和初始化全局能力。 |
| Feature HAP | 功能模块(按需加载) | 具体业务页面、UIAbility、PageAbility、服务 | 可以独立打包,按需加载,减少初始包体积。 |
| Library HAP | 公共依赖模块 | 工具类、业务逻辑组件、UI 组件库 | 不直接承载页面,可被 Entry/Feature 引用;通常是静态库或共享库。 |
✅ 核心理解:
- Entry HAP:全局能力 + 应用启动入口
- Feature HAP:业务功能模块,可动态加载
- Library HAP:通用工具库,不依赖界面生命周期
2️⃣ Feature 模块如何按需加载
按需加载 Feature 的原理:
-
动态 HAP 加载
- Feature HAP 被打包成独立模块(.hap 文件)。
- 在运行时通过 Ability Manager + Stage 模型 请求加载。
-
流程:
EntryAbility (UIAbility)
└── 调用 loadFeature("FeatureA")
├─ 系统检查 FeatureA 是否已安装/解压
├─ 加载 FeatureA 的 Ability / WindowStage
└─ 页面或服务被实例化
- 优势:
- 减少应用冷启动包体积
- 延迟加载用户未访问的功能
- 支持模块化开发、多人协作、灰度发布
- 注意事项:
- Feature HAP 内的 Ability 必须通过 Entry HAP 进行启动(启动桥接)。
- 数据和状态可以通过 Service / DataBus / global state 与 Entry 或其他 Feature 共享。
3️⃣ 多 HAP 如何通信
多 HAP(Entry + 多 Feature + Library)通信主要有以下方式:
| 通信方式 | 场景 | 说明 |
|---|---|---|
| Ability 调用 | 跨 HAP 页面跳转 | 使用 startAbility(Intent) 启动 Feature HAP 的 Ability,可携带参数和数据 |
| Data Ability / DataBus | 跨模块数据共享 | 数据库或内存共享接口,支持 CRUD 操作和数据监听 |
| 全局状态管理 | 跨 Feature 状态同步 | 通过全局单例或 ArkTS 全局状态对象(如 @Provide/@Consume) |
| Service HAP | 后台任务或能力复用 | Feature 可以注册 Service,其他模块通过 AbilityManager 获取 Service 接口调用 |
| EventBus / Observer | 松耦合通知 | 发布/订阅模式,用于广播事件或状态变化通知 |
✅ 核心原则:
- 尽量通过 AbilityManager 和系统能力桥接,避免直接依赖 HAP 文件路径
- 跨 HAP 数据传输尽量轻量化,避免大对象跨模块序列化性能损耗
4️⃣ 总结
- 模块职责划分:
- Entry:应用启动 + 全局能力
- Feature:业务功能模块,可按需加载
- Library:公共工具/组件库
- Feature 按需加载:
- 动态 HAP 加载,通过 AbilityManager / Stage 模型实例化 Ability
- 减少初始包体积,支持模块化与灰度发布
- 多 HAP 通信方式:
- Ability 调用(页面跳转)
- Data Ability / DataBus(数据共享)
- 全局状态管理(ArkTS @Provide/@Consume)
- Service HAP(后台能力复用)
- EventBus / Observer(松耦合事件通知)