目前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 版本使用的命令行调试器 consoleCmdReceiver 和 Google PAD 中的旧版本库都使用了无 tag 参数的实现,例如:
因此运行在 Android14 版本设备的包会因为这个问题导致闪退,例如:
解决方案
目前已知会依赖这个接口的有:
com/epicgames/ue4/GameActivity.java中onStart()的命令行调试器consoleCmdReceiverGoogle 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,需要同步移除