分析 UE 官方脚本解决安卓环境配置问题(并优化画质)

452 阅读5分钟

  在使用 UE 前我的电脑里已经装过 Android Studio ,所以就没有按照官方文档的做。安装 Android Studio 主要就是用它的 SDK Manager 去安装 3 样东西:API、NDK、cmdline-tools ,我确定我是装好了的(API Level 30、NDK 25.1.8937393、cmdline-tools latest)。但是打包失败,提示没有安装 Android Studio 。如果按照官方文档从零安装,或许不会遇上我这个问题,但我能承受自己瞎折腾的后果,所以开始折腾。

改注册表

  根据官方文档,总是提到 SetupAndroid.bat ,那就先找找这个文件,它在引擎安装目录下(我的目录为 J:\Epic Games\UE_5.1\Engine\Extras\Android )。先双击运行,它提示如下内容:


Android Studio not installed, please download Android Studio 3.5.3 from https://developer.android.com/studio

  我非常确信我已经安装了,所以我猜测是不是因为我没有配环境变量的原因,先在系统里配置了环境变量(变量名是 ANDROID_HOME ,变量值是 E:\devTools\Android\Sdk ,在 Path 变量添加 %ANDROID_HOME%\bin )。再次执行,依然提示没有安装。于是我用编辑器打开这个脚本,好在这个脚本看起来并不复杂,很快我就发现了原因,在控制台输出未安装的脚本内容如下:

FOR /F "tokens=2*" %%A IN ('REG.exe query "%KEY_NAME%" /v "%VALUE_NAME%"') DO (set STUDIO_PATH=%%B)

IF EXIST "%STUDIO_PATH%" (
	echo.
	) ELSE (
	echo Android Studio not installed, please download Android Studio 3.5.3 from https://developer.android.com/studio
	%PAUSE%
	exit /b 1
)

  往上看,它企图在注册表里找键为 KEY_NAME% 值为 VALUE_NAME 的东西,再往上看就可以看出来,解决这个问题的办法就是在注册表中如下图加入脚本中提到的键值对:

1675347324190.png

  这里 * Path * 就是 Android Studio 存放的位置,SdkPath 没有给值,那为什么要加它?因为脚本中会根据这个键去找东西,内容如下:


set VALUE_NAME=SdkPath
set STUDIO_SDK_PATH=
FOR /F "tokens=2*" %%A IN ('REG.exe query "%KEY_NAME%" /v "%VALUE_NAME%"') DO (set STUDIO_SDK_PATH=%%B)

set ANDROID_LOCAL=%LOCALAPPDATA%\Android\Sdk

if "%STUDIO_SDK_PATH%" == "" (
	IF EXIST "%ANDROID_LOCAL%" (
		set STUDIO_SDK_PATH=%ANDROID_LOCAL%
	) ELSE (
		IF EXIST "%ANDROID_HOME%" (
			set STUDIO_SDK_PATH=%ANDROID_HOME%
		) ELSE (
			echo Unable to locate local Android SDK location. Did you run Android Studio after installing?
			%PAUSE%
			exit /b 2
		)
	)
)

echo Android Studio SDK Path: %STUDIO_SDK_PATH%

  简而言之,它先假设注册表里 Android Studio 这一项里有 SdkPath 这个东西,它为空字符串就给它赋值为 ANDROID_HOME。所以如果不添加 Path ,这个脚本会说你没安装 Android Studio ,如果没有 SdkPath 它会说你没有安装 SDK 。同时,你也必须配有 ANDROID_HOME 这个环境变量(当时挺无语的,Epic 为啥认为用户一定得按照它官方文档的方式来安装 Android Studio,不给自定义安装的机会呢?转念一想,我要是开发人员可能会说“为什么这些用户就是不肯按照文档傻瓜式操作呢!”。🧐)。

配置 Path 环境变量

  实际上,根据脚本内容,还是要给 Path 这个环境变量追加值的。内容就是 %ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools; ,脚本中对应的部分如下:


# 你可以直接复制然后搜索
set PLATFORMTOOLS=%STUDIO_SDK_PATH%\platform-tools;%STUDIO_SDK_PATH%\tools

  此时,执行 SetupAndroid.bat 依然有问题,控制台输出如下:


Unable to locate sdkmanager.bat. Did you run Android Studio and install cmdline-tools after installing?

  又和我说我装了的东西不存在?反正现在也算看的懂 bat 脚本了,看呗!找到输出这个报错的部分:


set SDKMANAGER=%STUDIO_SDK_PATH%\tools\bin\sdkmanager.bat
IF EXIST "%SDKMANAGER%" (
    echo Using sdkmanager: %SDKMANAGER%
) ELSE (
    set SDKMANAGER=%STUDIO_SDK_PATH%\cmdline-tools\latest\bin\sdkmanager.bat
    IF EXIST "%SDKMANAGER%" (
        echo Using sdkmanager: %SDKMANAGER%
    ) ELSE (
        echo Unable to locate sdkmanager.bat. Did you run Android Studio and install cmdline-tools after installing?
        pause
        exit /b 1
    )
)

  看起来问题出在了 SDKMANAGER 上面。但是蹊跷的是,我手动根据目录,是可以在找到 sdkmanger.bat 的。好在我在 stackoverflow 上找到了相关的帖子,解决方法是用 SDKMANAGER=%STUDIO_SDK_PATH%\cmdline-tools\latest\bin\sdkmanager.bat 代替上面的 set SDKMANAGER=%STUDIO_SDK_PATH%\tools\bin\sdkmanager.bat。原因是批处理脚本变量覆盖的问题,想查看具体原因的点这里

JDK 版本问题

  此时试图执行 SetupAndroid.bat,可能依然存在问题。我这里报错显示的是 JDK 版本低了,我想不是在 UE 里配置的用 Android StudioJRE 吗?按道理不该说这个问题呀,转念一想,是这个脚本的问题,打开一看,果然:


if DEFINED JAVA_HOME (set a=1) ELSE (
	set JAVA_HOME=%STUDIO_PATH%\jre
	setx JAVA_HOME "%STUDIO_PATH%\jre"
)

  于是去看了下 Android Studio 的版本,是 11 的,我现在 JAVA_HOME 存的是 JDK8 的路径。还好我同时有 JDK17 (我不会说我想做全栈的),切换变量值后再执行,脚本成功执行了。切换回 UE ,打包到安卓成功了。

  我用的 API Level30 的,所以运行在安卓系统版本为 11 的手机上没有问题,但是在 9 上会存在解析安装包错误的问题,这个就需要改 SDK 版本了。

UE 中的版本设置

  在 UE 的设置中,要设置正确版本,否则可能存在打出包来了,但是安装时提示解析安装包错误的问题。首先是 Project Setting -> Platforms -> Android 有两个设置 Minimum SDK VersionTarget SDK Version ,都设置为 30 (跟你想兼容的系统有关,我是安卓 11 )。然后是 Project Setting -> Platforms -> Android SDKSDK API Level 设置为 matchndkNDK API Level 设置为 android-25(取决于你 NDK 的版本)。

画质优化

  我想过打包成安卓画质会变差,但默认情况下打包出来的画质也太差了,在 BeginPlay 节点添加设置后,好多了,而且帧率并没有下降很多。设置如下:

image.png

  它用于缩放设备上的内容,决定了像素密度。