You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Vulkan应用构建失败:Prefab生成的Bat脚本解析错误

Android Vulkan构建时Prefab批处理脚本执行错误问题

我正按照官方指南构建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,提问作者김병훈

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:41:06