Cómo compilar para Android 12 con Unity

Cuando compiles un proyecto de Android orientado 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 provocó fallas en las compilaciones de Unity para Android.

Este error puede activarse en las siguientes situaciones:

  • Actualización a Extensiones de ARCore para AR Foundation de Unity versión 1.26,
  • Se orienta al nivel 31 del SDK de Android en cualquier proyecto de Unity, independientemente de la versión de las extensiones de ARCore.
  • El SDK de Android se orienta al nivel 30 en cualquier proyecto de Unity mientras se instala la versión 31.0.0 de las herramientas de compilación, independientemente de la versión de las extensiones de ARCore.

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 estas dos opciones:

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

    Captura de pantalla que muestra el panel Publishing Settings, Build con ambas opciones de plantilla de Gradle seleccionadas

  2. Aplica los siguientes cambios a los dos archivos generados:

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

    Si aparece, quita el siguiente comentario de 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'
    

Cuando compiles, Unity descargará la versión 30.0.3 de las herramientas de compilación y la usará para compilar tu proyecto mientras mantienes el targetSdkVersion seleccionado.

Cómo crear compilaciones de Gradle personalizadas

En las versiones 2019.4, 2020.1 y 2020.2 de Unity, que se compilan con versiones anteriores, deberás configurar una compilación de Gradle personalizada según 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 orientadas al SDK 31 requieren la versión 6.1.1 de Gradle o una posterior.

  1. Ve a Preferences > External Tools > Android > Gradle y configura la compilación personalizada de Gradle como Gradle 6.1.1 o una versión posterior. Consulta la herramienta de compilación de Gradle para conocer las descargas.
  2. Aplica los siguientes cambios a los dos 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 las apps orientadas a Android 12

Si tu app está orientada a Android 12, debes declarar explícitamente el atributo android:exported. Para ver 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 aparece, quita el siguiente comentario de 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>