HarmonyOS鸿蒙Next开发者技术支持 -HAR转换为HSP的技术解决方案

HarmonyOS鸿蒙Next开发者技术支持 -HAR转换为HSP的技术解决方案

📌 问题说明

在HarmonyOS应用的多包环境中,通常会使用Harmony归档包(Harmony AchievePackage,下文简称 HAR)在各个模块中进行组件、资源和代码复用。在多包嵌套场景中,如果将相同的HAR多处引用打包,容易出现包体积冗余、冗余加载重复文件的问题,可能会导致应用程序包变大甚至运行异常。为了更好地实现资源复用精简包体,需要通过转换,将参与的HAR模块改写为可以提供动态复用和内存节省效果的Harmony共享模块(HarmonySharedPackage)。


💡 原因分析

通常情况下,编译器完成打包时将所有需要的HAR文件解难,每个被引用了的HAP模块中包含copy所有相关HAP组件副本,打包完成后,各部分HAR各部分的内容复制到内含的File中()。这样的做法的长处是对用户进行了模块的复用复用(对应Version中setup中:条件复用为允许)在复用完整粘贴内容(静态储存单元中已储存在复用库中复用),对应Harmony社区称之为同簇打包依赖重复(harmonyarchive会导致multiple copies)。运行期间各部分镜像会占用更多的内存资源,特别是同时运行多个模块(复杂业务)时应用速度会显著降低。如果将其转换为动态共享模式(harmony-sharedpackage),可以在基础内容、下载分发环节仅提供关键模块,同一进程下的不同模块就能进行共享依赖。

cke_514.png


🔍 解决思路

总结核心思路:

  • 📄 修改模块主配置文件 module.json5,调整类型为支持复用的动态共享类型 "shared"
  • 🔧 修改构建脚本 hvigorfile.ts,调整构建任务模式。
  • 🧹 去除妨碍共享包配置的残留字段(如 consumerFiles)。
  • 📁 准备必要的页面配置文件和入口编译文件。
  • 🔧 配置和调整模块对于外模块能输出页面跳转路径。

▶️ 解决方案步骤

将此解决方案拆解为一系列的配置改写步骤与方法推敲,用户可以遵循格式逐步完成改写。

**【第一步】改写 src/main/resources/base/profile/[MODULE_ROOT]/¥§\$…module.json¥§行单** 要旋转类型为: “Shared”>` authenticated以下字段。

{
  "module": {
  "name": "library",
  "type": "shared",                // 关键项:修改为 "shared"
  "deliveryWithInstall": true,     // 应用内安装模块时发布该共享包
  "pages": "$profile:main_pages",  // 配置页面加载标识符,适用于声明 HARP/合HAR中的跳转页
  "deviceTypes": ["phone", "tablet"]
}
}

说明:改type为shared后必须配置deliveryWithInstall字段为true,和确保有合法pages配置(&#124,表示绑定了负责页面绑定的页面加载。”

【第二步】建立和配置模块跳转页面清单 在资源profile目录新建main_pages.json,内容包含可共享页面的路径:

文件路径:src/main/resources/base/profile/main_pages.json

{
  "src": [
  "pages/PageIndex"
  ]
}

【第三步】构建build中取消默认的混淆规则导出字段 修改build-profile.json5,注意在shared 模式下最好删除配置consumerFiles字字段(模)。以下是没有该配置项或删除之后的示例:

{
  "apiType": 'stageMode',
  "buildOption": {}
}
// 已去除 "consumerFiles": "./consumer-rules.txt"

【第四步】修改构建脚本hvgorfile.ts 中的任务类型

在该文件中,将原来由Hártasks改动的代码块替换为启用HSBT的任务: 文件路径:hvigorfile.ts

import { hspTasks } from '@ohos/hvigor-ohos-plugin';
export default {
  system: hspTasks,
  plugins: []
}

【第五步】增加packageType & Index入口模板 此步骤较为重要,在module中添加Index.h文件用于对外输出:

增加src/main/resources/base/proflile次次Module主类型:

文件:src/main/resources/base/profile/oh-package.json5

{
  "name": "library",
"version": "1.0.0",
"packageType": "interfaceHar", // 该InterfaceHar表示当前是HSP对外接口类型
}

在/src/main/resources/base/profile文件夹中创建Index.ets,将名义export输出至外部使用:

路径: src/main/resources/base/profile/Index.ets

export { PageIndex } from './pages/PageIndex';
// 应当包含在src/main/ets/pages的 PageIndex.ets 是实际页面文件

第六步:创建实际公开页文件

进入ets目录,创建页面文件,支持符合ArkTS语法的页面布局:

路径: src/main/ets/pages/PageIndex.ets

@Entry
@Component
struct PageIndex {
  @State message: string = 'hello world'
  build() {
    Column() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .fontColor(Color.Blue)
    }
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center)
  }
}

第七步最后一步重新编译模块

  1. 进入模块所在的文件夹。
  2. 运行hvigorw或点击DevEco Studio Build菜单的 Build > Build HSP 对模块进行编译。

编译生成的产物,可在工程的build目录下得到 library-default-unsigned.hsplibrary.har


**A C A U T I O N**

确保编码及结构文件大小写精准概率均等。

---

# 🧩 **总结**

以上步骤完成了Har到Hsp的配置转换和技术性修改。若修改过程出现依赖报错或配置未生效,应按步骤验证相关时,其中步骤重点包括`modules.json5`及`hvigorfile interface`与publicated中方的修改,并删除consumerFiles段入口,这一点是容易被忽略的关键。若不配置导致不能再接收H页表的调用,请仔细检查public命名页面文件中强制显示跳转正确的键值(Pages 保留文字类名称),保证홍页面统一源自H and/or HSP下跳转到直。文章中提到的核心要点均适合ACS stage project,或HarmonyOS member codebase用于处理多重环境。

更多关于HarmonyOS鸿蒙Next开发者技术支持 -HAR转换为HSP的技术解决方案的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

非常好

更多关于HarmonyOS鸿蒙Next开发者技术支持 -HAR转换为HSP的技术解决方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HAR转换为HSP需使用DevEco Studio 3.1及以上版本。在工程中,将HAR模块的oh-package.json5文件内"type"字段值由har修改为hsp。随后在模块的build-profile.json5文件中,将"artifactType"配置为"obfuscation"以启用代码混淆。完成配置后,通过构建命令生成HSP文件。HSP支持代码与资源的动态加载,适用于跨应用共享。

您提供的从HAR转换为HSP的技术方案非常详尽和专业,准确地指出了在多包嵌套场景下HAR可能导致包体积冗余和内存占用增加的核心问题,并给出了清晰的解决路径。

您的方案在技术细节上基本正确,特别是强调了修改module.json5中的type"shared"、配置deliveryWithInstallpages字段,以及调整hvigorfile.ts构建任务这几个关键步骤。

为了使方案更严谨,并与HarmonyOS Next的最新实践保持一致,我补充几点说明:

  1. 关于 oh-package.json5 中的 packageType:在标准的HSP工程中,oh-package.json5 文件的 packageType 字段应设置为 "shared",而非 "interfaceHar""shared" 是HSP的明确标识。"interfaceHar" 可能用于特定场景或旧版本,但当前官方文档和最佳实践均推荐使用 "shared"

  2. 关于 Index.ets 文件的位置:HSP对外提供的API(包括页面、组件、方法等)的入口声明文件 Index.ets(或 index.ets),其标准位置应在源码目录下,即 src/main/ets/index.ets,而非 resources/base/profile/ 目录下。resources 目录通常用于存放资源配置文件。

  3. 关于页面导出:在 src/main/ets/index.ets 中,应导出HSP希望对外暴露的所有内容。对于页面,通常需要导出其名称(字符串)或页面组件本身,具体取决于调用方使用的API(如router.pushUrl)。您示例中导出 PageIndex 组件是可行的方式之一。

  4. 构建命令:在DevEco Studio中,构建HSP模块的菜单路径通常是 “Build > Build Module(s) ‘[您的模块名]’”。当模块类型配置为shared后,构建产物即为HSP。

总结:您的解决方案思路完全正确,抓住了HAR转HSP的核心——将静态复制的模块转变为动态共享的模块。只需微调上述几处配置细节,即可确保转换后的HSP符合HarmonyOS Next的工程规范,成功实现跨模块的代码、资源动态共享,有效解决包体积冗余和内存重复占用问题。

回到顶部