Unreal发布Android App如何面对混乱的Android SDK开发环境

Unreal发布Android App如何面对混乱的Android SDK开发环境

  • [混乱的Android SDK开发环境](#混乱的Android SDK开发环境)
  • [Unreal 4可以借用Unity3D安装的Android环境](#Unreal 4可以借用Unity3D安装的Android环境)
  • [Unreal 5需要安装Android Studio开发环境](#Unreal 5需要安装Android Studio开发环境)
  • [Android Studio的DK版本目录](#Android Studio的DK版本目录)
  • 处理gradle和java版本
  • gradle提示错误
  • 总结

混乱的Android SDK开发环境

Unreal编译Android App需要配置SDK开发环境

其中包含了Android SDK NDK JDK,非常混乱,几个DK之间的版本不匹配,编译出错,报错信息很笼统,很难定位具体问题。一般来说,借用其他软件自动安装的DK一般为兼容的一套,如果可以直接使用,会减少很多我们自己配置SDK出现版本兼容的问题。

Unreal 4可以借用Unity3D安装的Android环境

Unity 3D使用Unity HUB安装Android开发环境时会自动安装一套配套的Android SDK NDK JDK,Unreal可以借用版本匹配的Unity3D的Android开发环境。

比如Unreal 4.27就可以使用Unity3D 2021.3.33f1c1的开发环境,路径如下:

SDK:D:\Program Files\Unity Hub\Editor\2021.3.33f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK

NDK:D:\Program Files\Unity Hub\Editor\2021.3.33f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\NDK

JDK:D:\Program Files\Unity Hub\Editor\2021.3.33f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\OpenJDK

Unreal 5需要安装Android Studio开发环境

Unreal 5需要使用SDK的版本为r25b,这个和Unity3D安装的Android SDK并不匹配,而且Unreal会验证系统是否安装了Android Studio,没有安装则直接报错退出编译。

有人说可以建一个空目录欺骗Unreal,因为输出Android Apk时只需要用到3个DK,完全没有用到Android Studio的其他组件。

Android Studio给人很混乱的一个感觉,就是各种版本。前面说的Unreal需要Android SDK版本为r25b,高于或者低于这个版本都是不行的。

bash 复制代码
UATHelper: Packaging (Android (ETC2)): Android: (Status=Invalid, Allowed_Sdk=r25b, Current_Sdk=r23b, Allowed_AutoSdk=r25b, Current_AutoSdk=, Flags="InstalledSdk_InvalidVersionExists, Platform_ValidHostPrerequisites")

但是打开Android Studio的SDK Manager管理器,可以看到各种版本号

Android Studio的SDK Manager管理器中显示了很多版本号,有API的版本,有Android系统的版本,唯独没有我们要的r25b这个版本,让我们无从下手。

实际上,这里说的r25b实际上是Android SDK Build-Tools和NDK的版本。

默认情况下,我们是看不到这个版本号的,需要点击右下角的Show Package Details复选框

这个时候我们才能看到SDK Tools的版本(SDK和NDK版本),这个才是Unreal需要的版本号,Unreal 5.3安装对应的25版本即可。

Android Studio的DK版本目录

Android SDK和NDK目录在SDK Manager管理器中有显示

SDK:C:\Users\wlf\AppData\Local\Android\sdk

NDK:C:\Users\wlf\AppData\Local\Android\sdk\ndk\25.1.8937393

NDK目录下有我们安装的多个版本,选择Unreal要求的版本。

但JDK的版本不在这个目录下。AAndroid Studio内置了一个JDK,没有通过SDK Manager进行管理,位置位于Android Studio的安装目录下。

JDK:C:\Program Files\Android\Android Studio\jre

处理gradle和java版本

Unreal打包Android APK需要用到gradle,gradle是安卓的打包工具,需要和IDE配套,一般会自动下载,但由于墙的存在,可能会下载失败。

Unreal提示出错信息

bash 复制代码
UATHelper: Packaging (Android (ETC2)): Creating rungradle.bat to work around commandline length limit (using unused drive letter Z:)
UATHelper: Packaging (Android (ETC2)): Making .apk with Gradle...
UATHelper: Packaging (Android (ETC2)): Downloading https://services.gradle.org/distributions/gradle-7.5-all.zip

gradle的建构目录位于:C:\Users\wlf\.gradle\wrapper\dists

目录下有不同IDE用到的不同gradle版本。如果没有对应的版本或者下载失败(0字节zip),可以手动下载并解压覆盖。

gradle提示错误

gradle是IDE最终合成apk的阶段,提示错误一般很笼统,很难看明白。

bash 复制代码
UATHelper: Packaging (Android (ETC2)): FAILURE: Build failed with an exception.
UATHelper: Packaging (Android (ETC2)): BUILD FAILED in 5s
UATHelper: Packaging (Android (ETC2)): cmd.exe failed with args /c "H:\Coding\Unreal\ARStream5.3\Intermediate\Android\arm64\gradle\rungradle.bat" :app:assembleDebug
UATHelper: Packaging (Android (ETC2)): BUILD FAILED

可以手动运行Unreal安装目录下的setupandroid.bat来检查具体出错信息。

如果有错误,会提示具体错误。

bash 复制代码
PS D:\Program Files\Epic Games\UE_5.3\Engine\Extras\Android> .\setupandroid.bat

Android Studio Path: C:\Program Files\Android\Android Studio Android Studio SDK Path: 
C:\Users\wlf\AppData\Local\Android\Sdk Using sdkmanager: 
C:\Users\wlf\AppData\Local\Android\Sdk\cmdline-tools\latest\bin\sdkmanager.bat 
Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: 
com/android/sdklib/tool/sdkmanager/SdkManagerCli has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at 
java.lang.ClassLoader.defineClass1(Native Method) at 
java.lang.ClassLoader.defineClass(ClassLoader.java:757) at 
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at 
java.net.URLClassLoader.defineClass(URLClassLoader.java:468) at 
java.net.URLClassLoader.access$100(URLClassLoader.java:74) at 
java.net.URLClassLoader$1.run(URLClassLoader.java:369) at 
java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at 
java.net.URLClassLoader.findClass(URLClassLoader.java:362) at 
java.lang.ClassLoader.loadClass(ClassLoader.java:419) at 
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at 
java.lang.ClassLoader.loadClass(ClassLoader.java:352) at 
sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495) Update failed. Please check the Android Studio install.

chatGPT解释一下错误

其实就是jdk版本问题,IDE需要的gradle 7.5需要java-17,而我安装的Android Studio自带的jdk是java-8的,不能编译java文件造成的。

单独安装java-17并配置环境变量JAVA_HOME

按说明文档只要配置Unreal的Project Setting的SDK目录即可,但保险起见还需要配置JAVA_HOME目录,因为Unreal调用命令行执行外部命令时可能会使用系统环境变量而不使用Unreal配置的SDK目录

配置Unreal/Project Setting/Android SDK目录

总结

总的来说,Unreal编译Android APK需要用到Android SDK NDK,JDK和gradle。

其中Android SDK是安卓开发环境的编译器,NDK是Android编译C/C++代码需要的工具,SDK和NDK的版本需要和Unreal需求的特定版本一致,比如Unreal 5.3需要r25b版本,安装Android SDK/NDK 25版即可。

JDK是JAVA语言开发包,也就是java的编译环境,是安卓开发的基础。gradle是IDE(也就是Unreal编辑器)打包Android APK的工具,运行在java开发环境下,gradle的版本是IDE规定的(比如Unreal 5.3需要gradle 7.5),而确定的gradle需要特定的java开发环境,也就是特定JDK版本,比如gradle 7.5需要java-17,安装并配置java-17版本即可。

相关推荐
阿巴斯甜14 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker14 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952715 小时前
Andorid Google 登录接入文档
android
黄林晴17 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android