使用 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 出现故障。

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

  • 升级到适用于 Unity 的 AR Foundation 版本 1.26 的 ARCore Extensions
  • 在任何 Unity 项目中以 Android SDK 级别 31 为目标,无论 ARCore 扩展版本是什么,
  • 在任何 Unity 项目中以 Android SDK 级别 30 为目标平台,同时安装 Build Tools 版本 31.0.0(无论 ARCore Extensions 版本如何)。

临时解决方法

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

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

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

    显示“Publishing Settings”和“Build”窗格的屏幕截图,其中两个 Gradle 模板选项都处于选中状态

  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>