【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 HSP
打包方式 打包时全部打进引用方的包中 动态共享包,运行时复用
加载机制 编译时被打包进依赖它的HAP,应用启动时已在内存,后续可直接调用 运行时按需加载,需额外查找、加载和初始化
加载效率 高,无需额外加载步骤 低,额外操作消耗时间
适用场景 被引用次数较少等场景下加载优势明显 适用于被大量HAP引用,可避免重复拷贝

二、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)。

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

2、转移后配置

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

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

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

typescript 复制代码
     // 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 小时前
鸿蒙中declare关键字
harmonyos·declare
FrameNotWork3 小时前
HarmonyOS 6.0 输入法与键盘避让 — 聊天页面底部输入栏被键盘挡住的绝望
华为·计算机外设·harmonyos
不羁的木木4 小时前
HarmonyOS APP实战-基于Image Kit的图像处理APP - 第12篇:性能优化与内存管理
图像处理·性能优化·harmonyos
拥抱太阳06164 小时前
HarmonyOS 应用开发《掌上英语》第6篇-资源管理最佳实践多模块资源复用
pytorch·深度学习·harmonyos
2301_768103494 小时前
HarmonyOS趣味相机实战第7篇:Preferences相册缓存、旧数据兼容与异常兜底
harmonyos·arkts·preferences·本地缓存·数据兼容
HONG````5 小时前
ArkTS 并发编程:TaskPool 多线程实战
harmonyos·arkts
不羁的木木5 小时前
HarmonyOS APP实战-基于Image Kit的图像处理APP - 第8篇:图片编码与保存
图像处理·华为·harmonyos
春卷同学5 小时前
HarmonyOS掌上记账APP开发实践第2篇:从零搭建记账应用 — MoneyTrack 工程全景解析![
华为·harmonyos
春卷同学5 小时前
HarmonyOS掌上记账APP开发实践第1篇:HarmonyOS 多模块 HAR 架构最佳实践 — MoneyTrack 多模块拆分之道
华为·架构·harmonyos