侧边栏壁纸
博主头像
离开的兔子

行动起来,活在当下

  • 累计撰写 8 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

一次 hvigor 资源编译报错排查:resources 目录里千万别放 .bak

Administrator
2026-06-25 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

一个很小但很容易中招的坑,记录下来。

报错现场

替换完鸿蒙 App 图标后编译,hvigor 直接红:

> hvigor ERROR: Failed :entry:default@CompileResource...
> hvigor ERROR: Tools execution failed.
Error Code: 11211116
Error: Resource Pack Error
Error Message: Invalid resource name 'foreground.png'. It should match the pattern [a-zA-Z0-9_].
  At file: E:\project\hm\utools\AppScope\resources\base\media\foreground.png.bak
* Try the following:
  > Modify the name to match the pattern [a-zA-Z0-9_].

根因

替换图标前,我习惯性地把原文件备份在原地

AppScope/resources/base/media/
  ├── foreground.png         ← 新图
  ├── foreground.png.bak     ← 我的备份  ❌
  ├── background.png
  └── layered_image.json

问题在于:鸿蒙的资源编译器(restool)会校验 resources/** 目录下的每一个文件名,资源名必须匹配 [a-zA-Z0-9_]

foreground.png.bak 这个名字里有两个点,编译器把 .bak 前的部分当资源名解析,直接判为非法——和图片内容、是否被引用都无关,光是「躺在资源目录里」就会让整个 CompileResource 失败

修复

把所有备份/临时文件移出 resources 目录就行:

mkdir -p img/_iconbak
mv AppScope/resources/base/media/foreground.png.bak  img/_iconbak/AppScope_foreground.png
mv entry/src/main/resources/base/media/foreground.png.bak img/_iconbak/entry_foreground.png
mv entry/src/main/resources/base/media/background.png.bak img/_iconbak/entry_background.png

移完目录变干净,再编译就过了:

AppScope/resources/base/media/
  ├── foreground.png
  ├── background.png
  └── layered_image.json     ← 全是合法资源名

这条规则的边界

resources/** 里的文件名规则比想象中严格:

  • 只允许 字母 / 数字 / 下划线不能有第二个点、连字符 -、空格、中文

  • 不区分「图片/json/临时文件」,目录里的一切都被扫

  • 所以 .bak.tmplogo-v2.png图标.pngcopy of x.png 这类全部会炸。

教训

  1. 备份永远放到资源目录之外(项目里另开一个 img/_iconbak/ 或工程外目录)。我现在的默认动作就是:碰资源目录前,备份先 mv 出去。

  2. 别在 resources/** 里留任何临时文件——包括你顺手 cp a.png a-copy.png 想对比的那种。

  3. 看到 Error Code: 11211116 / Invalid resource name,第一反应就是去资源目录翻有没有「名字不规矩」的文件,而不是怀疑图片本身。

附:图标改了但桌面没变?

顺带一个相邻的坑——资源编译过了、装机了,桌面图标却还是旧的。这不是没编译进去,是启动器图标缓存。解决:先卸载旧 App 再装,鸿蒙启动器对覆盖安装的图标刷新很不积极。

0

评论区