【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相互依赖,使用对方的组件。可修改为将需要共用的组件抽离出来,然后放到一个共享包中使用。

相关推荐
爱笑的眼睛112 小时前
HarmonyOS后台代理提醒机制深度解析:从架构设计到场景化实践
华为·harmonyos
猫林老师4 小时前
Flutter for HarmonyOS开发指南(七):插件开发与平台能力桥接
flutter·华为·harmonyos
kirk_wang5 小时前
HarmonyOS 6.0 服务卡片实战:把「轻食刻」装进桌面,让轻断食一眼可控
华为·harmonyos
●VON19 小时前
补充说明:Windows 完全可以开发 Qt 鸿蒙应用!(附专属适配方案)
windows·qt·华为·harmonyos·鸿蒙
东林知识库21 小时前
鸿蒙5:HarmonyOS应用开发-线程模型
华为·harmonyos
猫林老师21 小时前
Flutter for HarmonyOS开发指南(九):测试、调试与质量保障体系
flutter·wpf·harmonyos
Keya1 天前
鸿蒙Next系统手机使用Charles配置证书并抓包教程
前端·harmonyos
爱笑的眼睛111 天前
HarmonyOS DataShare数据共享机制深度解析:构建分布式应用的数据桥梁
华为·harmonyos
猫林老师1 天前
Flutter for HarmonyOS开发指南(五):性能调优与性能分析全攻略
flutter·华为·harmonyos
BlackWolfSky1 天前
鸿蒙文件操作
macos·华为·harmonyos·鸿蒙