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

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

升级Gradle

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

升级AGP(Android Gradle Plugin)

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

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

    创建baseProjectTemplate.gradle

  2. 修改其中的

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

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

    修改AGP版本

升级JDK

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

  2. 配置JKD路径

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

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

      创建gradleTemplate.properties

    2. 在其中添加org.gradle.java.home并指向JDK11的位置
      Windows修改JDK路径

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

  3. 配置JDK版本

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

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

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

    3. 如果有Assets\Plugins\Android\launcherTemplate.gradle文件,也要修改其中的sourceCompatibility、targetCompatibility为JavaVersion.VERSION_11
      修改JDK版本
      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
    启用R8

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

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

    设置R8版本

其他问题记录

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

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

<think>好的,我现在需要向用户介绍Unity 3D。首先,我得确保自己理解Unity 3D的基本概念和主要用途。Unity 3D是一个跨平台的游戏引擎,广泛用于游戏开发,同时也应用于虚拟现实、增强现实、建筑可视化等领域。用户可能想知道它的核心功能、支持的平台、编程语言以及适用人群。 接下来,我需要按照用户提供的系统级指令来组织内容。用户要求结构清晰,分步骤解答,所以可能需要分点说明。要注意所有行内数学表达式用$...$,但这里可能用不上数学公式,不过如果有涉及变量或术语,比如版本号或技术术语,可能需要特别处理。但Unity 3D的介绍可能更多涉及功能而非数学,所以可能不需要用到LaTeX公式,但需要保持警惕,万一提到版本号如Unity 2021.x,可能需要检查是否需要特殊格式,不过根据用户指令,可能不需要。 然后,要确保使用中文回答,语言要准确且易懂。可能需要先概述Unity 3D是什么,然后分点介绍其核心功能、跨平台支持、脚本语言、资源商店、适用领域、学习资源和社区支持,以及版本情况。 需要验证一些细节,比如Unity使用的编程语言是C#,是否正确?是的。支持的平台包括PC、移动设备、主机、VR/AR设备,这些对吗?对的。资源商店叫Asset Store,对吗?正确。适用领域除了游戏,还有影视、教育等,是的。 另外,用户要求回答真实可靠,所以需要确认提到的信息是否准确。例如,Unity的跨平台能力是否包括这么多平台,以及是否有免费版本(Personal版)。Unity的确有免费版本,适合个人和小团队,收入超过一定数额需要升级到专业版,这个是对的。 可能需要提到Unity的界面是可视化的,适合非程序员使用,同时支持程序员编写脚本扩展功能。还要提到组件化系统,即通过添加组件来构建对象的行为,这是Unity的一个核心概念。 在结构上,可能需要分为几个部分,每个部分用标题和编号列出,但用户可能希望结构清晰,所以使用分点列表比较合适。同时,用户希望逐步解决问题,所以可能需要从定义开始,逐步深入。 最后,检查是否符合LaTeX格式要求,虽然这里可能用不上数学公式,但如果有任何技术术语需要强调,可能需要用斜体或加粗,但根据系统指令,行内数学表达式用$...$,所以如果提到类似变量,比如版本号Unity 2021.x,可能需要写成$Unity 2021.x$?不过用户给的例子是数学表达式,所以可能不需要。因此,这里可能不需要使用LaTeX,但需要确保其他要求,如独立公式用$$...$$,但这里没有公式,所以可以忽略。 总结,回答的结构应该是: 1. 概述Unity 3D 2. 核心功能 3. 跨平台支持 4. 脚本语言 5. Asset Store 6. 适用领域 7. 学习资源和社区 8. 版本情况 每个部分用分点说明,使用中文,确保信息准确,结构清晰。需要避免使用Markdown格式,所以用文字描述分点。</think>Unity 3D 是一款功能强大的跨平台游戏引擎,由 Unity Technologies 开发。它广泛用于游戏开发、虚拟现实(VR)、增强现实(AR)、建筑可视化、影视动画等领域。以下是逐步介绍: --- ### 1. **核心功能** - **可视化编辑器**:提供直观的拖放界面,支持场景搭建、动画编辑、物理模拟等操作,降低开发门槛。 - **组件化系统**:游戏对象(GameObject)通过添加组件(如刚体、碰撞器、脚本)定义行为,提高开发灵活性。 - **物理引擎**:内置 NVIDIA PhysX 引擎,模拟真实世界的碰撞、重力、摩擦力等效果。 - **跨平台渲染管线**:支持通用渲染管线(URP)和高清渲染管线(HDRP),适配不同性能需求的设备。 --- ### 2. **跨平台支持** Unity 可一键部署到 **30+ 平台**,包括: - **移动端**:iOS、Android - **PC/主机**:Windows、macOS、Linux、PlayStation、Xbox - **VR/AR**:Oculus Rift、HTC Vive、Microsoft HoloLens、ARKit/ARCore - **Web**:通过 WebGL 直接在浏览器运行。 --- ### 3. **脚本语言** - 使用 **C#** 作为主要编程语言,开发者可通过编写脚本控制游戏逻辑、物理交互等。 - 示例代码: ```csharp void Update() { if (Input.GetKeyDown(KeyCode.Space)) { Debug.Log("空格键被按下!"); } } ``` --- ### 4. **资源商店(Asset Store)** - 提供海量免费/付费资源,包括 3D 模型、音效、插件(如 Dialogue System、Playmaker),加速开发流程。 --- ### 5. **适用领域** - **游戏开发**:从 2D 小游戏到 3A 级大作(如《原神》《纪念碑谷》)。 - **工业与教育**:模拟训练、虚拟实验室。 - **影视制作**:实时渲染技术用于预演和动画制作(如《狮子王》2019 版)。 --- ### 6. **学习资源与社区** - **官方教程**:Unity Learn 平台提供免费课程。 - **活跃社区**:论坛、GitHub 开源项目、技术博客(如 Unity官方博客、Catlike Coding)。 - **认证体系**:Unity Certified Programmer 等认证提升职业竞争力。 --- ### 7. **版本与授权** - **Unity Personal**:免费版,适用于个人或年收入低于 $10 万美元的小团队。 - **Unity Pro/Enterprise**:付费版,提供高级功能(如云构建、性能分析工具)和团队协作支持。 --- ### 总结 Unity 3D 以低门槛、高扩展性和强大生态著称,是开发者实现创意的高效工具。无论你是独立开发者还是企业团队,都能通过 Unity 快速构建高质量交互内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值