如何在unreal4.27-release对Android14(TargetSDK 34)进行打包

目前unreal4-27-release安卓移动端支持最高的TargetVersion是33,谷歌商店在7月初要求所有的应用的TargetVersion必须升级到34,否则无法将无法更新。为了解决这个问题,我基于unreal4-27-release进行了一些处理,以下是处理过程的记录:

问题描述

Android14 版本的变化

Android14 版本具体变化可以参考 Behavior changes: Apps targeting Android 14 or higher,对于 ue4.27 影响最大的变化是:

Android14 以上的 context-registered receivers 中,registerReceiver 移除了无 tag 参数的实现:

ue4.27 存在的问题

ue4.27 的在非 Shipping 版本使用的命令行调试器 consoleCmdReceiverGoogle PAD 中的旧版本库都使用了无 tag 参数的实现,例如:

因此运行在 Android14 版本设备的包会因为这个问题导致闪退,例如:

解决方案

目前已知会依赖这个接口的有:

  1. com/epicgames/ue4/GameActivity.javaonStart() 的命令行调试器 consoleCmdReceiver
  2. Google PAD 插件注入的 AssetPackStateUpdateListener

GameActivity 的修改

ue4.27 发行版会在 \Engine\Build\Android\Java 路径放置一个特殊的 gradle 工程,这个工程中的部分 .template 文件会在打包过程中被虚幻特殊处理,将 UPL 中标记为注入 <insert> 的内容合并到这个文件,最后将合并的内容替换为 .java 文件,因此我们可以通过修改 \src\com\epicgames\ue4\GameActivity.java.template,处理 consoleCmdReceiver 的注册:

在修改之后打包生成的 gradle 工程,我们可以查看到生效的修改:

Google PAD 插件的修改

ue4.27 发行版 Google PAD 插件的会引入一个已经被舍弃的依赖:com.google.android.play:core,这个依赖在 Google PAD 插件插件中可以被 com.google.android.play:asset-delivery 完全替代,详情见 Overview of the Google Play Core libraries ,因此我们需要修改插件注入的依赖,这里选择的版本是 2.1.0:

同时需要删除如图的引入,这些引入仅在 com.google.android.play:core,需要同步移除