引擎的环境依赖与 NDK 支持

引擎对 Android 版本的支持

在之前的笔记里:Android SDK 版本与 Android 的版本 列出了 Android 系统版本和 API Leve 版本之间的对照表。

但是 UE 不同的引擎版本对 Android 的系统支持也是不一样的,在 Project Setting-Android 中的 Minimum SDK Version 中可以设置最小的 SDK 版本,也就是 UE 打包 Android 所支持的最低系统版本。

在 UE4.25 中,最低可以设置 Level 为 19,即 Android4.4,在 4.25 之前的引擎版本最低支持 Level 9,也就是 Android 2.3。

这部分的代码可以在 Runtime/Android/AndroidRuntimeSettings/Classes/AndroidRuntimeSettings.h 中查看,并对比不同引擎版本的区别。

SDK 版本与 Android 的版本对照表

可以在 Google 的开发者站点看到:Android SDK Platform
Build.VERSION_CODES 的含义:Build.VERSION_CODES

AndroidVersion SDK Version Build.VERSION_CODES
Android 11 (API level 30) R
Android 10 (API level 29) Q
Android 9 (API level 28) P
Android 8.1 (API level27) O_MR1
Android 8.0 (API level 26) O
Android 7.1 (API level 25) N_MR1
Android 7.0 (API level 24) N
Android 6.0 (API level 23) M
Android 5.1 (API level 22) LOLLIPOP_MR1
Android 5.0 (API level 21) LOLLIPOP
Android 4.4W (API level 20) KITKAT_WATCH
Android 4.4 (API level 19) KITKAT
Android 4.3 (API level 18) JELLY_BEAN_MR2
Android 4.2 (API level 17) JELLY_BEAN_MR1
Android 4.1 (API level 16) JELLY_BEAN
Android 4.0.3 (API level15) ICE_CREAM_SANDWICH_MR1
Android 4.0 (API level 14) ICE_CREAM_SANDWICH
Android 3.2 (API level 13) HONEYCOMB_MR2
Android 3.1 (API level 12) HONEYCOMB_MR1
Android 3.0 (API level 11) HONEYCOMB
Android 2.3.3 (API level 10) GINGERBREAD_MR1
Android 2.3 (API level 9) GINGERBREAD

UE4 对 Android 的最低支持是 SDK9,也就是 Android2.3。

引擎对 AndroidNDK 的要求

UE 在打包 Android 的时候会要求系统中具有 NDK 环境,但是不同的引擎版本对 NDK 的版本要求也不一样。

当使用不支持的 NDK 版本时,打包会有如下错误:

1
2
UATHelper: Packaging (Android (ETC2)):   ERROR: Android toolchain NDK r14b not supported; please use NDK r21 to NDK r23 (NDK r21b recommended)
PackagingResults: Error: Android toolchain NDK r14b not supported; please use NDK r21 to NDK r23 (NDK r21b recommended)

提示当前系统中的 NDK 版本不支持,并会显示支持的版本。

UE 打包时对 NDK 版本的检测是在 UBT 中执行的,具体文件为UnrealBuildTool/Platform/Android/AndroidToolChain.cs

其中定义了当前引擎版本支持的 NDK 的最低和最高版本:

1
2
3
4
// in ue 4.25
readonly int MinimumNDKToolchain = 210100;
readonly int MaximumNDKToolchain = 230100;
readonly int RecommendedNDKToolchain = 210200;

可以在 Github 上比较方便地查看不同引擎版本要求的 NDK 版本:UE_425_AndroidToolChain.cs

不同的引擎版本对 NDK 的要求 UE 文档中也有介绍:Setting Up Android SDK and NDK for Unreal

Unreal Engine NDK Version
4.25+ NDK r21b, NDK r20b
4.21 - 4.24 NDK r14b
4.19 - 4.20 NDK r12b

NDK 的编译器版本

UE4 支持r14b-r18b 的 Android NDK,但是我在 UE4.22.3 中设置 r18b 被引擎识别为r18c:

1
2
3
4
5
6
7
8
9
10
UATHelper: Packaging (Android (ETC2)):   Using 'git status' to determine working set for adaptive non-unity build (C:\Users\imzlp\Documents\Unreal Projects\GWorldClient).
UATHelper: Packaging (Android (ETC2)): ERROR: Android toolchain NDK r18c not supported; please use NDK r14b to NDK r18b (NDK r14b recommended)
PackagingResults: Error: Android toolchain NDK r18c not supported; please use NDK r14b to NDK r18b (NDK r14b recommended)
UATHelper: Packaging (Android (ETC2)): Took 7.4575476s to run UnrealBuildTool.exe, ExitCode=5
UATHelper: Packaging (Android (ETC2)): ERROR: UnrealBuildTool failed. See log for more details. (C:\Users\imzlp\AppData\Roaming\Unreal Engine\AutomationTool\Logs\C+Program+Files+Epic+Games+UE_4.22\UBT-GWorld-Android-Development.txt)
UATHelper: Packaging (Android (ETC2)): (see C:\Users\imzlp\AppData\Roaming\Unreal Engine\AutomationTool\Logs\C+Program+Files+Epic+Games+UE_4.22\Log.txt for full exception trace)
PackagingResults: Error: UnrealBuildTool failed. See log for more details. (C:\Users\imzlp\AppData\Roaming\Unreal Engine\AutomationTool\Logs\C+Program+Files+Epic+Games+UE_4.22\UBT-GWorld-Android-Development.txt)
UATHelper: Packaging (Android (ETC2)): AutomationTool exiting with ExitCode=5 (5)
UATHelper: Packaging (Android (ETC2)): BUILD FAILED
PackagingResults: Error: Unknown Error

之所以要换 NDK 的版本是因为不同的 NDK 版本所包含的编译器对 C++11 标准支持度不同。

NDK clang version
r14b clang 3.8.275480 (based on LLVM 3.8.275480)
r17c clang version 6.0.2
r18b clang version 7.0.2
r20b clang version 8.0.7