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

12 回复

确实是这样,一开始我刚学的时候也不知道在哪儿改图标,后来试了才知道。

更多关于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 优先(除了应用名称)

综上:

  1. 图标(icon):通常作为应用的全局标识,应该由应用级配置统一管理,确保在所有模块中保持一致
  2. 应用名称(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 的 iconlabel。如果 module 里没有配置,才回退到 AppScope/app.json5

你这里图标看起来被 app.json5 覆盖,重点检查图标资源文件名是否重复。官方文档里有一个说明:编译构建时,AppScope/resources 会合入到模块资源目录;如果 AppScope 和模块下存在相同路径、相同名称的资源,最终 AppScope 的资源会覆盖模块中的资源。

所以常见情况是:

// module.json5
"icon": "$media:layered_image"

entry/src/main/resources/base/media/layered_image.jsonAppScope/resources/base/media/layered_image.json 同名,构建后 $media:layered_image 实际解析到 AppScope 覆盖后的资源,于是表现成“图标以 app.json5 优先”。

建议这样处理:

  1. AppScope 和 entry 模块里的图标资源不要同名,比如 module 使用 $media:entry_layered_image,AppScope 使用 $media:app_layered_image
  2. 如果只想让桌面使用 module 配置,就保证入口 UIAbility 的 icon / label / skills 配齐,并删除或改名 AppScope 中同名 media 资源。
  3. 多 Ability 场景下再确认 module.mainElement 指向你期望作为桌面入口的 Ability。
  4. 修改后做一次 clean/rebuild,并卸载旧包后重新安装,避免桌面缓存旧图标。

简单说:显示优先级本身应是入口 UIAbility 的 module 配置优先;你看到的差异,大概率是 AppScope 资源合入时同名 media 覆盖了 module 资源。

在HarmonyOS Next中,桌面图标优先级由系统默认排序策略决定:系统应用(如设置、电话)优先级高于第三方应用;同类应用按安装时间倒序排列;用户手动移动或创建的文件夹会覆盖默认优先级。开发者无法通过代码修改图标排序,仅支持用户端调整。

这是设计使然,并非割裂。两者优先级不同的根源在于配置项的职责不同

  • 桌面图标 (icon)
    AppScope/app.json5 中的 icon 定义的是应用的全局品牌图标,代表整个应用的唯一标识,因此桌面图标以应用级配置优先。模块级 (module.json5) 的图标主要用于模块内部页面或快捷方式,不能覆盖桌面上的应用图标。

  • 桌面名称 (label)
    module.json5 中的 label 优先级更高,是为了支持多模块/多入口场景(例如同一个应用通过不同 Ability 在桌面展示不同名称),这样的灵活性允许开发者按模块粒度定制桌面显示名,而应用级名称则作为默认回退。

简言之:图标遵循“应用统一品牌”,名称遵循“模块可差异化”。这不是优先级混乱,而是有意将应用标识的“不变部分”与“可变部分”分属不同层级控制。

回到顶部