写点什么

【HarmonyOS Next】鸿蒙中 App、HAP、HAR、HSP 概念详解

作者:GeorgeGcs
  • 2025-03-20
    上海
  • 本文字数:2231 字

    阅读完需:约 7 分钟

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解

【HarmonyOS Next】鸿蒙中 App、HAP、HAR、HSP 概念详解


(图 1-1)

一、鸿蒙中 App、HAP、HAR、HSP 是什么?



(1)App Pack(Application Package) 是应用发布的形态,上架应用市场是以 App Pack 形式上架。以 .app 后缀的文件,只能上架到应用市场,不能在设备上直接安装和运行。




(2)HAP(Harmony Ability Package) 是应用安装和运行的基本形态。


HAP 的两种类型:其主要分为两种类型:entry 和 feature:1.entry 是应用的主模块,作为应用的入口,提供应用的基础功能,一个 App 中对于同一设备类型必须有且只有一个 entry 类型的 HAP,可独立安装运行。


2.feature 是应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装,一个 App 可以包含一个或多个 feature 类型的 HAP,也可以不含。


模块配置:在 feature 模块的 module.json5 配置中,type 有 entry 和 feature 两种值,设置为后者 feature,就是 feature 模块。并且 deliveryWithInstall 设置为 false,为按需下载,用户需通过应用内引导或应用市场手动获取。


{  "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      }    ]  }}
复制代码


如上图(1-1)所示,feature 模块主要是为了动态功能扩展,按需加载优化,跨设备适配三种效果。


例如,京东 APP 的直播模块,就可以设计为 feature,用户点击直播入口才去加载,减小初始包大小。并且京东 APP 在车机和手表等不同设备上,可以适配硬件加载不同的 feature 模块。


不过需要注意的是,使用 feature 模块,需处理 Feature HAP 的加载时机、依赖关系及错误处理,避免因模块未下载导致功能不可用。(如首次使用时的网络请求和安装时间)。


feature HAP 是实现轻量化、动态化、跨设备应用的核心机制。一般是面试题目,要好好记住。




(3)HAR(Harmony Archive) 是静态共享包。说人话,HAR 可以理解为 SDK 依赖,与 HSP 的区别在加载机制上。


多包(HAP/HSP)引用相同的 HAR 时,会造成多包间代码和资源的重复拷贝,从而导致应用包膨大。不过 HAR 打包时全部打进引用方的 HSP/HAP 包中,可以节省安装和加载成本。


那为什么还需要 HAR 呢? 是因为加载效率高,HAR 在编译时就被打包到依赖它的每个 HAP 中,在应用启动时就已经随 HAP 存在于内存中,后续使用时无需额外加载步骤 ,直接调用即可。


而 HSP 是动态共享包,运行时复用,在运行时按需加载,每次使用时都需要额外的查找、加载和初始化等操作,这些操作会消耗一定时间,导致加载效率降低。


并且如果我的 HAR 包并不会在很多 HAP 中引用,那做成 HAR 包的加载效率是比做成 HSP 包高很多。




(4)HSP(Harmony Shared Package) 是动态共享包,分为应用内 HSP 和集成态 HSP。


详细区别,参加文档【HarmonyOS Next】 鸿蒙应用useNormalizedOHMUrl详解


跳转到 HSP 模块中的一个页面,如何实现:因为 HSP 中不能创建 UIAbility,那主模块 entry 下跳转到 HSP 模块中的页面需求实现如下:


import { router } from '@kit.ArkUI'; import { BusinessError } from '@kit.BasicServicesKit';  @Entry @Component struct Index {   @State message: string = '跳转到HSP页面';    build() {     Row() {       Column() {         Button() {           Text(this.message)             .fontSize(24)         }         .onClick(() => {         // '@bundle:包名(bundleName)/模块名(moduleName)/路径/页面所在的文件名(不加.ets后缀)'          router.pushUrl({             url: '@bundle:com.example.gotohsppage/library/ets/pages/Index'           }).then(() => {             console.info("Go to hSP page success.");           }).catch((err: BusinessError) => {             console.error(`Go to hSP page failed, code is ${err.code}, message is ${err.message}.`);           })         })         .width(200)       }       .width('100%')     }     .height('100%')   } }
复制代码




(5)总结


综上所述,HAR 是静态共享包,HSP 是动态共享包,它们和 HAP(应用的基本功能模块)一起被打包成 App Pack(应用发布形态)用于应用的发布与分发。

二、鸿蒙中 App、HAP、HAR、HSP 的关系

三、如何创建 App、HAP、HAR、HSP

AppBuild - Build Hap/APP - Build APP



HAP:1、在工程目录上单击右键,选择 New > Module。



2、在弹出的对话框中选择 Empty Ability 模板,点击 Next3、在 New Project Module 对话框中,进行 feature 模块类型的选择,配置 name,type 即可



HAR 和 HSP:


1、鼠标移到工程目录顶部,单击右键,选择 New > Module,在工程中添加模块。



2、在 Choose Your Ability Template 界面中,选择 Static Library 即为 HAR,选择 Shared Library 即为 HSP。



发布于: 18 小时前阅读数: 2
用户头像

GeorgeGcs

关注

路漫漫其修远兮,吾将上下而求索。 2024-12-24 加入

历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 OpenHarmony,HarmonyOS,Flutter,H5,Android,IOS。 目前任职鸿蒙应用架构师。 HarmonyOS官方认证创作先锋

评论

发布
暂无评论
【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解_鸿蒙_GeorgeGcs_InfoQ写作社区