在 HarmonyOS Stage 模型开发中,配置文件往往是新手最容易翻车的地方。
应用级配置集中在 AppScope/app.json5,模块级配置在 entry/src/main/module.json5,两者分工不同但存在交叉,搞混了就会导致图标不显示、应用名显示为包名、权限弹窗不弹出等问题。本文结合真实项目经验,梳理几个关键配置项的注意事项。
bundleName:应用身份证,发布前务必确认
app.json5 中的 bundleName 是系统唯一标识,采用反域名命名(如 com.example.demo),至少三段、每段只能英文数字下划线、首段字母开头、长度 7-128 字节。
- {
- "app": {
- "bundleName": "com.zyl.ounting",
- "vendor": "example",
- "versionCode": 1000001,
- "versionName": "1.0.1"
- }
- }
复制代码
发布后无法修改,上线前必须签字确认。常见错误包括连续点号、首段数字开头、不足三段等。另外 bundleName 还影响沙箱路径和数据隔离,同厂商应用建议共用二级域名前缀以便跨应用数据共享。
bundleType 默认值为 "app",若开发元服务需显式配置为 "atomicService",否则编译或上架会报错。API 19 新增 "appPlugin" 类型用于插件包,普通三方暂不需要。
图标和 label:优先级规则易混淆
DevEco Studio 5.0.3.800 之后,module.json5 中的 icon/label 不再强制配置。生效优先级如下:
- 有入口 UIAbility 时:先找 mainElement 指向的 UIAbility 配置 → 再找 module.json5 里第一个入口 UIAbility → 最后用 app.json5 的值。
- 无入口 UIAbility 时:直接使用 app.json5。
推荐做法:只在 app.json5 中配置 icon/label,模块不重复配,逻辑最清晰。若需桌面显示多个入口图标,则在 module.json5 中为每个 UIAbility 分别配置并添加 skills 中的 home 相关字段。
入口 UIAbility 的判断标准是 skills 中同时包含 "entity.system.home" 和 "ohos.want.action.home",缺一不可。
资源引用注意:AppScope 目录下的资源会合入模块目录,若文件名重复则 AppScope 覆盖模块。定制模块图标时不要与 AppScope 资源重名。分层图标前景/背景图需放在 media 目录,并在 layered_image.json 中引用。
版本号:编码有门道
versionCode 是 32 位非负整数,推荐用分段编码(如 1000001 表示 1.0.1),便于迭代追溯。不推荐用时间戳,同一天多个 hotfix 易冲突。
versionName 展示给用户,推荐三段式 "A.B.C" 或四段式,长度不超过 127 字节。注意只能包含数字、字母、下划线、点号和花括号,不能出现 "-beta" 等字母,可通过 versionCode 奇偶区分 debug/release。
API 23 新增 buildVersion,用于 CI/CD 构建标识,与 versionName 维度不同。buildVersion 只能用数字和点号,最长 18 字节,不可相邻点号或以点号开头结尾。
deviceTypes:多 Module 的兼容性陷阱
在 module.json5 中指定模块支持的设备类型,如 ["phone","tablet"]。多 Module 工程下,所有模块的 deviceTypes 交集必须包含目标设备,否则安装报错 INSTALL_FAILED_INVALID_DEVICE_TYPE。建议所有模块配同一套设备类型。
注意 "default" 类型仅供调试或系统应用使用,不支持上架。
requiredDeviceFeatures 字段从 API 19 新增,声明必须的设备特性(如 camera:true),市场据此做设备分发过滤。
权限声明:区分 system_grant 与 user_grant
system_grant(如 INTERNET)只需声明 name,安装时自动授予。user_grant(如 LOCATION、CAMERA)必须提供 reason 和 usedScene。
- {
- "name": "ohos.permission.LOCATION",
- "reason": "$string:permission_location_reason",
- "usedScene": {
- "abilities": ["EntryAbility"],
- "when": "inuse"
- }
- }
复制代码
reason 使用字符串资源索引,且必须多语种,描述需具体明确(如“用于在地图上显示位置以便推荐餐厅”)。when 可选 "inuse" 或 "always",非后台必要请用 "inuse",否则审核严格。
多 HAP 场景下:entry 已声明的权限可在全应用共用;feature 单独声明的权限仅在该模块运行时生效。若 entry 和 feature 声明同一权限且 reason 不一致,以 entry 为准。
minAPIVersion 与 targetAPIVersion
这两个字段在 app.json5 中配置无效,实际需在 build-profile.json5 中设置 compatibleSdkVersion 和 targetSdkVersion。若 targetAPIVersion 过低,运行时访问新 API 可能抛异常;过高则需在代码中做兼容判断。
总结:Stage 模型配置文件看似简单,实则细节众多。建议新建项目时逐字段核对,特别是 bundleName 和权限声明,避免上线后返工。 |