HAP、HAR、HSP 详解

3 阅读5分钟

一、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: 用户用到时才从应用市场下载
  }
}

核心能力

  • ✅ 可以声明 UIAbilityExtensionAbility 组件
  • ✅ 可以声明 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 包中存在两份!

核心能力

  • ✅ 可以声明 UIAbilityExtensionAbility 组件
  • 不能在配置文件中声明 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+)

核心能力

  • ✅ 可以声明 UIAbilityExtensionAbility 组件
  • ✅ 可以声明 pages 页面
  • ✅ 可以包含资源文件和 .so 文件
  • ✅ 可以依赖其他 HAR 和 HSP
  • 应用内 HSP 不能独立发布到 OHPM 仓库,必须随宿主应用一起发布

适用场景

  • 多个 HAP/HSP 共用的代码和资源,想避免重复拷贝、减小包体积
  • 需要跨模块共享单例状态
  • 元服务分包预加载
  • 大体积公共资源(如图片、视频等)

注意事项

⚠️ 版本号限制:HSP 的版本号需要与宿主 HAP 的版本号严格一致,版本演进存在耦合。

⚠️ 性能代价:HSP 在安装和加载时有一定性能损耗。过多的 HSP 可能影响安装速度和 App 启动性能。


四、三者全面对比

对比维度HAPHARHSP
全称Harmony Ability PackageHarmony ArchiveHarmony 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图书馆里唯一的"公共参考书"——谁用谁去翻,不重复占地方,但翻书需要时间。