一、HAP(Harmony Ability Package)
定义
HAP 是鸿蒙应用安装和运行的基本单元,是唯一能被安装到设备上、并能独立运行的包类型。它由代码、资源、第三方库、配置文件等打包而成,编译产物为 .hap 文件。
两种子类型
| 类型 | module.json5 配置 | 数量限制 | 桌面图标 | 典型职责 |
|---|---|---|---|---|
| Entry HAP | "type": "entry" | 同一设备类型仅 1 个 | ✅ 有 | 应用入口界面、入口图标、主功能特性 |
| Feature HAP | "type": "feature" | 0 个或多个 | ❌ 无 | 可插拔的扩展功能模块,支持按需下载安装 |
Feature HAP 的按需安装
Feature 模块通过 deliveryWithInstall 字段控制安装策略:
// feature 模块的 module.json5
{
"module": {
"type": "feature",
"deliveryWithInstall": true // true: 随 Entry 一起安装
// false: 用户用到时才从应用市场下载
}
}
核心能力
- ✅ 可以声明
UIAbility、ExtensionAbility组件 - ✅ 可以声明
pages页面 - ✅ 可以包含资源文件和
.so原生库 - ✅ 可以依赖 HAR 和 HSP
- ✅ 可以独立安装运行
二、HAR(Harmony Archive)
定义
HAR 是静态共享包,编译时复用。它不能独立安装运行,只能作为依赖被 HAP 或 HSP 引用。编译产物为 .har 文件。
核心机制:编译时复制
HAR 最关键的特性是 "编译时复制"——当 HAP/HSP 编译时,HAR 的代码和资源会被完整地拷贝一份打进引用方的包中。
编译前:
Entry.hap → 依赖 har-A
Feature.hap → 依赖 har-A
编译后:
Entry.hap [包含 har-A 的副本]
Feature.hap [包含 har-A 的副本]
结果:har-A 在最终 App 包中存在两份!
核心能力
- ✅ 可以声明
UIAbility、ExtensionAbility组件 - ❌ 不能在配置文件中声明
pages页面(但可以包含页面,只是不走配置文件声明) - ✅ 可以包含资源文件和
.so文件 - ✅ 可以依赖其他 HAR 和 HSP
- ✅ 可以发布到 OHPM 中心仓或私仓,作为二方库/三方库供其他应用使用
适用场景
- 公共 UI 组件库、工具类封装
- 需要独立发布到仓库供其他团队/应用使用的 SDK
- 只被单个模块引用的功能(简单直接,无需共享)
注意事项
⚠️ 包膨胀问题:如果多个 HAP/HSP 引用同一个 HAR,会造成代码和资源的重复拷贝,导致应用包体积增大。
⚠️ 单例分裂:由于每个引用方各有一份副本,HAR 中的静态变量在每个副本中独立存在,"全局单例"实际上是多个实例。
三、HSP(Harmony Shared Package)
定义
HSP 是动态共享包,运行时复用。与 HAR 不同,HSP 不会被复制进每个引用方,而是作为独立的一份在运行时被多个模块共享。编译产物为 .hsp 文件。
核心机制:运行时共享
编译前:
Entry.hap → 依赖 hsp-common
Feature.hap → 依赖 hsp-common
编译后(App 包内):
Entry.hap
Feature.hap
hsp-common.hsp ← 全应用只有一份!
结果:hsp-common 在最终 App 包中只存在一份。
两种子类型
| 类型 | 说明 | 使用方式 |
|---|---|---|
| 应用内 HSP | 编译时与应用的 bundleName 强耦合,只能给特定应用使用 | 随应用一起打包,应用内模块引用 |
| 集成态 HSP | 构建时不与特定应用耦合;使用时工具链自动替换包名并重新签名 | 可发布到 OHPM 私仓(API 12+) |
核心能力
- ✅ 可以声明
UIAbility、ExtensionAbility组件 - ✅ 可以声明
pages页面 - ✅ 可以包含资源文件和
.so文件 - ✅ 可以依赖其他 HAR 和 HSP
- ❌ 应用内 HSP 不能独立发布到 OHPM 仓库,必须随宿主应用一起发布
适用场景
- 多个 HAP/HSP 共用的代码和资源,想避免重复拷贝、减小包体积
- 需要跨模块共享单例状态
- 元服务分包预加载
- 大体积公共资源(如图片、视频等)
注意事项
⚠️ 版本号限制:HSP 的版本号需要与宿主 HAP 的版本号严格一致,版本演进存在耦合。
⚠️ 性能代价:HSP 在安装和加载时有一定性能损耗。过多的 HSP 可能影响安装速度和 App 启动性能。
四、三者全面对比
| 对比维度 | HAP | HAR | HSP |
|---|---|---|---|
| 全称 | Harmony Ability Package | Harmony Archive | Harmony Shared Package |
| 编译产物 | .hap | .har | .hsp |
| 能否独立安装运行 | ✅ 能 | ❌ 不能 | ❌ 不能 |
| 能否声明 Ability | ✅ | ✅ | ✅ |
| 能否声明 pages 页面 | ✅ | ❌ | ✅ |
| 能否发布到 OHPM | ❌ | ✅(中心仓/私仓) | ❌(应用内HSP)/ ✅(集成态HSP) |
| 复用方式 | — | 编译时复制 | 运行时共享 |
| 多模块引用 | — | 每份引用各存一份副本 → 包体积增大 | 全应用仅一份 → 包体积较小 |
| 单例行为 | 独立 | 各副本独立(单例分裂) | 全应用共享同一实例 |
| 加载时机 | 安装时 | 编译时(用空间换时间) | 运行时按需加载(用时间换空间) |
| 数量限制 | Entry 仅 1 个,Feature 可多个 | 不限 | 不限 |
五、如何选择:决策流程
这个模块需要独立安装运行吗?
├── 是 → HAP
│ ├── 是应用主入口/核心功能 → Entry HAP
│ └── 是可插拔扩展功能 → Feature HAP
│
└── 否 → 共享包
├── 需要发布到 OHPM 给其他应用用?
│ └── 是 → HAR(唯一选择)
│
├── 会被多个 HAP/HSP 引用 + 想省体积?
│ └── 是 → HSP
│
├── 需要跨模块共享单例状态?
│ └── 是 → HSP
│
├── 需要按需动态加载?
│ └── 是 → HSP
│
└── 只被单个模块引用,追求简单?
└── 是 → HAR
六、一句话总结
| 包类型 | 一句话 |
|---|---|
| HAP | 能独立安装运行的"成品书"——Entry 是封面和目录,Feature 是可插拔的章节。 |
| HAR | 编译时复印、夹进书里的"资料页"——被多处引用就复印多份,省加载时间但占地方。 |
| HSP | 图书馆里唯一的"公共参考书"——谁用谁去翻,不重复占地方,但翻书需要时间。 |