元服务的程序包结构与传统应用程序包相同,也是以App Pack(.app)形式发布到应用市场。
但元服务相对于需要安装的应用形态更加轻量、便捷,其程序包也具备一些独有特征,如免安装、分包、预加载、老化。
免安装
免安装是指无需用户通过应用市场显式安装,用户点击元服务后,由系统程序框架后台安装后即可使用。
元服务中所有包HAP(Harmony Ability Package)、HSP(Harmony Shared Package)均需支持免安装。
分包
HarmonyOS每个应用程序包(.app)可以包含多个包文件(以.hap为后缀的HAP或以.hsp为后缀的HSP)。元服务在此基础上,进一步限制每个HAP或HSP(含其依赖的所有共享包)的大小,以实现快速启动体验,元服务的这种多包开发方案称为“分包”。
具体的分包规格:
- 首包:将Entry HAP作为首包,包含元服务首次启动时会打开的页面(即首页)代码和资源。
- 分包:将其他包含功能页的模块以及HSP动态共享模块作为分包,包含功能页和元服务依赖的代码和资源。
- 单个包文件(加上其依赖的所有共享包),大小不能超过2MB,超过限制DevEco Studio会打包失败。
- 同一个元服务下所有包文件(加上其依赖的所有共享包)的大小总和不能超过10MB,超过限制DevEco Studio会打包失败。如因业务需要,可向平台申请总包大小放宽至20M。
这样,启动元服务时,只需下载和安装首包,即可立即启动元服务,大大缩短元服务启动时间。
图1 采用分包的元服务开发态视图

分包建议:
- 单个HAP或HSP(加上其依赖的所有共享包)大小超过2M,就需要考虑分包。
- 建议开发者按照不同的功能进行分包。
- 重复代码和资源抽离出来作为HSP,进一步减小包大小。
下图展示了一个元服务的开发态视图,该元服务具有:
- 一个名为HomeModule的首包模块
- 一个名为FeatureModule的分包模块
- 一个名为SharedLibraryModule的HSP动态共享模块
- 一个名为StaticLibraryModule的静态共享模块
图2 元服务分包的工程目录结构图

其中HomeModule模块为元服务的“首包”,type字段为entry,以下是HomeModule模块的module.json5文件:
{ "module": { "name": "HomeModule", "type": "entry", "pages": "$profile:main_pages", ... } }FeatureModule模块为功能页“分包”,type字段为feature,以下是FeatureModule模块的module.json5文件:
{ "module": { "name": "FeatureModule", "type": "feature", ... } }SharedLibraryModule模块为共享“分包”,type字段为shared,以下是SharedLibraryModule模块的module.json5文件:
{ "module": { "name": "SharedLibraryModule", "type": "shared", ... } }StaticLibraryModule模块为静态共享包,type字段为har,以下是StaticLibraryModule模块的module.json5文件:
{ "module": { "name": "StaticLibraryModule", "type": "har", ... } }
预加载
开发者可以通过配置预加载,由系统自动下载和安装可能需要的分包模块,从而提升进入后续模块的速度。
对于配置了预加载的分包模块,当点击进入该模块并完成页面加载后,将触发关联模块的预加载。
配置预加载
预加载在相应分包模块module.json5配置文件中“atomicService”标签下的preloads字段配置。以HomeModule模块的module.json5为例:
{
"module": {
"name": "HomeModule",
"type": "entry",
"installationFree": true,
"pages": "$profile:main_pages",
"atomicService": {
"preloads": [
{
"moduleName": "FeatureModule"
}
]
},
...
}
}
在HomeModule模块的页面加载结束后,系统会自动执行预加载,去下载和安装模块名为FeatureModule的模块。
注意
preloads列表配置的moduleName对应的ModuleType(模块类型)不能为entry。
老化
系统会按照一定策略清理不活跃的元服务,释放空间,这个过程称为老化。具体老化机制如下。
- 老化时机:由系统定时器触发老化,当系统中所有元服务占用总空间大于既定阈值时,将启动老化,同时要求设备处于熄屏状态,且剩余电量不低于10%。
- 老化顺序:优先老化长时间未使用及使用频率较低且未添加桌面卡片的元服务。
- 分级老化:根据数据重要性排序,分级老化。当系统满足老化时机的要求时,按照老化顺序优先清理元服务的Cache目录数据,再按照老化顺序清理元服务的其他目录数据,直到系统中所有元服务占用总空间小于既定阈值的80%。因此,开发者应合理规划数据存放目录,仅将非重要数据(例如网络缓存图片等)存放到Cache目录,避免重要数据被频繁老化清理。
图3 元服务老化示意图

元服务程序包更新机制
元服务在重新加载启动时(首次打开或销毁后被用户再次打开),会异步检查是否有更新版本。如果发现有新版本,将会异步下载新版本的程序包。但当次启动仍会使用客户端本地的旧版本程序,新版本的元服务将在下一次重新加载启动时使用。