当前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
- 下载7.5.1版的Gradle,解压到合适的位置
- 从菜单Edit > Preferences打开偏好设置界面,切到External Tool切页
- 将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路径
-
打开Assets\Plugins\Android\gradleTemplate.properties
文件如果没有gradleTemplate.properties,在Player Settings > Publish Settings > Build中,勾选Custom Gradle Properties Template,Unity会自动创建
-
在其中添加org.gradle.java.home并指向JDK11的位置
(Mac上路径的配置方式和Windows略有不同,用“/”替换“\\”)
-
-
配置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 <d6567108da1a40dea6d8a0a38be02fc2>:0
at UnityEngine.AndroidJNISafe.FindClass (System.String name) [0x0000c] in <d6567108da1a40dea6d8a0a38be
原因:
com.google.play.review包版本太低。
解决:
升级com.google.play.review到至少1.8.2。
升级AGP后,打包报错
问题:
升级AGP后,打包报错
* What went wrong:
A problem occurred evaluating project ':launcher'.
> Failed to apply plugin 'com.android.internal.application'.
> Failed to create service 'com.android.build.gradle.options.ProjectOptionService_123fd504-12fa-486e-9290-1c505df07b65'.
> Could not create an instance of type com.android.build.gradle.options.ProjectOptionService.
> Cannot obtain value from provider of Gradle property 'android.testInstrumentationRunnerArguments.package' at configuration time.
Use a provider returned by 'forUseAtConfigurationTime()' instead.
原因:
Gradle和AGP不匹配。
解决:
升级Gradle。
整体升级后,无法打包,报错SDK Build-Tools版本
问题:
升级Target API Level、AGP、Gradle、JDK、R8后,打包报错Android SDK Build-tools 30.0.3
FAILURE: Build failed with an exception.
* What went wrong:
Could not determine the dependencies of task ':launcher:lintVitalReportRelease'.
> 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