一个很小但很容易中招的坑,记录下来。
报错现场
替换完鸿蒙 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、.tmp、logo-v2.png、图标.png、copy of x.png这类全部会炸。
教训
备份永远放到资源目录之外(项目里另开一个
img/_iconbak/或工程外目录)。我现在的默认动作就是:碰资源目录前,备份先mv出去。别在
resources/**里留任何临时文件——包括你顺手cp a.png a-copy.png想对比的那种。看到
Error Code: 11211116 / Invalid resource name,第一反应就是去资源目录翻有没有「名字不规矩」的文件,而不是怀疑图片本身。
附:图标改了但桌面没变?
顺带一个相邻的坑——资源编译过了、装机了,桌面图标却还是旧的。这不是没编译进去,是启动器图标缓存。解决:先卸载旧 App 再装,鸿蒙启动器对覆盖安装的图标刷新很不积极。
评论区