# HarmonyOS按需加载实现方法和常见问题

## 问题现象

如何通过按需加载能力减少首次安装时耗时和应用的占用空间？

## 背景知识

按需加载模块：用户首次从应用市场安装时，只会下载不包含按需加载模块的内容。当用户需要使用特定功能时，可以选择下载并安装相应的功能模块。

按需加载模块有以下好处：

* 减少包体积：用户从应用市场首次下载的应用不包含按需加载模块，用户看到的包体积减少，从而减少了用户下载和安装时间，减少了用户等待时间。
* 减少系统资源：应用安装之后所占用的空间也变少（节省ROM空间），应用启动时加载的特性少了（节省了RAM空间）。
* 架构演进：定义为按需加载的特性明确，模块间耦合关系清晰，有利于应用架构演进。

## 解决方案

按需加载实现可分为三个步骤：基础包与扩展功能包分包、按需加载下载安装扩展功能包、运行扩展功能包。

**步骤一：基础包与扩展功能包分包。**

如果某个特性做成了按需加载模块，该模块可以设计为Feature类型的HAP或者HSP，HAP和HSP都可以实现按需加载，区别在于Feature类型的HAP可以包含UIAbility组件。

参考[应用程序包开发与使用](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-package-dev)，将APP分为基础功能Entry包和按需加载的动态模块（Feature类型的HAP或者HSP）。

在动态模块的module.json5中设置deliveryWithInstall为false，来标识当前模块在用户主动安装应用的时候不会一起下载安装。

当动态模块为HSP时，基础功能Entry包的oh-package.json5中需要[添加依赖项](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-hvigor-dependencies)。添加HSP模块的动态依赖方式可参考[如何配置oh-package.json5动态依赖](https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-compiling-and-building-48)。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/78/v3/yyycaZz8TUGAdRDZ53Oh6w/zh-cn_image_0000002648285864.png?HW-CC-KV=V1&HW-CC-Date=20260920T112703Z&HW-CC-Expire=31536000000&HW-CC-Sign=49E29CE89603FB4BB39D82EADD394B9487C01A7731CFC0019DF1AB58BA54B9ED "点击放大")

**步骤二：按需加载下载安装扩展功能包。**

调用[moduleInstallManager (产品特性按需分发)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/store-moduleinstallmanager)实现动态模块的按需加载，可分为以下几步：

1. 使用[getInstalledModule](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/store-moduleinstallmanager#moduleinstallmanagergetinstalledmodule)查询module是否安装。
2. 通过[createModuleInstallRequest](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/store-moduleinstallmanager#moduleinstallprovidercreatemoduleinstallrequest)创建按需加载请求对象。
3. [fetchModules](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/store-moduleinstallmanager#moduleinstallmanagerfetchmodules)按需加载请求下载module功能包。

**步骤三：运行扩展功能包。**

* 对于动态模块为Feature类型的HAP，可以通过UIAbility中的[startAbility](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inner-application-uiabilitycontext#startability)方法拉起动态模块HAP包中的页面。
* 当动态模块为HSP时，可通过基础功能Entry包HAP[动态import](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-dynamic-import) HSP模块名或动态import HSP模块名文件路径的方式调用HSP中的方法或组件。 说明
  >
  > 完整按需加载动态HSP可参考：[产品特性按需分发(ArkTS)](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/store-moduleinstall_arkts)。

## 常见FAQ

Q：按需加载[接入调试功能](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/store-moduleinstall_arkts#接入调试功能)，如何在沙箱中导入动态模块。

A：Device File Browser可访问的文件夹有五种类型：[应用沙箱目录](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-sandbox-directory)、一般暂存区目录、日志目录、设备公共目录、媒体库目录。

1. 按下图点击切换Device File Browser沙箱视图。 ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/a3/v3/egLRsLs-ReqJha5La9QuqA/zh-cn_image_0000002648286216.png?HW-CC-KV=V1&HW-CC-Date=20260920T112703Z&HW-CC-Expire=31536000000&HW-CC-Sign=BEA77B25941B60D5D6D7074F245B2456C3C3E6752984B42888A7597B13EEB7FD)

2. 在//data/app/el2/base/cache/moduleinstall/下添加对应的动态模块。 ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/9f/v3/KEEm5R56SMejvYlaPi3ODw/zh-cn_image_0000002648126326.png?HW-CC-KV=V1&HW-CC-Date=20260920T112703Z&HW-CC-Expire=31536000000&HW-CC-Sign=3A4E42E61FB8BE4754235EB346809A5C56298BEEC02FE18E09FE8C92EA648E2F "点击放大")

Q：应用未上架如何测试按需加载功能？

A：推荐使用[邀请测试](https://developer.huawei.com/consumer/cn/doc/app/agc-help-invite-test-0000002270829393)。

Q：预装场景下，如果deliveryWithInstall配置为true，代码中是否不能引入@kit.AppGalleryKit？

A：没有这个限制。预装场景下系统会识别需要安装的文件，按需加载特性可以正常使用。

