Android构建mergeDebugResources报Illegal char <:>索引43异常问询
问题原因
- 你全局搜索不到报错里提到的
com.cmplay.tiles2.app-mergeDebugResources-6:/values/values.xml是正常的,这是资源合并阶段构建系统给中间资源块生成的虚拟路径,不是源码目录下存在的实体文件,直接搜索源码当然找不到。 - 报错信息里的
Illegal char <:>不是指源码里存在<:>这个字符串,尖括号只是报错用来包裹非法字符的格式标记,实际触发异常的字符是冒号:,这个冒号来自构建系统的虚拟路径,不是你手写在资源文件里的内容。
这个错误本质是Windows环境下资源编译器解析虚拟路径时抛出的异常,常见触发原因有两个:
- 资源文件数组标签使用错误:你贴出的arrays.xml中存储国家代码、文本内容时使用了裸
<array>标签,这个标签对应的是TypedArray类型,资源编译器会尝试将标签内的item解析为资源引用、类型化数值,解析失败时会触发内部路径解析逻辑的bug,误将虚拟路径里的冒号判定为Windows路径的非法字符。 - 构建环境版本不兼容/路径不规范:如果你使用JDK17搭配7.0以下版本的Android Gradle插件(AGP),老版本AGP不兼容高版本JDK的路径解析逻辑,在Windows下会直接把虚拟资源路径里的冒号识别为非法字符;另外项目路径带空格、中文特殊字符(你当前路径中
new one包含空格)也可能触发同类解析bug。
修复方案
按以下优先级操作,每一步做完都可以执行一次clean rebuild验证问题是否解决:
- 修正资源数组标签:将arrays.xml中存储文本内容的
<array name="CountryCodes">改为<string-array name="CountryCodes">,所有存储纯字符串内容的数组都不要使用裸<array>标签,存储整数值使用<integer-array>,只有需要存储混合类型资源引用时才用<array>。 - 对齐构建版本:如果当前使用JDK17,将AGP版本升级到7.0及以上,确保AGP和Gradle版本匹配;如果暂时不想升级AGP,将Gradle依赖的JDK版本降到11即可。
- 规范项目路径:将项目移动到无空格、无中文、无特殊字符的纯英文路径下,比如
C:\dev\cmplay_tiles2这类目录,避免路径解析异常。 - 清理损坏的构建缓存:关闭Android Studio后,删除项目根目录下的
.gradle文件夹、app/build文件夹,再执行gradlew clean build --refresh-dependencies命令重新拉取依赖、构建项目,排除中间缓存损坏导致的异常。
内容的提问来源于stack exchange,提问作者Iron11
相关产品推荐
相关产品推荐

