UE4 打包Android apk (32位and64位) 血与泪的教训

文章适用于UE4.27打包 安卓32/64位apk。

这两天用ue4打包安卓apk遇到了不少问题,吐血研究了一天,终于解决所有问题,完成打包。

环境要求

最好用Android Studio 4.0,一定不要用很高的版本,之后下载 NDK21.4.7075529、java8环境、SDK版本 Android10,0(API 29)、Android9.0(API28),都可以

当然你要是舍不得你的高版本Android Studio,那就用我这里的SDK。其他NDK之类的用自己下载的就没问题。

通过网盘分享的文件:SDK.zip
链接: https://pan.baidu.com/s/1i-VhEmwI-wabN6frYyfqOQ?pwd=btcc 提取码: btcc
--来自百度网盘超级会员v7的分享

编译配置:

 

其他编译选项没有硬性要求,没有那种"目标SDK版本必须为28"这种说法,因为我目标SDK不管是选择23,还是30都能编译成功。

 

打包64位的常见问题

SDK版本过高问题

 我觉的SDK版本在28、29上下范围内应该都问题不大,但高太对或者低太多肯定有问题。

 

Android Studio 版本过高问题

换Android Studio4.0把,或者使用我给的SDK也行

 

打包32位的常见问题

UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): The following annotation processors are not incremental: lifecycle-compiler-2.0.0.jar (androidx.lifecycle:lifecycle-compiler:2.0.0).
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Make sure all annotation processors are incremental to improve your build speed.
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:104: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         int stringResourceID = paused ? R.string.text_button_resume :
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                          ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:105: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                 R.string.text_button_pause;
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                  ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:236: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                 overridePendingTransition(R.anim.noaction, R.anim.noaction);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                            ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:236: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                 overridePendingTransition(R.anim.noaction, R.anim.noaction);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                                             ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:264: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                 mStatusText.setText(R.string.text_verifying_download);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                      ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:464: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                     mStatusText.setText(R.string.text_validation_failed);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                          ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:489: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         setContentView(R.layout.downloader_progress);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                         ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:491: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mPB = (ProgressBar) findViewById(R.id.progressBar);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                           ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:492: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mStatusText = (TextView) findViewById(R.id.statusText);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                                ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:493: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mProgressFraction = (TextView) findViewById(R.id.progressAsFraction);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                                      ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:494: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mProgressPercent = (TextView) findViewById(R.id.progressAsPercentage);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                                     ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:495: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mAverageSpeed = (TextView) findViewById(R.id.progressAverageSpeed);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                                  ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:496: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mTimeRemaining = (TextView) findViewById(R.id.progressTimeRemaining);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                                   ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:497: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mDashboard = findViewById(R.id.downloaderDashboard);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                    ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:498: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mCellMessage = findViewById(R.id.approveCellular);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                      ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:499: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mPauseButton = (Button) findViewById(R.id.pauseButton);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                               ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:500: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mWiFiSettingsButton = (Button) findViewById(R.id.wifiSettingsButton);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                                      ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:522: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         Button resumeOnCell = (Button) findViewById(R.id.resumeOverCellular);
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                                      ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:787: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mAverageSpeed.setText(getString(R.string.kilobytes_per_second,
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                          ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Z:\app\src\main\java\com\YourCompany\my_first_demo\DownloaderActivity.java:789: ����: �����R������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):         mTimeRemaining.setText(getString(R.string.time_remaining,
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):                                           ^
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): ע: ijЩ�����ļ�ʹ�û򸲸����ѹ�ʱ�� API��
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): ע: �й���ϸ��Ϣ, ��ʹ�� -Xlint:deprecation ���±��롣
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): 20 ������
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): > Task :app:compileDebugJavaWithJavac FAILED
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): 32 actionable tasks: 3 executed, 29 up-to-date
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): FAILURE: Build failed with an exception.
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): * What went wrong:
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Execution failed for task ':app:compileDebugJavaWithJavac'.
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): > Compilation failed; see the compiler error output for details.
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): * Try:
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): * Get more help at https://help.gradle.org
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): BUILD FAILED in 10s
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): ERROR: cmd.exe failed with args /c "D:\tlsn\compiler\UE4\demo\my_first_demo\Intermediate\Android\armv7\gradle\rungradle.bat" :app:assembleDebug
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)):        (see C:\Users\27236\AppData\Roaming\Unreal Engine\AutomationTool\Logs\D+tlsn+compiler+UE4+ue4.27+UE_4.27\Log.txt for full exception trace)
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): AutomationTool exiting with ExitCode=1 (Error_Unknown)
UATHelper: 打包 (Android(多个:ASTC,DXT,ETC2)): BUILD FAILED

 

 

 

参考: https://forums.unrealengine.com/t/android-project-not-building-in-ue-4-8-1/35401/5

Package R 错误是由于在某个时候更改了包名称而导致 OBB 下载器 java 文件在不同目录中多次复制而引起的。4.9 修复了这个问题,但与此同时,修复此问题的方法是删除项目的 Intermediate/Android/APK/src 和 Build/Android/src 目录并重新打包。

直接 Intermediate 目录与 Build/Android/src  删掉即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/909577.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot快速集成neo4j

1.导入坐标,我这里是springboot3.0.2<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId></dependency> 2.写ymlspring:data:neo4j:database: neo4j:uri: bolt://localho…

使用kind快速搭建本地k8s集群

学科:云平台部署与搭建 姓名:田凯蕾 学号:23593115

SpringAI用嵌入模型操作向量数据库!

嵌入模型(Embedding Model)和向量数据库(Vector Database/Vector Store)是一对亲密无间的合作伙伴,也是 AI 技术栈中紧密关联的两大核心组件,两者的协同作用构成了现代语义搜索、推荐系统和 RAG(Retrieval Augmented Generation,检索增强生成)等应用的技术基础。PS:准…

QEMU、KVM和DPU的关系

QEMU、KVM 和 DPU 在现代虚拟化与云计算架构中扮演不同角色,通过协同工作实现高性能、低延迟的资源虚拟化与硬件加速。以下是它们的关系及协作方式:1. 角色定位组件 核心功能 层级QEMU 提供硬件设备模拟、虚拟机生命周期管理,支持跨平台虚拟化(如模拟 ARM 设备)。 用户态K…

Javascript - 2

Javascript - 2 事件 DOM DOM - document object model - HTML 文档的结构化表示 由浏览器自动创建,以 树结构存储,每一个 HTML 元素(标签、内容、属性)都是一个对象 DOM允许我们使用 js 访问 HTML 元素和样式,以操作它们改变文本 改变 HTML 属性 改变 CSS 样式可以通过 j…

【QML】定时时间控制控件

代码:1 import QtQuick 2.152 import QtQuick.Controls 2.153 4 ApplicationWindow {5 width: 5006 height: 3007 visible: true8 title: "飞行时间设置"9 10 // 自定义时间选择组件11 Component {12 id: timeComponent13 …

Ollama本地部署qwen2.5

一、概述 Ollama 是一个开源的本地大语言模型运行框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。支持多种操作系统,包括 macOS、Windows、Linux 以及通过 Docker 容器运行。Ollama 提供对模型量化的支持,可以显著降低显存要求,使得在普通家用计算机上运行…

天下拍-艺术品拍卖经典案例分享

在当今快速发展的数字化时代,艺术品拍卖行业正经历着前所未有的变革。天下拍作为一款功能齐全的拍卖产品,凭借先进的技术平台和专业的服务团队,为艺术品拍卖提供了全新的解决方案。同步拍卖的模式和互联网运营工具的加持可以帮助您实现艺术品的高效变现和价值最大化。线上线…

[T.4] 团队项目:团队代码管理准备

项目 内容这个作业属于哪个课程 2025年春季软件工程(罗杰、任健)这个作业的要求在哪里 [T.4] 团队项目:团队代码管理准备我在这个课程的目标是 掌握代码管理与修复流程,完善团队协作机制这个作业在哪个具体方面帮助我实现目标 团队协作,软件开发代码管理基础团队代码仓库地…

asio使用async_connect,连接127.0.0.1,函数回调函数errorcode连接成功

编译运行rest_rpc库的客户端出现问题 asio使用async_connect,连接127.0.0.1,函数回调函数errorcode连接成功(没有启动服务器的情况下),需要等到调用发送函数,才会失败。调试发现是使用9000端口被本机另外的程序占用了-_- 环境:win10 netstat -ano | findstr "9000&…

算法备案没产品可以申请吗?

算法备案复审阶段涉及产品信息填报,所以一度让一些开发者有这样的错误认知:只有等产品要上线了,才能火急火燎地去申请算法备案。但这个观点其实是错误的,其实开发者也可以在没有具体产品的情况下发起算法备案申请。只要材料合法合规,也能取得备案号。下面是一些具体信息介…