目前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()
的命令行调试器consoleCmdReceiver
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
,需要同步移除