Unity2021.3.15适配升级Android14

06-01 1780阅读

当前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

  1. 进入Player Settings界面(从菜单中的Edit > Project Settings > Player进入)
  2. 在Player Settings > Other Settings > Identification中,将Target API Level设置为API level 34

    Unity2021.3.15适配升级Android14

升级Gradle

  1. 下载7.5.1版的Gradle,解压到合适的位置
  2. 从菜单Edit > Preferences打开偏好设置界面,切到External Tool切页
  3. 将Gradle设置为新版本的位置

    Unity2021.3.15适配升级Android14

升级AGP(Android Gradle Plugin)

  1. 打开Assets\Plugins\Android\baseProjectTemplate.gradle文件

    如果没有baseProjectTemplate.gradle,在Player Settings > Publish Settings > Build中,勾选Custom Base Gradle Template,Unity会自动创建

    Unity2021.3.15适配升级Android14

  2. 修改其中的

    classpath 'com.android.tools.build:gradle:4.0.1'
    

    classpath 'com.android.tools.build:gradle:7.4.2'
    

    Unity2021.3.15适配升级Android14

升级JDK

  1. 下载JDK11,安装到合适的位置

  2. 配置JKD路径

    1. 打开Assets\Plugins\Android\gradleTemplate.properties

      文件

      如果没有gradleTemplate.properties,在Player Settings > Publish Settings > Build中,勾选Custom Gradle Properties Template,Unity会自动创建

      Unity2021.3.15适配升级Android14

    2. 在其中添加org.gradle.java.home并指向JDK11的位置

      Unity2021.3.15适配升级Android14

      (Mac上路径的配置方式和Windows略有不同,用“/”替换“\\”)

      Unity2021.3.15适配升级Android14

  3. 配置JDK版本

    1. 打开Assets\Plugins\Android\mainTemplate.gradle文件

      如果没有mainTemplate.gradle,在Player Settings > Publish Settings > Build中,勾选Custom Main Gradle Template,Unity会自动创建

      Unity2021.3.15适配升级Android14

    2. 修改其中的sourceCompatibility、targetCompatibility为JavaVersion.VERSION_11

      Unity2021.3.15适配升级Android14

    3. 如果有Assets\Plugins\Android\launcherTemplate.gradle文件,也要修改其中的sourceCompatibility、targetCompatibility为JavaVersion.VERSION_11

      Unity2021.3.15适配升级Android14

      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,并配置正确的版本

  1. Player Settings > Publish Settings > Minify中勾选R8

    Unity2021.3.15适配升级Android14

  2. Assets\Plugins\Android\baseProjectTemplate.gradle的dependencies块中添加

    classpath 'com.android.tools:r8:8.3.37'
    

    Unity2021.3.15适配升级Android14

其他问题记录

升级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

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码