Quando crei un progetto Android che ha come target Android 12 (livello SDK 31), potresti riscontrare il seguente errore:
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
Questo problema è causato da un'incompatibilità tra la versione 31.0.0 di Android Build Tools e il sistema di compilazione di Unity. A partire dalla versione 31.0.0 di Android Build Tools, DX è stato rimosso a favore di D8, causando un malfunzionamento nelle build di Unity per Android.
Questo errore può essere attivato nei seguenti scenari:
- Eseguire l'upgrade ad AR Foundation 1.26 di ARCore Extensions for Unity
- Scegli come target il livello SDK Android 31 in qualsiasi progetto Unity, indipendentemente dalla versione di ARCore Extensions,
- Targeting del livello 30 dell'SDK Android in qualsiasi progetto Unity se è installata la versione 31.0.0 di Build Tools, indipendentemente dalla versione di ARCore Extensions.
Soluzione alternativa
Stiamo collaborando con Unity per risolvere questa incompatibilità. Nel frattempo, segui le istruzioni per creare un progetto che abbia come target Android 12:
In Project Settings > Player > Android > Publishing Settings > Build, seleziona entrambe le opzioni:
- Custom Main Gradle Template,
- Custom Launcher Gradle Template.
Applica le seguenti modifiche a entrambi i file generati:
Assets/Plugins/Android/mainTemplate.gradle
Assets/Plugins/Android/launcherTemplate.gradle
Se presente, rimuovi il seguente commento all'inizio del file:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
Poi modifica
compileSdkVersion
ebuildToolsVersion
come segue:buildToolsVersion '30.0.3'
Durante la compilazione, Unity scaricherà la versione 30.0.3 di Build-Tools e la utilizzerà per compilare il progetto mantenendo targetSdkVersion
selezionato.
Creare build Gradle personalizzate
Nelle versioni Unity 2019.4, 2020.1 e 2020.2, create con versioni precedenti, dovrai impostare una compilazione Gradle personalizzata su Gradle 6.1.1 o versioni successive. Inoltre, è necessario Android Gradle Plugin 4.0.1 o versioni successive.
Le app che hanno come target l'SDK 31 richiedono Gradle versione 6.1.1 o successive.
- Vai a Preferences > External Tools > Android > Gradle e imposta la compilazione Gradle personalizzata su Gradle 6.1.1 o versioni successive. Per i download, consulta lo strumento di compilazione Gradle.
Applica le seguenti modifiche a entrambi i file generati:
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'
}
}
}
Applicare le modifiche per le app che hanno come target Android 12
Se la tua app ha come target Android 12, devi dichiarare esplicitamente l'attributo android:exported
. Per tutte le modifiche in Android 12, consulta Modifiche al comportamento in Android 12.
In Project Settings > Player > Android > Publishing Settings > Build, seleziona Custom Main Manifest.
Applica le seguenti modifiche a
Assets/Plugins/Android/AndroidManifest.xml
:Se presente, rimuovi il seguente commento all'inizio del file:
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
Aggiungi l'attributo
android:exported
al tag<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>