Unity命令行构建Android Player失败:Android NDK未找到
我们有多台运行Windows 11、搭载Unity 2022.3.54f1的构建机用于Unity项目构建,其中一台新部署的机器在执行命令行构建Android Player时,始终因Android NDK未找到而失败。该机器在Unity编辑器内构建正常,且相同配置在其他构建机上可正常运行。
构建命令
C:\Program Files\Unity\Hub\Editor\2022.3.54f1\Editor\Unity.exe -batchmode -projectPath ./ -buildTarget Android -executeMethod GameBuilder.PerformAndroidBuild -logFile - -quit
构建脚本(已脱敏)
public static void PerformAndroidBuild() { BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions(); // 添加所有场景 buildPlayerOptions.scenes = new string[EditorBuildSettings.scenes.Length]; for (int i = 0; i < EditorBuildSettings.scenes.Length; i++) buildPlayerOptions.scenes[i] = EditorBuildSettings.scenes[i].path; buildPlayerOptions.locationPathName = $"Builds/Android/BoV-{Application.version}.apk"; buildPlayerOptions.target = BuildTarget.Android; buildPlayerOptions.options = BuildOptions.None; string keystorePass = Environment.GetEnvironmentVariable("KEYSTORE_PASS"); string keyaliasPass = Environment.GetEnvironmentVariable("KEYALIAS_PASS"); // 设置签名凭据 PlayerSettings.Android.keystoreName = "redacted"; PlayerSettings.Android.keystorePass = keystorePass; PlayerSettings.Android.keyaliasName = "redacted"; PlayerSettings.Android.keyaliasPass = keyaliasPass; BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions); BuildSummary summary = report.summary; if (summary.result == BuildResult.Succeeded) Debug.Log("Build succeeded: " + summary.totalSize + " bytes"); else if (summary.result == BuildResult.Failed) Debug.Log("Build failed"); }
错误日志
10:12:05 Android PostProcess task "Detecting Android SDK" took 2123.1438 ms 10:12:05 DisplayProgressbar: Detect Android NDK 10:12:05 Uploading Crash Report 10:12:05 UnityException: Android NDK not found 10:12:05 Android NDK not found or invalid. Please, fix it in Edit / Unity -> Preferences -> External Tools 10:12:05 UnityEditor.BuildPipeline:BuildPlayerInternalNoCheck(String[], String, String, BuildTargetGroup, BuildTarget, Int32, BuildOptions, String[], Boolean) 10:12:05 UnityEditor.BuildPipeline:BuildPlayerInternal(String[], String, String, BuildTargetGroup, BuildTarget, Int32, BuildOptions, String[]) 10:12:05 UnityEditor.BuildPipeline:BuildPlayer(String[], String, String, BuildTargetGroup, BuildTarget, Int32, BuildOptions, String[]) 10:12:05 UnityEditor.BuildPipeline:BuildPlayer(BuildPlayerOptions) 10:12:05 GameBuilder:PerformAndroidBuild(AppStore) (at Assets\Editor\GameBuilder.cs:69) 10:12:05 GameBuilder:PerformAndroidGooglePlayBuild() (at Assets\Editor\GameBuilder.cs:13)
按照错误提示进入Preferences -> External Tools,未发现NDK相关警告。
已尝试方案
- 完全重装Windows和Unity
- 从正常机器复制NDK目录(Editor\Data\PlaybackEngines\AndroidPlayer\NDK)
- 通过Android Studio安装NDK
- 从Android Developers官网下载NDK
- 赋予所有用户Editor和NDK目录的完全权限
- 设置EditorPrefs键指定NDK路径
请问我们还遗漏了什么?
以下是几个可能遗漏的排查方向:
命令行执行的用户权限差异
编辑器内构建用的是当前登录用户,而命令行构建可能是用服务账户(比如CI/CD的运行账户)执行的,这个账户可能没有读取Unity配置文件的权限,或者Unity对该账户的External Tools配置未正确初始化。可以尝试用登录用户手动打开命令提示符执行构建命令,看是否能成功。环境变量未正确设置
检查系统或用户环境变量中是否存在ANDROID_NDK_ROOT或NDK_ROOT,Unity在命令行模式下可能会优先读取这些环境变量,而非编辑器内保存的配置。如果正常机器有这些变量,新机器需要同步设置,确保指向正确的NDK版本路径。Unity Hub的配置同步问题
确认新机器的Unity Hub是否登录了和正常机器相同的账户,是否开启了配置同步功能。如果配置同步未开启,编辑器内的External Tools设置不会被命令行模式读取,需要手动在Hub中为该Unity版本指定NDK路径。NDK版本兼容性
确认复制或下载的NDK版本是否和Unity 2022.3.54f1官方要求的版本完全一致(Unity 2022.3推荐的NDK版本是r23b)。如果版本过高或过低,命令行模式下可能会出现检测失败,而编辑器内有兼容处理。命令行参数补全
尝试在命令行中添加-buildTargetGroup Android参数,有些情况下Unity命令行需要明确指定目标组才能正确加载对应平台的工具配置,原命令只指定-buildTarget Android可能不够。项目本地配置覆盖
检查项目目录下的Library文件夹或ProjectSettings/ProjectSettings.asset中是否有NDK路径的本地配置,可能正常机器的项目配置有指定,而新机器拉取的项目未同步该配置。可以删除Library文件夹后重新执行命令行构建,让Unity重新生成配置。安全软件拦截
新机器的杀毒软件或Windows Defender可能拦截了Unity命令行进程读取NDK目录的操作,暂时禁用杀毒软件或添加Unity编辑器及NDK目录到白名单,测试是否能解决问题。
内容的提问来源于stack exchange,提问作者Sofia Lindgren

