不同维度的对比




在鸿蒙(HarmonyOS)开发中,HAP、HAR 和 HSP 是三种关键的包格式,分别承担不同的角色和功能。以下是它们的详细对比与使用场景解析:
1. 核心概念
类型 | 全称 | 定位 | 特点 |
---|
HAP | HarmonyOS Ability Package | 应用部署包(安装单元) | 直接运行在设备上,包含独立功能模块 |
HAR | HarmonyOS Archive | 静态共享包(开发期复用) | 编译时嵌入,代码/资源复制到依赖模块 |
HSP | HarmonyOS Shared Package | 动态共享包(运行期复用) | 运行时动态加载,多模块共享同一份代码 |
2. 详细对比
(1) HAP(应用包)
(2) HAR(静态共享包)
(3) HSP(动态共享包)
3. 使用场景
(1) 选择 HAP 的场景
- 需要独立安装的功能模块(如电商应用的商品详情模块)。
- 按需加载场景(如游戏中的关卡资源包)。
(2) 选择 HAR 的场景
- 公共工具类(如日志工具
LoggerUtil
)。 - 自定义 UI 组件库(如统一按钮样式
ButtonStyle
)。
(3) 选择 HSP 的场景
- 多应用共享的核心 SDK(如支付 SDK)。
- 动态主题/皮肤切换功能。
- 高频更新的业务逻辑(如 A/B 测试功能)。
4. 技术实现对比
维度 | HAP | HAR | HSP |
---|
打包内容 | Ability、资源、依赖库 | 代码、资源、不含 Ability | 代码、资源、不含 Ability |
依赖方式 | 独立安装 | 编译时复制到依赖模块 | 运行时动态加载 |
代码隔离 | 独立沙箱环境 | 代码与依赖模块合并 | 独立 ClassLoader 加载 |
版本管理 | 可独立更新 | 需重新编译所有依赖模块 | 可独立更新(需兼容性保证) |
5. 开发示例
(1) 定义 HAR
- 创建
utils.har
包:
export class Logger {
static info(msg: string) {
console.log(`[INFO] ${msg}`);
}
}
- 在 HAP 中引用:
{
"dependencies": {
"utils": "file:../utils.har"
}
}
(2) 定义 HSP
- 创建
network.hsp
:
export class ApiClient {
static fetchData(url: string) { }
}
- 在 HAP 中动态加载:
let hspContext = context.createBundleContext("com.example.network");
hspContext.loadHsp("network.hsp").then(() => {
const ApiClient = require("network.hsp/ApiClient");
ApiClient.fetchData("https://api.example.com");
});
6. 选择建议
- 代码复用性强且稳定 → HAR
- 多模块共享且需减少体积 → HSP
- 独立功能模块/按需安装 → HAP
通过合理组合 HAP、HAR 和 HSP,可以构建高可维护、低冗余的鸿蒙应用架构。
在鸿蒙(HarmonyOS)生态中,HAR(HarmonyOS Archive) 和 HSP(HarmonyOS Shared Package) 的命名直接体现了它们的功能特性和设计目标。以下是名称的由来及背后的逻辑:
1. HAR(HarmonyOS Archive)
(1) 名称解析
- HarmonyOS:标识其为鸿蒙生态专用格式。
- Archive(归档):源自软件工程中“静态归档文件”的概念,强调 代码/资源的静态集合,类似于 Java 的
JAR
(Java Archive)或 C/C++ 的静态库(.a/.lib
)。
(2) 命名的核心原因
- 静态复用:HAR 的内容在 编译时被复制到依赖模块 中,形成代码的静态归档(类似“粘贴”),最终产物会包含重复代码。
- 功能隐喻:
Archive
表示“封存”的代码包,开发者可通过引用 HAR 快速获取预定义的公共能力(如工具类、组件库)。
(3) 类比其他技术
鸿蒙 HAR | 其他技术类比 | 共同点 |
---|
静态共享代码/资源 | Java JAR 包 | 编译时嵌入,无法运行时共享 |
无独立进程或动态加载 | C/C++ 静态库(.a/.lib) | 直接链接到可执行文件中 |
2. HSP(HarmonyOS Shared Package)
(1) 名称解析
- HarmonyOS:标识其为鸿蒙生态专用格式。
- Shared(共享):强调 代码/资源的动态共享,类似于动态链接库(如 Windows 的
DLL
或 Linux 的 .so
)。 - Package:表明其为可独立分发、动态加载的模块化单元。
(2) 命名的核心原因
- 动态复用:HSP 在 运行时被动态加载,多个模块共享同一份代码,避免重复占用存储空间。
- 跨应用/模块协作:
Shared
体现其支持跨模块、跨应用共享的特性(需签名一致),符合鸿蒙“超级终端”的分布式理念。
(3) 类比其他技术
鸿蒙 HSP | 其他技术类比 | 共同点 |
---|
动态共享代码/资源 | Android AAR(动态特性) | 运行时加载,按需使用 |
跨模块复用 | Windows DLL | 通过动态链接减少体积 |
3. 名称背后的设计哲学
(1) HAR:静态化与开发效率
- 设计目标:快速复用稳定代码,减少重复开发。
- 名称契合点:
Archive
隐含“稳定归档”,适合长期不变的公共代码(如日期处理工具)。
(2) HSP:动态化与资源优化
- 设计目标:支持灵活扩展、减少冗余,适应多设备协同场景。
- 名称契合点:
Shared
体现分布式能力,如手机、平板共享同一主题包(HSP)。
4. 命名与功能对应表
能力维度 | HAR(Archive) | HSP(Shared Package) |
---|
复用时机 | 编译时(代码复制) | 运行时(动态加载) |
包体积影响 | 增加(重复代码) | 减少(共享代码) |
更新维护 | 需重新编译所有依赖模块 | 可独立更新(热修复支持) |
跨应用支持 | 不支持 | 支持(需相同签名) |
5. 实际应用示例
(1) HAR 场景
(2) HSP 场景
总结
- HAR 的
Archive
强调静态归档、开发期复用,适合稳定代码。 - HSP 的
Shared
突出动态共享、运行期协作,契合鸿蒙分布式架构。 - 名称与功能的精准对应,降低了开发者的理解成本,体现了鸿蒙在工程规范性上的考量。