HAP与HSP的作用与区别
HAP(Harmony Ability Package)
HAP是应用安装和运行的基本单元,分为两种类型:
- entry:应用的主模块,作为应用的入口,提供基础功能,一个应用对同一设备类型必须有且只有一个entry类型的HAP
- feature:应用的动态特性模块,作为能力扩展,可根据需求和设备类型选择性安装
配置示例(feature类型HAP):
bash
{
"module": {
"name": "application",
"type": "feature",
"description": "$string:module_desc",
"mainElement": "ApplicationAbility",
"deviceTypes": ["phone"],
"deliveryWithInstall": false,
"installationFree": false,
"pages": "$profile:main_pages",
"abilities": [
{
"name": "ApplicationAbility",
"srcEntry": "./ets/applicationability/ApplicationAbility.ets",
"description": "$string:ApplicationAbility_desc",
"icon": "$media:layered_image",
"label": "$string:ApplicationAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background",
"exported": true
}
]
}
}
HSP(Harmony Shared Package)
HSP是动态共享包,分为应用内HSP和集成态HSP,主要优势:
- 多个HAP/HSP共用代码和资源,提高复用性和可维护性
- 编译打包时仅保留一份HSP代码和资源,有效控制应用包大小
- 运行时按需加载,提升应用性能
HAP、HAR、HSP对比:
规格 | HAP | HAR | HSP |
---|---|---|---|
支持声明UIAbility组件 | √ | × | × |
支持声明pages页面 | √ | × | √ |
包含资源文件与.so文件 | √ | √ | √ |
可独立安装运行 | √ | × | × |
鸿蒙工程目录结构
工程级目录
bash
MyApplication/
├── AppScope/ # 应用全局资源和配置
├── entry/ # 主模块,编译生成HAP
├── oh_modules/ # 工程依赖包
├── build-profile.json5 # 工程级配置信息
├── hvigorfile.ts # 工程级编译构建脚本
└── oh-package.json5 # 工程级依赖配置
模块级目录(entry)
ruby
entry/
├── src/
│ └── main/
│ ├── ets/ # ArkTS源码目录
│ │ ├── entryability/ # 应用入口能力
│ │ └── pages/ # UI页面
│ ├── resources/ # 模块资源文件
│ └── module.json5 # 模块配置文件
├── build-profile.json5 # 模块级配置
└── hvigorfile.ts # 模块级构建脚本
关键目录说明
- AppScope/resources:应用全局资源,包括字符串、颜色、图片等
- entry/src/main/ets:存放ArkTS源码,按功能分为entryability和pages
- resources:分为element(字符串、颜色等)和media(图片、音频等)
- module.json5:模块配置文件,定义模块名称、类型、能力等
module.json5配置详解
核心配置项
bash
{
"module": {
"name": "entry", # 模块名称
"type": "entry", # 模块类型(entry/feature/har/shared)
"description": "$string:module_desc", # 模块描述
"mainElement": "EntryAbility", # 入口能力名称
"deviceTypes": ["phone", "tablet"], # 支持的设备类型
"deliveryWithInstall": true, # 是否随应用一起安装
"installationFree": false, # 是否支持免安装运行
"pages": "$profile:main_pages", # 页面配置
"abilities": [ # 能力列表
{
"name": "EntryAbility", # 能力名称
"srcEntry": "./ets/entryability/EntryAbility.ets", # 代码路径
"icon": "$media:icon", # 图标资源
"label": "$string:EntryAbility_label", # 标签
"exported": true, # 是否导出
"skills": [ # 技能配置
{
"entities": ["entity.system.home"],
"actions": ["ohos.want.action.home"]
}
]
}
]
}
}
配置项说明
- deviceTypes:指定模块支持的设备类型,如phone、tablet、tv等
- abilities:定义应用的能力,每个ability对应一个功能模块
- skills:声明能力可以响应的动作,如启动应用、打开链接等
- requestPermissions:申请的权限列表,如网络访问、位置信息等
模块化开发案例分析
案例1:多窗口笔记应用
typescript
// 笔记编辑模块1:NoteEditAbility.ets
@Entry
@Component
struct NoteEditor1 {
@State text: string = "笔记内容1"
build() {
Column() {
TextEditor({ text: this.text })
.onChange((newText) => { this.text = newText })
Button("发送到窗口2").onClick(() => {
postMessage("NOTE_DATA", this.text) // 跨窗口通信
})
}
}
}
// 笔记编辑模块2:NoteEditAbility2.ets
@Entry
@Component
struct NoteEditor2 {
@State receivedText: string = ""
onMessageReceived(type: string, data: string) {
if (type === "NOTE_DATA") this.receivedText = data
}
}
案例2:购物车按需加载
javascript
// 主工程(Entry HAP)
import { FeatureManager } from '@ohos.ability.featureAbility'
Button("联系客服")
.onClick(async () => {
try {
await FeatureManager.installFeature("customer_service.hsp")
startAbility({
bundleName: "com.shop.app",
abilityName: "CustomerServiceAbility"
})
} catch (error) {
prompt.showToast("功能下载中,请稍后...")
}
})
模块化优势
- 独立开发:不同团队可并行开发不同模块
- 按需加载:非核心功能动态下载,减少初始安装包大小
- 性能优化:HSP运行时复用,减少内存占用和加载时间
- 多端适配:针对不同设备类型分发不同模块
2025年鸿蒙开发最新动态
HarmonyOS Next新特性
- 模块化增强:HSP支持更多动态共享能力,优化跨应用资源共享
- API更新:API 18新增多项能力,如应用上下文加密、进程名获取等
- 开发工具:DevEco Studio 5.0提供更强大的模块化调试支持
- 性能优化:启动速度提升30%,内存占用减少20%
开发趋势
- 分布式应用:多设备协同能力增强,支持跨设备UI共享
- 元服务:轻量级应用形态,支持免安装运行
- AI集成:更紧密的AI能力集成,支持智能推荐、语音交互等
总结
鸿蒙开发的模块化设计是实现高效开发、多端部署的核心。通过合理使用HAP和HSP,开发者可以构建出体积小、性能优、易维护的应用。随着HarmonyOS Next的发布,模块化能力进一步增强,为开发者提供了更多灵活性和可能性。掌握HAP/HSP的使用和工程结构设计,将成为鸿蒙开发者的必备技能。