文章适用于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 删掉即可。