HarmonyOS 鸿蒙Next中桌面图标的优先级问题
HarmonyOS 鸿蒙Next中桌面图标的优先级问题 开发了一个简单应用,对于桌面图标以及应用名称显示的优先级有疑问
桌面图标及名称配置有两个文件可以配置,如下:entry/src/main/module.json5、AppScope/app.json5。
桌面应用名称是module.json5优先级更高,但桌面图标是app.json5优先级更高,这是为什么,好割裂~
要不全部以module优先,要不全部以app优先,不同类型优先级不一样这是为啥?
下面是桌面名称,以module.json5优先:



下面是桌面图标,居然又以app.json5优先了,真割裂:



更多关于HarmonyOS 鸿蒙Next中桌面图标的优先级问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
确实是这样,一开始我刚学的时候也不知道在哪儿改图标,后来试了才知道。
更多关于HarmonyOS 鸿蒙Next中桌面图标的优先级问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
背景知识:
1. 桌面应用名称(label)优先级
module.json5 优先级更高 - 当两者都配置时,桌面显示的应用名称以 module.json5 中的配置为准。
2. 桌面图标(icon)优先级
app.json5 优先级更高 - 当两者都配置时,桌面显示的图标以 app.json5 中的配置为准。
从编译过程理解优先级:
- 在编译阶段,AppScope/app.json5 文件的字段会被合并到 module.json5 文件中
- 编译后生成的最终 module.json 文件会包含两者的配置
- 合并规则是:同名配置项,app.json5 优先(除了应用名称)
综上:
- 图标(icon):通常作为应用的全局标识,应该由应用级配置统一管理,确保在所有模块中保持一致
- 应用名称(label):考虑到多模块应用场景,不同模块可能有不同的入口和显示名称需求,因此模块级配置有更高优先级
可能是HarmonyOS资源配置设计问题,建议提交工单给技术支持
建议好
“icon”: "$media:layered_image"优先级覆盖的问题,这应该是app.json5权限高于module.json5,有可能是你更新API版本之后,底层逻辑改变的影响,这个应该细读API23的文档,我在更新的时候也出现了这个问题,
这种设计应该是兼顾可运行的两种module,entry的HAP和feature的HAP。
app图标,是所有显示的地方(包括手机应用列表)App层面配置优先。视觉上统一。
app名称,给主模块留了个特例吧,entry模块配置优先。听觉上可区分。
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html,
我觉得这是 HarmonyOS 配置设计的历史遗留问题 ,直接喊话官方吧~~
根本原因:你观察到的“割裂”现象是因为 AppScope 和模块目录下存在同名但内容不同的图标资源文件,导致编译时 AppScope 的资源覆盖了模块资源。检查并统一资源文件即可解决。
你在两个文件配置不同的资源名称然后引用即可发现问题。
| 配置项 | 优先级(理论) | 实际生效可能受影响的场景 |
|---|---|---|
| 桌面图标 | module.json5(若配置且 skills 正确) |
资源文件重名时,AppScope 资源会覆盖模块资源 |
| 桌面名称 | module.json5(若配置且 skills 正确) |
同上 |
| 系统设置图标 | app.json5(若 module.json5 未配置) |
同上 |
| 系统设置名称 | app.json5(若 module.json5 未配置) |
同上 |
这里不是“名称和图标采用了两套优先级”,更像是资源合并规则造成的现象。
按应用图标和名称配置规则,如果 HAP 中有入口 UIAbility,并且该 Ability 配置了 icon / label,同时 skills 中包含:
"entities": ["entity.system.home"],
"actions": ["ohos.want.action.home"]
那么桌面显示会优先取 module.json5 中这个入口 Ability 的 icon 和 label。如果 module 里没有配置,才回退到 AppScope/app.json5。
你这里图标看起来被 app.json5 覆盖,重点检查图标资源文件名是否重复。官方文档里有一个说明:编译构建时,AppScope/resources 会合入到模块资源目录;如果 AppScope 和模块下存在相同路径、相同名称的资源,最终 AppScope 的资源会覆盖模块中的资源。
所以常见情况是:
// module.json5
"icon": "$media:layered_image"
但 entry/src/main/resources/base/media/layered_image.json 和 AppScope/resources/base/media/layered_image.json 同名,构建后 $media:layered_image 实际解析到 AppScope 覆盖后的资源,于是表现成“图标以 app.json5 优先”。
建议这样处理:
- AppScope 和 entry 模块里的图标资源不要同名,比如 module 使用
$media:entry_layered_image,AppScope 使用$media:app_layered_image。 - 如果只想让桌面使用 module 配置,就保证入口 UIAbility 的
icon/label/skills配齐,并删除或改名 AppScope 中同名 media 资源。 - 多 Ability 场景下再确认
module.mainElement指向你期望作为桌面入口的 Ability。 - 修改后做一次 clean/rebuild,并卸载旧包后重新安装,避免桌面缓存旧图标。
简单说:显示优先级本身应是入口 UIAbility 的 module 配置优先;你看到的差异,大概率是 AppScope 资源合入时同名 media 覆盖了 module 资源。
在HarmonyOS Next中,桌面图标优先级由系统默认排序策略决定:系统应用(如设置、电话)优先级高于第三方应用;同类应用按安装时间倒序排列;用户手动移动或创建的文件夹会覆盖默认优先级。开发者无法通过代码修改图标排序,仅支持用户端调整。


