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版本即可。

相关推荐
长亭外的少年7 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿9 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神10 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛10 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法11 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter12 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快13 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl14 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江14 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
Dnelic-14 小时前
解决 Android 单元测试 No tests found for given includes:
android·junit·单元测试·问题记录·自学笔记