Unity2021.3.15适配升级Android14
当前Unity版本
Unity2021.3.15f1
需要升级的内容
Target API Level:API level 34
Gradle:7.5.1
AGP:7.4.2
JDK:11
R8:8.3.37
具体步骤
升级Target API Level
- 进入Player Settings界面(从菜单中的Edit > Project Settings > Player进入)
- 在Player Settings > Other Settings > Identification中,将Target API Level设置为API level 34
升级Gradle
升级AGP(Android Gradle Plugin)
-
打开Assets\Plugins\Android\baseProjectTemplate.gradle文件
如果没有baseProjectTemplate.gradle,在Player Settings > Publish Settings > Build中,勾选Custom Base Gradle Template,Unity会自动创建
-
修改其中的
classpath 'com.android.tools.build:gradle:4.0.1'
为
classpath 'com.android.tools.build:gradle:7.4.2'
升级JDK
-
下载JDK11,安装到合适的位置
-
配置JKD路径
-
配置JDK版本
-
打开Assets\Plugins\Android\mainTemplate.gradle文件
如果没有mainTemplate.gradle,在Player Settings > Publish Settings > Build中,勾选Custom Main Gradle Template,Unity会自动创建
-
修改其中的sourceCompatibility、targetCompatibility为JavaVersion.VERSION_11
-
如果有Assets\Plugins\Android\launcherTemplate.gradle文件,也要修改其中的sourceCompatibility、targetCompatibility为JavaVersion.VERSION_11
launcherTemplate.gradle文件由Player Settings > Publish Settings > Build中的Custom Launcher Gradle Template开关控制
-
升级R8
R8在AGP7.0之后是强制开启的。
如果Player Settings中没有勾选R8,最终生成的gradle.properties中会包含“android.enableR8=false”,从而导致打包报错。
错误信息如下:
What went wrong: A problem occurred evaluating project ':launcher'. > Failed to apply plugin 'com.android.internal.application'. > The option 'android.enableR8' is deprecated. It was removed in version 7.0 of the Android Gradle plugin. Please remove it from `gradle.properties`.
所以需要开启R8,并配置正确的版本
-
Player Settings > Publish Settings > Minify中勾选R8
-
Assets\Plugins\Android\baseProjectTemplate.gradle的dependencies块中添加
classpath 'com.android.tools:r8:8.3.37'
其他问题记录
升级Target API Level后,打包报错
问题:
升级Target API Level到API level 34,打包时报错:
* What went wrong: Execution failed for task ':launcher:processReleaseResources'. > A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction > AAPT2 aapt2-4.2.0-7147631-windows Daemon #0: Unexpected error during link, attempting to stop daemon. This should not happen under normal circumstances, please file an issue if it does.
原因:
项目中的某些Google Play 插件(如Facebook)需要用AGP 7.0.0以上的版本编译。
解决:
升级AGP、Gradle、JDK、R8。
升级Target API Level后,Android14的手机无法运行
问题:
升级Target API Level到API level 34,打包后在Android13上运行正常,Android14上运行,会崩溃并报错:
2025-05-16 17:23:32.450 31487-31487/? A/DEBUG: Abort message: 'No pending exception expected: java.lang.SecurityException: com.xxx.xxx: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts at java.lang.Exception android.os.Parcel.createExceptionOrNull(int, java.lang.String) (Parcel.java:3069) at java.lang.Exception android.os.Parcel.createException(int, java.lang.String) (Parcel.java:3053) at void android.os.Parcel.readException(int, java.lang.String) (Parcel.java:3036) at void android.os.Parcel.readException() (Parcel.java:2978) at android.content.Intent android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(android.app.IApplicationThread, java.lang.String, java.lang.String, java.lang.String, android.content.IIntentReceiver, android.content.IntentFilter, java.lang.String, int, int) (IActivityManager.java:6171) at android.content.Intent android.app.ContextImpl.registerReceiverInternal(android.content.BroadcastReceiver, int, android.content.IntentFilter, java.lang.String, android.os.Handler, android.content.Context, int) (ContextImpl.java:1913) at android.content.Intent android.app.ContextImpl.registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler) (ContextImpl.java:1853) at android.content.Intent android.app.ContextImpl.registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter) (ContextImpl.java:1841) at android.content.Intent android.content.ContextWrapper.registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter) (ContextWrapper.java:772) at void com.google.android.play.core.listener.zzc.zzb() (com.google.android.play:core@@1.10.3:3) at void com.google.android.play.core.listener.zzc.zzf(com.google.android.play.core.listener.StateUpdatedListener) (com.google.android.play:core@@1.10.3:4) at void com.google.android.play.core.assetpacks.zzl.registerListener(com.google.android.play.core.assetpacks.AssetPackStateUpdateListener) (com.google.android.play:core@@1.10.3:2) at java.lang.Object com.unity3d.player.a.a(com.unity3d.player.IAssetPackManagerDownloadStatusCallback) ((null):-1) at java.lang.Object com.unity3d.player.PlayAssetDeliveryUnityWrapper.registerDownloadStatusListener(com.unity3d.player.IAssetPackManagerDownloadStatusCallback) ((null):-1) at boolean com.unity3d.player.UnityPlayer.nativeRender() ((null):-2) at boolean com.unity3d.player.UnityPlayer.access$300(com.unity3d.player.UnityPlayer) ((null):-1) at boolean com.unity3d.player.UnityPlayer$e$1.handleMessage(android.os.Message) ((null):-1) at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102) at boolean android.os.Looper.loopOnce(android.os.Looper, long, int) (Looper.java:230) at void android.os.Looper.loop() (Looper.java:319) at void com.unity3d.player.UnityPlayer$e.run() ((null):-1)'
原因:
com.google.play.core版本过低。
Android14要求,在注册广播接收器(Broadcast Receiver)时,需要指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED标志。但低一些的Android版本没有强制要求,所以不会崩溃报错。
解决:
将com.google.play.core升级到1.8.4以上。
下载地址:https://github.com/google/play-core-unity/releases
(一些Google Play的插件依赖于这个库,可以在升级那些的时候顺便升级,比如com.google.play.review)
升级com.google.play.core后,打包报错
问题:
升级com.google.play.core后,打包报错:
FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':launcher:checkReleaseDuplicateClasses'. > 1 exception was raised by workers: java.lang.RuntimeException: java.lang.RuntimeException: Duplicate class com.google.android.play.core.common.IntentSenderForResultStarter found in modules jetified-core-1.10.3-runtime.jar (com.google.android.play:core:1.10.3) and jetified-core-common-2.0.4-runtime.jar (com.google.android.play:core-common:2.0.4) Duplicate class com.google.android.play.core.common.LocalTestingException found in modules jetified-core-1.10.3-runtime.jar (com.google.android.play:core:1.10.3) and jetified-core-common-2.0.4-runtime.jar (com.google.android.play:core-common:2.0.4) Duplicate class com.google.android.play.core.common.PlayCoreDialogWrapperActivity found in modules jetified-core-1.10.3-runtime.jar (com.google.android.play:core:1.10.3) and jetified-core-common-2.0.4-runtime.jar (com.google.android.play:core-common:2.0.4) Duplicate class com.google.android.play.core.listener.StateUpdatedListener found in modules jetified-core-1.10.3-runtime.jar (com.google.android.play:core:1.10.3) and jetified-core-common-2.0.4-runtime.jar (com.google.android.play:core-common:2.0.4)
原因:
旧的com.google.play.core中有PlayCoreDependencies.xml,声明了对com.google.android.play:core:1.10.3的依赖。新的com.google.play.core中Dependencies.xml,声明了对com.google.android.play:core-common:2.0.4的依赖。这两个库中包含了相同的类。
解决:
删掉PlayCoreDependencies.xml。
Assets > External Dependency Manager > Android Resolver > Resolve
升级Target API Level后,报错ReviewManagerFactory
问题:
升级Target API Level到API level 34,能正常打包,运行时报错:
2025-05-20 14:35:19.167 23673-23880/? E/Unity: AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.play.core.review.ReviewManagerFactory java.lang.ClassNotFoundException: com.google.android.play.core.review.ReviewManagerFactory at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:607) at com.unity3d.player.UnityPlayer.nativeRender(Native Method) at com.unity3d.player.UnityPlayer.access$300(Unknown Source:0) at com.unity3d.player.UnityPlayer$e$1.handleMessage(Unknown Source:95) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loopOnce(Looper.java:230) at android.os.Looper.loop(Looper.java:319) at com.unity3d.player.UnityPlayer$e.run(Unknown Source:20) Caused by: java.lang.ClassNotFoundException: com.google.android.play.core.review.ReviewManagerFactory at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:607) at com.unity3d.player.UnityPlayer.nativeRender(Native Method) at com.unity3d.player.UnityPlayer.access$300(Unknown Source:0) at com.unity3d.player.UnityPlayer$e$1.handleMessage(Unknown Source:95) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loopOnce(Looper.java:230) at android.os.Looper.loop(Looper.java:319) at com.unity3d.player.UnityPlayer$e.run(Unknown Source:20) at UnityEngine.AndroidJNISafe.CheckException () [0x00096] in :0 at UnityEngine.AndroidJNISafe.FindClass (System.String name) [0x0000c] in Failed to install the following SDK components: build-tools;30.0.3 Android SDK Build-Tools 30.0.3 The SDK directory is not writable (C:\Program Files\Unity\Hub\Editor\2021.3.15f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK)
原因:
升级后Android SDK Build-Tools的版本需要为30.0.3,但Unity中指向路径中只有30.0.2。
解决:
升级Unity指定SDK目录下的build-tools的版本。
通过SDK Manager升级,或者复制一份放到Unity指向的目录SDK目录的build-tools文件夹中。
参考资料
https://blog.csdn.net/zj_how/article/details/140315813
https://discussions.unity.com/t/unity-2021-3-and-android-build-failure-when-using-android-legacy-libraries-and-target-api-34/952277
https://discussions.unity.com/t/unity3d-player-error-one-of-receiver-exported-or-receiver-not-exported-should-be-specified/931813/21