When building an Android project that targets Android 12 (SDK level 31), you may encounter the following error:
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
This is caused by an incompatibility between Android Build Tools version 31.0.0 and the Unity build system. As of Android Build Tools version 31.0.0, DX has been removed in favor of D8, leading to breakage in Unity builds for Android.
This error may be triggered in the following scenarios:
- Upgrading to ARCore Extensions for Unity's AR Foundation version 1.26,
- Targeting Android SDK level 31 in any Unity project, regardless of ARCore Extensions version,
- Targeting Android SDK level 30 in any Unity project while Build Tools version 31.0.0 is installed, regardless of ARCore Extensions version.
Workaround
We are working with Unity to resolve this incompatibility. In the meantime, follow instructions to build a project that targets Android 12:
In Project Settings > Player > Android > Publishing Settings > Build, select both:
- Custom Main Gradle Template,
- Custom Launcher Gradle Template.
Apply the following changes to both generated files:
Assets/Plugins/Android/mainTemplate.gradle
Assets/Plugins/Android/launcherTemplate.gradle
If present, remove the following comment at the top of the file:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
Then modify
compileSdkVersion
andbuildToolsVersion
as follows:buildToolsVersion '30.0.3'
When building, Unity will download Build-Tools version 30.0.3 and use it to build your project while maintaining the selected targetSdkVersion
.
Create custom Gradle builds
On Unity versions 2019.4, 2020.1, and 2020.2, which are built with older versions, you will need to set a custom Gradle build to Gradle version 6.1.1 or later. You will also need Android Gradle Plugin 4.0.1 or later.
Apps targeting SDK 31 require Gradle Version 6.1.1 or later.
- Go to Preferences > External Tools > Android > Gradle, and set the custom Gradle build to Gradle 6.1.1 or later. See Gradle build tool for downloads.
Apply the following changes to both generated files:
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'
}
}
}
Apply changes for apps targeting Android 12
If your app targets Android 12, then you must explicitly declare the android:exported
attribute. For all changes in Android 12, see Behavior changes in Android 12.
In Project Settings > Player > Android > Publishing Settings > Build, select Custom Main Manifest.
Apply the following changes to
Assets/Plugins/Android/AndroidManifest.xml
:If present, remove the following comment at the top of the file:
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
Add the
android:exported
attribute to the<activity>
tag:<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>