Android Vulkan应用构建失败:Prefab生成的Bat脚本解析错误
我正按照官方指南构建Android Vulkan应用,但每次构建都会在文件app\build\intermediates\cxx\Debug\1k4v2e55\logs\arm64-v8a\prefab_command.bat中出现执行错误。查看该批处理脚本后发现,问题似乎出在与转义符脱字符(^)配合使用的双引号上。手动给相关内容再套一层双引号后,脚本可正常运行,但该脚本是Gradle Sync时自动生成的,因此想知道如何解决这个问题。有没有人遇到过相同问题?
自动生成的批处理脚本内容
@echo off "C:\\Program Files\\Android\\Android Studio\\jbr\\bin\\java" ^ --class-path ^ "C:\\Users\\Public\\Downloads\\AndroidGradleCache\\caches\\modules-2\\files-2.1\\com.google.prefab\\cli\\2.1.0\\aa32fec809c44fa531f01dcfb739b5b3304d3050\\cli-2.1.0-all.jar" ^ com.google.prefab.cli.AppKt ^ --build-system ^ cmake ^ --platform ^ android ^ --abi ^ arm64-v8a ^ --os-version ^ 30 ^ --stl ^ c++_shared ^ --ndk-version ^ 25 ^ --output ^ "C:\\Users\\<UserName>\\AppData\\Local\\Temp\\agp-prefab-staging173918899557672872\\staged-cli-output" ^ "C:\\Users\\Public\\Downloads\\AndroidGradleCache\\caches\\8.9\\transforms\\d32a77d7e7bb7e9756a33ac5cd5bf668\\transformed\\jetified-games-activity-4.0.0-alpha01\\prefab"
错误输出(stderr)
'\Program'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 'class-path'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 'm.google.prefab.cli.AppKt'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. '"C:\\Users\\Public\\Downloads\\AndroidGradleCache\\caches\\8.9\\transforms\\d32a77d7e7bb7e9756a33ac5cd5bf668\\transformed\\jetified-games-activity-4.0.0-alpha01\\prefab"'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.
(注:上述韩语错误信息翻译为:\Program 不是内部或外部命令、可执行程序或批处理文件。class-path 不是内部或外部命令、可执行程序或批处理文件。m.google.prefab.cli.AppKt 不是内部或外部命令、可执行程序或批处理文件。"C:\\Users\\Public\\Downloads\\AndroidGradleCache\\caches\\8.9\\transforms\\d32a77d7e7bb7e9756a33ac5cd5bf668\\transformed\\jetified-games-activity-4.0.0-alpha01\\prefab" 不是内部或外部命令、可执行程序或批处理文件。)
环境信息
- OS:Windows 11 Pro 22H2(22621.2861)
- SDK:34
- NDK:25.2.9519653
- CMake:3.22.1
- 依赖:尝试过games-activity 2.0.0、3.0.0、4.0.0
已尝试的解决方法
- 更换NDK、CMake版本
- 更换games-activity版本
- 手动修改脚本并运行(给相关内容添加一层双引号)
解决建议
1. 升级AGP与Gradle版本
这个问题大概率是Android Gradle Plugin(AGP)生成批处理脚本时的转义逻辑bug,建议升级到最新稳定版AGP(如8.1及以上),同时同步升级Gradle到对应兼容版本。不少用户反馈升级后Prefab脚本的生成问题会自动修复。
2. 调整Gradle缓存路径
你的缓存路径包含空格(Public\\Downloads\\AndroidGradleCache),虽然理论上脚本应处理空格,但转义逻辑可能在此场景下失效。可以将缓存路径改到无空格的目录:
- 打开项目根目录的
gradle.properties文件,添加或修改:android.cacheDir=C:\\AndroidBuildCache - 删除原缓存目录,重新执行Gradle Sync。
3. 强制指定Prefab CLI版本
在模块级build.gradle中指定更高版本的Prefab CLI,替换默认的2.1.0:
dependencies { prefab 'com.google.prefab:cli:2.4.0' }
新版本的Prefab CLI可能修复了Windows下的脚本生成问题。
4. 临时 workaround:自动修正脚本
如果上述方法无效,可以通过Gradle任务拦截自动生成的批处理脚本,自动添加外层双引号:
在模块级build.gradle中添加:
tasks.withType(com.android.build.gradle.tasks.PrefabTask) { doLast { def batFile = file("${buildDir}/intermediates/cxx/${variant.name}/logs/${variant.abi}/prefab_command.bat") if (batFile.exists()) { def content = batFile.text // 给带换行转义符的命令行添加外层双引号 def newContent = content.replaceAll(/^(".*") \^/, '("$1") ^') batFile.write(newContent) } } }
注意:需根据实际脚本结构调整正则表达式,确保只修改目标行。
内容的提问来源于stack exchange,提问作者김병훈

