【关键字】
模块化 / HSP / HAR / 静态共享包 / 动态共享包 /启动耗时 / 包体大小
【问题描述】
-
如项目只需一个entry模块,该entry模块中是否只需一个UIAbility组件就足够?多UIAbility组件是否仅当需要在任务视图中看到多个任务、或者需要同时开启多个窗口时才需使用?
-
对于各个业务模块、底层功能模块,在HAR和HSP的选择上有什么建议?二者的加载机制有什么区别?对启动耗时和包体大小影响的差异是什么?
-
HSP的按需加载,主要适用于什么场景?
-
如果app为单HAP,各个业务模块需要有业务组件,且会有一些底层通用的组件被各个业务组件依赖,那么业务组件和通用组件分别推荐使用什么?
-
以下几种依赖情况下,是否支持Navigation方式的页面跳转和返回?
HAP->HSP, HAP->HAR, HSP->HSP, HSP->HAR, HAR->HAR, HAR->HSP
【解决方案】
-
如果该entry模块没有在任务视图中看到多个任务或者同时开启多个窗口的需求,一个UIAbility即可满足需求。
参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/uiability-overview-0000001774119974
-
HAR是静态共享包,编译态复用。
-
支持应用内共享,也可以发布后供其他应用使用。
-
多包(HAP/HSP)引用相同的HAR时,会造成多包间代码和资源的重复拷贝,从而导致应用包膨大。
-
不同HAP包引入同一个HAR包,无法实现数据的共享。
HSP是动态共享包,运行时复用。
-
当前仅支持应用内共享。
-
当多包(HAP/HSP)同时引用同一个共享包时,采用HSP替代HAR,可以避免HAR造成的多包间代码和资源的重复拷贝,从而减小应用包大小。
-
同一进程,运行时可共享代码,相比har包能有效减少内存消耗,同时能实现数据共享(比如常用的单例模式)。
使用建议如下:
-
二方库/三方库场景:开发者开发的模块,需要暴露给其他应用使用 (公司内或者公司外) 时,只能使用HAR。
-
单HAP场景:如果没有按需加载诉求,推荐使用单HAP + HAR;如果有按需加载诉求,推荐使用HSP。HAP (独有的HAR) + 按需加载的HSP (独有的HAR) ==》公共HSP (封装公共的HAR)。
-
多HAP场景: 如果多HAP没有共用的资源,推荐使用多HAP + HAR;如果多HAP有共用的资源,推荐使用HSP封装。HAP1 (独有的HAR) + HAP2 (独有的HAR) ==》公共HSP (封装公共的HAR)
-
-
HSP一般适用于将不常用的功能封装成一个模块按需加载。
-
建议业务组件使用HSP,通用组件使用HAR。
-
以上6种依赖场景下都支持页面跳转和返回的,可以将目标跳转页面放到NavDestination中,同时将NavPathStack传递到HAR/HSP,跳转通过NavPathStack实现。