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  删掉即可。

posted @ 2025-04-01 16:51  TLSN  阅读(144)  评论(0)    收藏  举报