Сборка для Android 12 с Unity

При создании проекта Android, ориентированного на Android 12 (уровень SDK 31), вы можете столкнуться со следующей ошибкой:

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 , что привело к сбоям в сборках Unity для Android.

Эта ошибка может возникнуть в следующих случаях:

  • Обновление до ARCore Extensions для Unity AR Foundation версии 1.26,
  • Ориентация на Android SDK уровня 31 в любом проекте Unity, независимо от версии ARCore Extensions.
  • Ориентация на Android SDK уровня 30 в любом проекте Unity, если установлены инструменты сборки версии 31.0.0, независимо от версии расширений ARCore.

Обходной путь

Мы работаем с Unity над устранением этой несовместимости. А пока следуйте инструкциям по созданию проекта, ориентированного на Android 12:

  1. В Project Settings > Player > Android > Publishing Settings > Build выберите оба варианта:

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

    Снимок экрана, показывающий настройки публикации, панель «Сборка» с выбранными обоими параметрами шаблона Gradle.

  2. Примените следующие изменения к обоим сгенерированным файлам:

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

    Если имеется, удалите следующий комментарий в верхней части файла:

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

    Затем измените compileSdkVersion и buildToolsVersion следующим образом:

    buildToolsVersion '30.0.3'
    

При сборке Unity загрузит Build-Tools версии 30.0.3 и будет использовать ее для сборки вашего проекта, сохраняя выбранную targetSdkVersion .

Создание пользовательских сборок Gradle

В версиях Unity 2019.4 , 2020.1 и 2020.2 , которые созданы на основе более старых версий, вам потребуется установить пользовательскую сборку Gradle на версию Gradle 6.1.1 или более позднюю . Вам также понадобится плагин Android Gradle 4.0.1 или более поздней версии .

Для приложений, ориентированных на SDK 31, требуется Gradle версии 6.1.1 или более поздней версии .

  1. Перейдите в Preferences > External Tools > Android > Gradle и установите для пользовательской сборки Gradle значение 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>