Twórz aplikacje na Androida 12 z Unity

Podczas tworzenia projektu na Androida kierowanego na Androida 12 (SDK na poziomie 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

Przyczyną jest niezgodność między narzędziami do kompilacji na Androida w wersji 31.0.0 a systemem kompilacji Unity. W narzędziach Android Build Tools w wersji 31.0.0 i wersja DX została wycofana i zastąpiona wersją D8, co doprowadziło do awarii w kompilacjach Unity na Androida.

Ten błąd może wystąpić w tych sytuacjach:

  • Aktualizacja do rozszerzeń ARCore dla Unity's AR Foundation w wersji 1.26,
  • kierowanie na Android SDK na poziomie 31 w dowolnym projekcie Unity, niezależnie od wersji rozszerzeń ARCore,
  • Kierowanie na pakiet SDK na Androida na poziomie 30 w dowolnym projekcie Unity z zainstalowanym narzędziem Build Tools w wersji 31.0.0, niezależnie od wersji rozszerzeń ARCore.

Obejście

Współpracujemy z Unity nad rozwiązaniem tego problemu. Tymczasem postępuj zgodnie z instrukcjami, aby utworzyć projekt kierowany na Androida 12:

  1. W sekcji Project Settings > Player > Android > Publishing Settings > Build wybierz:

    1. Custom Main Gradle Template,
    2. Custom Launcher Gradle Template.

    Zrzut ekranu przedstawiający panel tworzenia ustawień publikowania i okienko kompilacji z zaznaczonymi obiema opcjami szablonu Gradle

  2. Zastosuj te zmiany do obu wygenerowanych plików:

    • Assets/Plugins/Android/mainTemplate.gradle
    • Assets/Plugins/Android/launcherTemplate.gradle

    Usuń komentarz u góry pliku (jeśli go masz):

    // GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
    

    Następnie zmodyfikuj elementy compileSdkVersion i buildToolsVersion w ten sposób:

    buildToolsVersion '30.0.3'
    

Podczas kompilowania Unity pobierze Narzędzia do kompilacji w wersji 30.0.3 i użyje jej do skompilowania projektu z zachowaniem wybranego targetSdkVersion.

Tworzenie niestandardowych kompilacji Gradle

W przypadku starszych wersji Unity (2019.4, 2020.1 i 2020.2) musisz ustawić niestandardową kompilację Gradle na Gradle w wersji 6.1.1 lub nowszej. Musisz też mieć wtyczkę 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.

  1. Otwórz Preferences > External Tools > Android > Gradle i ustaw niestandardową kompilację Gradle na Gradle 6.1.1 lub nowszą. Informacje o pobieraniu znajdziesz na stronie narzędzia do kompilacji Gradle.
  2. Zastosuj te zmiany do obu wygenerowanych plików:

    • 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 aplikacja jest kierowana na Androida 12, musisz wyraźnie zadeklarować atrybut android:exported. Informacje o wszystkich zmianach w Androidzie 12 znajdziesz w sekcji Zmiany w działaniu Androida 12.

  1. W sekcji Project Settings > Player > Android > Publishing Settings > Build wybierz Custom Main Manifest.

  2. Zastosuj te zmiany do elementu Assets/Plugins/Android/AndroidManifest.xml:

    1. Usuń komentarz u góry pliku (jeśli go masz):

      <!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
      
    2. 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>