Gradle构建报错:文件名/目录名/卷标语法不正确求助
解决Gradle修改Manifest时的“文件名、目录名或卷标语法不正确”错误
这个问题我之前帮不少开发者处理过,你遇到的错误根源很明确:直接把Gradle的manifestOutputDirectory属性当成字符串拼接了,但它本质是一个DirectoryProperty对象,直接转字符串会生成系统无法识别的奇怪路径格式。
你原来的代码里String manifestPath = "$manifestOutputDirectory/AndroidManifest.xml"这一行,实际生成的路径是类似property(interface org.gradle.api.file.Directory, transform(...))/AndroidManifest.xml的内容,Windows系统完全认不出这种格式,自然就报路径语法错误了。
修复方案
只需要正确获取manifestOutputDirectory对应的实际文件路径,替换路径拼接的逻辑即可:
applicationVariants.all { variant -> variant.outputs.all { output -> output.processManifest.doLast { // 确保产品风味存在,避免空指针 if (variant.productFlavors.isEmpty()) { return } def abiVersion = variant.productFlavors.get(0).abiVersionCode // 正确获取manifest输出目录的File对象,再拿到路径 def manifestFile = manifestOutputDirectory.get().file("AndroidManifest.xml").asFile def manifestContent = manifestFile.getText() // 替换versionCode逻辑,这里可以用更简洁的写法 def targetVersionCode = defaultConfig.versionCode * 10 + abiVersion manifestContent = manifestContent.replace( String.format('android:versionCode="%d"', defaultConfig.versionCode), String.format('android:versionCode="%d"', targetVersionCode) ) manifestFile.write(manifestContent) } } }
关键修改点说明
- 使用
manifestOutputDirectory.get().file("AndroidManifest.xml").asFile直接获取目标Manifest文件的File对象,避免手动拼接路径的错误 - 增加了
variant.productFlavors.isEmpty()的判断,防止没有产品风味时出现空指针异常 - 把版本计算单独抽成变量,让代码更清晰
这样修改后,Gradle会正确解析到实际的Manifest文件路径,不会再出现路径语法错误了。
内容的提问来源于stack exchange,提问作者saeed




