При создании проекта 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:
В Project Settings > Player > Android > Publishing Settings > Build выберите оба варианта:
- Custom Main Gradle Template ,
- Custom Launcher Gradle Template .
Примените следующие изменения к обоим сгенерированным файлам:
-
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 или более поздней версии .
- Перейдите в Preferences > External Tools > Android > Gradle и установите для пользовательской сборки Gradle значение Gradle 6.1.1 или новее . См. раздел «Инструмент сборки Gradle» для загрузки.
Примените следующие изменения к обоим сгенерированным файлам:
-
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» .
В Project Settings > Player > Android > Publishing Settings > Build выберите Custom Main Manifest .
Примените следующие изменения к
Assets/Plugins/Android/AndroidManifest.xml
:Если он присутствует, удалите следующий комментарий вверху файла:
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
Добавьте атрибут
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>