先别把两个开关当成一回事
检查一个已经运行一段时间的 Stage 工程时,我会先把“产物是什么”和“模块如何交付”分开看。源码中 AppScope/app.json5 将产物类型声明为 atomicService,而 entry/src/main/module.json5 同时设置了 installationFree: true 与 deliveryWithInstall: true。这三项名字相近,控制的却不是同一层。
bundleType: "atomicService":定义构建产物类型为元服务。installationFree: true:声明当前模块支持免安装能力。deliveryWithInstall:控制模块是否随主动安装流程交付。
华为的拆包文档分别把 bundleType 映射为产物类型,把 installationFree 映射为模块的免安装标记;DevEco 的多目标配置也允许按 product 选择 bundleType。因此,看到其中一个字段,不能直接推断另外两个字段的行为,更不能由此认定应用市场发布条件已经满足。
配置应该按层核对
下面是经过匿名化的配置片段,只保留讨论所需字段。它不是完整工程清单:实际工程还需要保留版本、资源、Ability 等项目配置。
AppScope/app.json5:
{
"app": {
"bundleName": "com.example.atomicservice",
"vendor": "example",
"versionCode": 1,
"versionName": "1.0.0",
"bundleType": "atomicService"
}
}
entry/src/main/module.json5:
{
"module": {
"name": "entry",
"type": "entry",
"deviceTypes": ["phone"],
"deliveryWithInstall": true,
"installationFree": true
}
}
第一个文件回答“构建出的 bundle 属于哪种产品形态”,第二个文件回答“这个 HAP 模块声明了什么交付和安装能力”。当工程使用多个 product 或 target 时,还应检查最终选中的 product 是否覆盖了工程默认值;只看默认配置文件容易把本地产物和待发布产物混为一谈。
元服务还受 API 和运行规则约束
元服务不是把普通应用的 bundleType 改一下就完成迁移。华为的元服务开发说明明确指出,可用 API 集是 HarmonyOS SDK 的子集;网络域名、分包大小、卡片类型和部分平台能力也有独立规则。因此,代码能通过普通应用的静态检查,并不能证明它已满足元服务运行条件。
我会在提测前逐项对照:
- 构建目标:检查选中的 product、
bundleType和模块清单,确认实际打出的产物与预期一致。 - 免安装与交付:分别确认
installationFree和deliveryWithInstall的目标行为,避免把能力声明当作分发策略。 - API 适用范围:逐项确认使用的 Kit、系统能力和三方库是否属于元服务可用范围。
- 服务端与资源:核对网络域名白名单、分包体积、预加载和卡片资源等当前平台要求。
- 发布验证:用目标 product 产物执行实际安装/免安装路径验证,再按当前 AppGallery Connect 与应用市场审核要求复核。
工程快照里前两层声明已经存在,但源码本身不能替代目标产物检查,也不能证明平台侧的域名、API 或市场配置已就绪。尤其是 deliveryWithInstall 与 installationFree 同时为 true 时,应以最终构建产物和目标分发路径验证其行为,不要仅凭字段名下结论。
下一步从缺失的卡片注册继续查
配置核对还发现一个容易漏掉的点:工程里有 ArkTS 卡片页面和 FormExtensionAbility 类,但 module.json5 没有对应的 extensionAbilities 注册,资源目录也没有卡片的 form_config.json。因此,现有源码只能说明卡片 UI 与生命周期模板已开始编写,不能说明系统已经能发现并创建这张卡片。下一篇会把“类文件存在”到“系统可以调度”的链路补完整。
