鸿蒙开发核心概念与工程结构

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的使用和工程结构设计,将成为鸿蒙开发者的必备技能。

鸿蒙开发学习

相关推荐
HarderCoder8 小时前
重学仓颉-16宏系统完全指南
harmonyos
鸿蒙小灰9 小时前
鸿蒙卡片常见问题与最佳实践
harmonyos
冯志浩10 小时前
Harmony Next - 手势的使用(二)
harmonyos·掘金·金石计划
爱笑的眼睛1112 小时前
HarmonyOS应用开发:深入探索Stage模型与ArkUI声明式开发
华为·harmonyos
HarderCoder14 小时前
重学仓颉-15网络编程完全指南
harmonyos
安卓开发者15 小时前
鸿蒙Next媒体展示组件实战:Video与动态布局全解析
华为·harmonyos·媒体
HarderCoder16 小时前
重学仓颉-14I/O 系统完全指南
harmonyos
森之鸟17 小时前
开发中使用——鸿蒙CoreSpeechKit语音识别
华为·语音识别·harmonyos
爱笑的眼睛1118 小时前
HarmonyOS 应用开发:基于API 12+的现代开发实践
华为·harmonyos