写点什么

【HarmonyOS】HAR 和 HSP 循环依赖和依赖传递问题详解

作者:GeorgeGcs
  • 2025-07-03
    上海
  • 本文字数:1391 字

    阅读完需:约 5 分钟

【HarmonyOS】HAR和HSP循环依赖和依赖传递问题详解

【HarmonyOS】HAR 和 HSP 循环依赖和依赖传递问题详解

一、前言

1、循环依赖是什么?这里特指依赖包的关系。例如:包 A,被 B、C 引入依赖,BCA 之间又互相引入依赖。


2、依赖传递又是什么?这里特指依赖包的关系。例如:包 A,依赖 B,B 又依赖 C,A 如果可以调用 C,那就是依赖传递。


3、HAP 和 HSP 是什么?HAP 和 HSP,都是 HarmonyOS 项目中的 SDK 包类型。


HAR(Harmony Archive) 是静态共享包。HSP(Harmony Shared Package) 是动态共享包。


HAR 是编译时打包进依赖 HAP、启动时已在内存可直接调用、加载效率高但可能导致包膨大的静态包,而 HSP 是运行时按需加载、需额外操作但能避免重复拷贝的动态共享包。


二、HAR 不支持依赖传递,也不支持循环依赖


如上图所示,这就是典型的循环依赖和依赖传递场景。1 被 2 依赖,2 反过来又依赖 1,2 被 3 依赖,3 又依赖 1。


在鸿蒙中 HAR 包是不允许循环依赖,如果这么做,会报错。并且也不支持依赖传递,HAR1 想直接使用 HAR3 的资源,只能去引用 HAR3,才可以直接使用其资源。


通过将 HAR 包间的依赖关系转移至 HAP/HSP 中配置,利用变量动态 import 实现依赖解耦,避免循环依赖问题。

动态 import 可实现依赖解耦,解决循环依赖问题:

当遇到循环依赖时,如果只是本地的 HAR 包之间,可使用动态 import 可实现依赖解耦。将上图的依赖关系,改成如下方式,通过动态修改



1、原始依赖场景


HAP 依赖 HAR1,HAR1 依赖 HAR2(通过变量动态 import)。



// har1的oh-package.json5 "dependencies": { "har2": "file:../har2" } // har1的build-profile.json5 "runtimeOnly": { "packages": ["har2"] }
复制代码


2、转移后配置


将 har1 对 har2 的依赖转移至 HAP 中:



// HAP的oh-package.json5 "dependencies": { "har1": "file:../har1", "har2": "file:../har2" } // HAP的build-profile.json5 "runtimeOnly": { "packages": ["har1", "har2"] }
复制代码


har1 不再配置对 har2 的依赖,通过变量动态 import 调用har2的接口:



// har1的Calc.ets let harName = 'har2'; import(harName).then((ns) => ns.addHar2(4, 5));
复制代码

注意点

1、被转移依赖的 HAR 之间只能通过变量动态 import,不能有静态 import 或常量动态 import。转移依赖时,dependencies 和 runtimeOnly 依赖配置要同时转移


2、转移依赖的整个链路上只能有 HAR,不能跨越 HSP 转移。即:HAP->HAR1->HAR2->HSP->HAR3->HAR4,HAR1 对 HAR2 的依赖可以转移到 HAP 上,HAR3 对 HAR4 的依赖可以转移到 HSP 上。但是,不能将 HAR3 或 HAR4 转移到 HAP 上。


3、引用其他工程模块、远程包或集成 HSP 时,需保证useNormalizedOHMUrl配置一致(均为truefalse),避免运行时报错(运行时报错:Cannot find dynamic-import module library。)。

三、HSP 不支持依赖传递,也不支持循环依赖

与 HAR 一致,HSP 也不支持依赖传递和循环依赖。


不支持 HSP 循环依赖:例如有三个 HSP,HSP-A、HSP-B 和 HSP-C,循环依赖指 HSP-A 依赖 HSP-B,HSP-B 依赖 HSP-C,HSP-C 又依赖 HSP-A。不支持循环依赖会报错。


不支持 HSP 依赖传递:例如有三个 HSP,HSP-A、HSP-B 和 HSP-C,依赖关系是 HSP-A 依赖 HSP-B,HSP-B 依赖 HSP-C。不支持传递依赖指 HSP-A 可以使用 HSP-B 的方法和组件,但是 HSP-A 不能直接使用 HSP-C 的方法和组件。


并且 HSP 不支持转移依赖。即:HAP->HSP1->HSP2->HSP3,这里的 HSP2 和 HSP3 不能转移到 HAP 上面。


如果两个 HSP 相互依赖,使用对方的组件。可修改为将需要共用的组件抽离出来,然后放到一个共享包中使用。

发布于: 刚刚阅读数: 2
用户头像

GeorgeGcs

关注

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

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

评论

发布
暂无评论
【HarmonyOS】HAR和HSP循环依赖和依赖传递问题详解_鸿蒙_GeorgeGcs_InfoQ写作社区