Cómo compilar para Android 12 con Unity

Cuando compiles un proyecto de Android que se oriente a Android 12 (nivel de SDK 31), es posible que encuentres el siguiente 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

Esto se debe a una incompatibilidad entre la versión 31.0.0 de las herramientas de compilación de Android y el sistema de compilación de Unity. A partir de la versión 31.0.0 de las herramientas de compilación de Android, se quitó DX en favor de D8, lo que genera fallas en las compilaciones de Unity para Android.

Este error puede activarse en las siguientes situaciones:

  • Actualización a la versión 1.26 de AR Foundation de ARCore Extensions for Unity
  • Segmentación para el nivel 31 del SDK de Android en cualquier proyecto de Unity, independientemente de la versión de Extensiones de ARCore
  • Segmentación para el nivel 30 del SDK de Android en cualquier proyecto de Unity mientras se instala la versión 31.0.0 de Build Tools, independientemente de la versión de ARCore Extensions

Solución alternativa

Estamos trabajando con Unity para resolver esta incompatibilidad. Mientras tanto, sigue las instrucciones para compilar un proyecto orientado a Android 12:

  1. En Project Settings > Player > Android > Publishing Settings > Build, selecciona ambas opciones:

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

    Captura de pantalla que muestra la configuración de publicación, el panel de compilación con ambas opciones de plantilla de Gradle seleccionadas

  2. Aplica los siguientes cambios a ambos archivos generados:

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

    Si está presente, quita el siguiente comentario en la parte superior del archivo:

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

    Luego, modifica compileSdkVersion y buildToolsVersion de la siguiente manera:

    buildToolsVersion '30.0.3'
    

Durante la compilación, Unity descargará la versión 30.0.3 de las herramientas de compilación y la usará para compilar tu proyecto sin modificar el targetSdkVersion seleccionado.

Crea compilaciones personalizadas de Gradle

En las versiones de Unity 2019.4, 2020.1 y 2020.2, que se compilan con versiones anteriores, deberás configurar una compilación de Gradle personalizada en la versión 6.1.1 de Gradle o una posterior. También necesitarás el complemento de Android para Gradle 4.0.1 o una versión posterior.

Las apps que se orientan al SDK 31 requieren Gradle versión 6.1.1 o posterior.

  1. Ve a Preferences > External Tools > Android > Gradle y configura la compilación de Gradle personalizada como Gradle 6.1.1 o una versión posterior. Consulta Herramienta de compilación de Gradle para ver las descargas.
  2. Aplica los siguientes cambios a ambos archivos generados:

    • 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'
      }
   }
}

Aplica cambios para apps orientadas a Android 12

Si tu app está orientada a Android 12, debes declarar explícitamente el atributo android:exported. Para conocer todos los cambios en Android 12, consulta Cambios de comportamiento en Android 12.

  1. En Project Settings > Player > Android > Publishing Settings > Build, selecciona Custom Main Manifest.

  2. Aplica los siguientes cambios a Assets/Plugins/Android/AndroidManifest.xml:

    1. Si está presente, quita el siguiente comentario en la parte superior del archivo:

      <!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
      
    2. Agrega el atributo android:exported a la etiqueta <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>