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

相关推荐
2501_9444241242 分钟前
Flutter for OpenHarmony游戏集合App实战之记忆翻牌表情图案
开发语言·javascript·flutter·游戏·harmonyos
2501_9444241242 分钟前
Flutter for OpenHarmony游戏集合App实战之数字拼图打乱排列
android·开发语言·flutter·游戏·harmonyos
2501_944526421 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 知识问答游戏实现
android·开发语言·javascript·python·flutter·游戏·harmonyos
2501_944424122 小时前
Flutter for OpenHarmony游戏集合App实战之数字拼图滑动交换
android·开发语言·flutter·游戏·harmonyos
不会写代码0003 小时前
Flutter 框架跨平台鸿蒙开发 - 手写笔记工具开发教程
笔记·flutter·华为·harmonyos
小风呼呼吹儿3 小时前
Flutter 框架跨平台鸿蒙开发 - 老年便捷助手:打造适合老年人的智能工具箱
flutter·华为·harmonyos
lbb 小魔仙3 小时前
【Harmonyos】开源鸿蒙跨平台训练营DAY3:为开源鸿蒙跨平台工程集成网络请求能力,实现数据清单列表的完整构建与开源鸿蒙设备运行验证(及常见问题与方法)
windows·开源·harmonyos·鸿蒙·开源鸿蒙·鸿蒙开平台应用
奔跑的露西ly3 小时前
【HarmonyOS NEXT】Stage模型与FA模型对比
华为·harmonyos·鸿蒙
小雨下雨的雨3 小时前
禅息:在鸿蒙与 Flutter 之间寻找呼吸的艺术
算法·flutter·华为·重构·交互·harmonyos
[H*]3 小时前
Flutter框架跨平台鸿蒙开发——Image综合应用
flutter·华为·harmonyos