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
Ciò è causato da un'incompatibilità tra Android Build Tools versione 31.0.0 e il sistema di build Unity. A partire dalla versione 31.0.0 di Android Build Tools, DX è stato rimosso a favore di D8 e questo comporta la rottura delle build di Unity per Android.
Questo errore può verificarsi nei seguenti scenari:
- Upgrade alle estensioni ARCore per AR Foundation di Unity versione 1.26
- Targeting del livello 31 dell'SDK Android in qualsiasi progetto Unity, indipendentemente dalla versione di ARCore Extensions.
- Targeting del livello 30 dell'SDK Android in qualsiasi progetto Unity mentre è 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 entrambi:
- 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 dalla parte superiore del file:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
Quindi modifica
compileSdkVersion
ebuildToolsVersion
come segue:buildToolsVersion '30.0.3'
Durante la creazione, Unity scaricherà la versione 30.0.3 di Build-Tools e la utilizzerà per creare il tuo progetto mantenendo l'elemento targetSdkVersion
selezionato.
Crea build Gradle personalizzate
Nelle versioni di Unity 2019.4, 2020.1 e 2020.2, create con versioni precedenti, dovrai impostare una build Gradle personalizzata su Gradle versione 6.1.1 o successive. Avrai anche bisogno del plug-in Android per Gradle 4.0.1 o versioni successive.
Le app che hanno come target l'SDK 31 richiedono Gradle 6.1.1 o versioni successive.
- Vai a Preferences > External Tools > Android > Gradle e imposta la build Gradle personalizzata su Gradle 6.1.1 o versioni successive. Per i download, vedi lo strumento di creazione 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 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 l'articolo Modifiche del 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 dalla parte superiore 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>