使用 Unity 构建适用于 Android 12 的应用

构建以 Android 12(SDK 级别 31)为目标平台的 Android 项目时,可能会遇到以下错误:

Could not determine the dependencies of task ':launcher:compileDebugJavaWithJavac'.
> Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Manager.
> Configure project :launcher
WARNING: The option 'android.enableR8' is deprecated and should not be used anymore.
It will be removed in a future version of the Android Gradle plugin, and will no longer allow you to disable R8.
Build-tool 31.0.0 is missing DX at <android-sdk-path>/sdk/build-tools/31.0.0/dx
File ~/.android/repositories.cfg could not be loaded.
Build-tool 31.0.0 is missing DX at <android-sdk-path>/sdk/build-tools/31.0.0/dx

这是因为 Android Build Tools 版本 31.0.0 与 Unity 构建系统不兼容。从 Android Build Tools 31.0.0 版开始,DX 被移除,取而代之的是 D8,这导致适用于 Android 的 Unity build 中断。

以下情况下可能会触发此错误:

  • 升级到 ARCore Extensions for Unity AR Foundation 版本 1.26、
  • 在任何 Unity 项目中以 Android SDK 级别 31 为目标平台,无论 ARCore Extensions 版本如何,
  • 在安装 Build Tools 版本 31.0.0 时,在任何 Unity 项目中以 Android SDK 级别 30 为目标平台,无论 ARCore Extensions 版本如何。

临时解决方法

我们正在与 Unity 合作解决此不兼容问题。在此期间,请按照以下说明构建以 Android 12 为目标平台的项目:

  1. Project Settings > Player > Android > Publishing Settings > Build 中,选择以下两项:

    1. Custom Main Gradle Template,
    2. Custom Launcher Gradle Template.

    屏幕截图,显示了两个 Gradle 模板选项均处于选中状态的“Publishing Settings”(发布设置)和“Build”(构建)窗格

  2. 对生成的两个文件应用以下更改:

    • Assets/Plugins/Android/mainTemplate.gradle
    • Assets/Plugins/Android/launcherTemplate.gradle

    移除文件顶部的以下注释(如有):

    // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
    

    然后按如下所示修改 compileSdkVersionbuildToolsVersion

    buildToolsVersion '30.0.3'
    

构建时,Unity 将下载 Build-Tools 版本 30.0.3,并使用该版本在保留所选 targetSdkVersion 的同时构建您的项目。

创建自定义 Gradle build

对于使用较低版本构建的 Unity 版本 2019.42020.12020.2,您需要将自定义 Gradle build 设置为 Gradle 版本 6.1.1 或更高版本。您还需要安装 Android Gradle 插件 4.0.1 或更高版本

以 SDK 31 为目标平台的应用需要 Gradle 版本 6.1.1 或更高版本

  1. 转到 Preferences > External Tools > Android > Gradle,然后将自定义 Gradle build 设置为 Gradle 6.1.1 或更高版本。如需下载,请参阅 Gradle 构建工具
  2. 对生成的两个文件应用以下更改:

    • Assets/Plugins/Android/mainTemplate.gradle
    • Assets/Plugins/Android/launcherTemplate.gradle
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        // Must be Android Gradle Plugin 4.0.1 or later. For a list of
        // compatible Gradle versions refer to:
        // https://developer.android.com/studio/releases/gradle-plugin
        classpath 'com.android.tools.build:gradle:4.0.1'
    }
}

allprojects {
   repositories {
      google()
      jcenter()
      flatDir {
        dirs 'libs'
      }
   }
}

对以 Android 12 为目标平台的应用应用更改

如果您的应用以 Android 12 为目标平台,您必须明确声明 android:exported 属性。如需了解 Android 12 中的所有变更,请参阅 Android 12 中的行为变更

  1. Project Settings > Player > Android > Publishing Settings > Build 中,选择 Custom Main Manifest

  2. 将以下更改应用于 Assets/Plugins/Android/AndroidManifest.xml

    1. 移除文件顶部的以下注释(如有):

      <!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
      
    2. android:exported 属性添加到 <activity> 标记中:

       <application>
           <activity android:name="com.unity3d.player.UnityPlayerActivity"
                     android:theme="@style/UnityThemeSelector"
                     android:exported="true">
               <intent-filter>
                   <action android:name="android.intent.action.MAIN" />
                   <category android:name="android.intent.category.LAUNCHER" />
               </intent-filter>
               <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
           </activity>
       </application>