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

GeorgeGcs
• 阅读 7

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

一、前言

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

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

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

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

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

对比项 HAR HSP
打包方式 打包时全部打进引用方的包中 动态共享包,运行时复用
加载机制 编译时被打包进依赖它的HAP,应用启动时已在内存,后续可直接调用 运行时按需加载,需额外查找、加载和初始化
加载效率 高,无需额外加载步骤 低,额外操作消耗时间
适用场景 被引用次数较少等场景下加载优势明显 适用于被大量HAP引用,可避免重复拷贝
## 二、HAR不支持依赖传递,也不支持循环依赖

【HarmonyOS】HAR和HSP循环依赖和依赖传递问题详解 如上图所示,这就是典型的循环依赖和依赖传递场景。 1被2依赖,2反过来又依赖1,2被3依赖,3又依赖1。

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

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

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

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

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

点赞
收藏
评论区
推荐文章
徐小夕 徐小夕
3年前
lerna + dumi + eslint多包管理实践
背景在开发大型项目时,我们通常会遇到同一工程依赖不同组件包,同时不同的组件包之间还会相互依赖的问题,那么如何管理组织这些依赖包就是一个迫在眉睫的问题.我们目前已有的方案有:Multirepo(多个依赖包独立进行git管理)和Monorepo(所有依赖库完全放入一个项目工程).Multirepo的缺点在于每个库变更之后,需要发布到线上,然后在项目
0源码基础学习Spring源码系列(二)——Spring如何解决循环依赖
本篇文章适用于0基础学习spring源码,文章重点解析spring如何解决循环依赖,并从解决循环依赖过程、三级缓存在循环依赖中的作用、解决代理对象的问题、二级缓存、初始化几个维度出发,解析spring源码。
Wesley13 Wesley13
3年前
Ubuntu离线安装deb包和依赖
需要用Ubuntu1604离线安装postgresql9.5环境准备:一台离线机器一台联网机器第一步:离线机器cd/var/tmp/sudoaptgetallowunauthenticatedyinstallprinturispostgr
Stella981 Stella981
3年前
Maven传递依赖无法引入解决办法
今天一个传递依赖问题搞了我半天,终于搞明白原因了。一个jar包A依赖了httpclient,然后另一个jar包B引入A,在IDEA里面只能看到依赖A,不管咋样都看不到依赖httpclient。我在IDEA的项目B里面,打包后在控制台发现一个告警:thePOMforAisinvalid,transitivedependencies
Stella981 Stella981
3年前
CentOS7 源码安装 smokeping 2.7
\TOC\1\.安装基础依赖包安装epelyum源和相关基础依赖包。yumyinstallepelreleasewgetmakegccopensslopenssldevelrrdtoolrrdtoolperlperlcoreperlmod_fcgidperlCPA
Easter79 Easter79
3年前
Spring循环依赖问题的解决
循环依赖问题一个bean的创建分为如下步骤:!(https://static.oschina.net/uploads/img/202102/24030007_IrhH.png)当创建一个简单对象的时候,过程如下:先从单例池中获取bean,发现无a创建a的实例为a赋值把a放到单例池
Stella981 Stella981
3年前
BZOJ3786星系探索——非旋转treap(平衡树动态维护dfs序)
题目描述物理学家小C的研究正遇到某个瓶颈。他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球。主星球没有依赖星球。我们定义依赖关系如下:若星球a的依赖星球是b,则有星球a依赖星球b.此外,依赖关系具有传递性,即若星球a依赖星球b,星球b依赖星球c,则有星球
Stella981 Stella981
3年前
Gradle
什么是传递依赖  在Maven仓库中,构件通过POM(一种XML文件)来描述相关信息以及传递性依赖。Gradle可以通过分析该文件获取获取所以依赖以及依赖的依赖和依赖的依赖的依赖,为了更加直观的表述,可以通过下面的输出结果了解。org.springframework:springweb:4.3.4.RELEASE
死牛胖子 死牛胖子
11个月前
Maven如何解决版本依赖冲突
Maven的依赖具备传递性,一个项目会依赖很多包,这些依赖包又会依赖其它包,从而构成复杂的依赖关系,这其中相同的包可能会被多次依赖,如果依赖了多个版本,就会产生冲突,此时,Maven需要一个选择策略,从多个版本中选择一个版本。Maven会根据以下两个原则来
GeorgeGcs
GeorgeGcs
Lv1
男 · 金融头部企业 · 鸿蒙应用架构师
HarmonyOS认证创作先锋,华为HDE专家,鸿蒙讲师,作者。目前任职鸿蒙应用架构师。 历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 AAE,Harmony(OpenHarmony\HarmonyOS),MAE(Android\IOS),FE(H5\Vue\RN)。
文章
64
粉丝
1
获赞
2