Podczas kompilowania projektu na Androida kierowanego na Androida 12 (poziom SDK 31) możesz napotkać ten błąd:
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
Jest to spowodowane niezgodnością między narzędziami Android Build Tools w wersji 31.0.0 a systemem kompilacji Unity. W wersji 31.0.0 pakietu Android Build Tools DX został usunięty na rzecz D8, co spowodowało problemy z kompilacją Unity na Androida.
Ten błąd może wystąpić w takich sytuacjach:
- Uaktualniam do ARCore Extensions na potrzeby Unity AR Foundation w wersji 1.26,
- kierowanie na Androida na poziomie pakietu SDK 31 w dowolnym projekcie Unity, niezależnie od wersji rozszerzeń ARCore;
- Kierowanie na pakiet Android SDK na poziomie 30 w dowolnym projekcie Unity z zainstalowaną wersją narzędzi Build Tools w wersji 31.0.0, niezależnie od wersji ARCore Extensions.
Obejście
Współpracujemy z firmą Unity nad rozwiązaniem tego problemu. W tym czasie postępuj zgodnie z instrukcjami, aby utworzyć projekt kierowany na Androida 12:
W sekcji Project Settings > Player > Android > Publishing Settings > Build wybierz obie opcje:
- Custom Main Gradle Template,
- Custom Launcher Gradle Template.
Wprowadź te zmiany w obu wygenerowanych plikach:
Assets/Plugins/Android/mainTemplate.gradle
Assets/Plugins/Android/launcherTemplate.gradle
Usuń z góry pliku ten komentarz, jeśli się tam znajduje:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
Następnie zmień wartości
compileSdkVersion
ibuildToolsVersion
w ten sposób:buildToolsVersion '30.0.3'
Podczas kompilacji Unity pobierze narzędzia kompilacyjne w wersji 30.0.3 i użyje ich do skompilowania projektu, zachowując wybrane targetSdkVersion
.
Tworzenie niestandardowych kompilacji Gradle
W przypadku Unity w wersjach 2019.4, 2020.1 i 2020.2, które zostały utworzone ze starszymi wersjami, musisz ustawić niestandardową kompilację Gradle na wersję 6.1.1 lub nowszą. Potrzebujesz też wtyczki Androida do obsługi Gradle w wersji 4.0.1 lub nowszej.
Aplikacje kierowane na pakiet SDK 31 wymagają Gradle w wersji 6.1.1 lub nowszej.
- Otwórz Preferences > External Tools > Android > Gradle i ustaw niestandardową kompilację Gradle na Gradle 6.1.1 lub nowszą. Zapoznaj się z informacjami na temat narzędzia do kompilacji Gradle, które możesz pobrać.
Wprowadź te zmiany w obu wygenerowanych plikach:
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'
}
}
}
Zastosuj zmiany w aplikacjach kierowanych na Androida 12
Jeśli Twoja aplikacja jest kierowana na Androida 12, musisz wyraźnie zadeklarować atrybut android:exported
. Wszystkie zmiany w Androidzie 12 znajdziesz w artykule Zmiany w zachowaniu w Androidzie 12.
W aplikacji Project Settings > Player > Android > Publishing Settings > Build wybierz Custom Main Manifest.
Zastosuj do zbioru danych
Assets/Plugins/Android/AndroidManifest.xml
te zmiany:Usuń z góry pliku ten komentarz, jeśli się tam znajduje:
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
Dodaj atrybut
android:exported
do tagu<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>