El recuento del método de unidad excede el límite de 64K


20

Acabo de recibir un problema relacionado con un método de 64k en Unity, por eso no puedo construir mi proyecto. Muestra que la limitación del método excede el límite del recuento de métodos de 64k. Entonces, ¿alguien puede ayudarme a resolver este problema?

Respuestas:


22

Esta respuesta se basa en gran medida en la documentación oficial de Android (las partes citadas, específicamente).


Cómo configurar el Soporte Multidex para Unity Project

¿Qué es Multidex?

Los archivos de la aplicación de Android (APK) contienen archivos ejecutables de bytecode en forma de archivos Dalvik Executable (DEX), que contienen el código compilado utilizado para ejecutar su aplicación. La especificación ejecutable Dalvik limita el número total de métodos a los que se puede hacer referencia dentro de un solo archivo DEX a 65.536, incluidos los métodos de marco de Android, los métodos de biblioteca y los métodos en su propio código. Superar este límite requiere que configure el proceso de compilación de su aplicación para generar más de un archivo DEX, conocido como una configuración multi-dex.

Cuando usamos Multidex:

Cuando superamos el número total de métodos a los que se puede hacer referencia dentro de un solo archivo DEX a 65.536, incluidos los métodos de marco de Android, los métodos de biblioteca y los métodos en su propio código.

Evita el límite de 64K

Antes de configurar su aplicación para permitir el uso de 64K o más referencias de métodos, debe tomar medidas para reducir el número total de referencias llamadas por su código de aplicación, incluidos los métodos definidos por su código de aplicación o las bibliotecas incluidas. Las siguientes estrategias pueden ayudarlo a evitar alcanzar el límite de referencia DEX:

Revise las dependencias directas y transitivas de su aplicación : asegúrese de que cualquier dependencia de biblioteca grande que incluya en su aplicación se use de manera que supere la cantidad de código que se agrega a la aplicación. Un antipatrón común es incluir una biblioteca muy grande porque algunos métodos de utilidad fueron útiles. Reducir las dependencias del código de su aplicación a menudo puede ayudarlo a evitar el límite de referencia DEX.

Elimine el código no utilizado con ProGuard : habilite la reducción del código para ejecutar ProGuard para sus versiones de lanzamiento. La habilitación de la reducción asegura que no envíe código no utilizado con sus APK.

Además de estos consejos oficiales, al crear su proyecto de Unity, seguir estos pasos lo ayudará aún más:

  1. Cree un proyecto de Android desde su editor de Unity. Setp 1

  2. Importa tu proyecto de Android en Android Studio. Paso 2

  3. La configuración de su proyecto de aplicación para usar una configuración de múltiples dex requiere que realice la siguiente modificación.

    Si su minSdkVersion se establece en 21 o superior, todo lo que necesita hacer es configurar multiDexEnableda trueen su archivo build.gradle de nivel de módulo, como se muestra aquí:

    android {
    defaultConfig {
            ...
            minSdkVersion 21 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }

    Sin embargo, si minSdkVersionestá configurado en 20 o menos, entonces debe usar la biblioteca de soporte multidex de la siguiente manera:

    3.1. Modifique el archivo build.gradle a nivel de módulo para habilitar multidex y agregue la biblioteca multidex como una dependencia, como se muestra aquí:

    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }

    3.2. Según si anula la clase de aplicación, realice una de las siguientes acciones:

    • Si no anula la Applicationclase, edite su archivo de manifiesto para establecerlo android:nameen la <application>etiqueta de la siguiente manera:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application
                android:name="android.support.multidex.MultiDexApplication" >
            ...
        </application>
    </manifest>
    • Si anula la Applicationclase, cámbiela para extender MultiDexApplication (si es posible) de la siguiente manera:
    public class MyApplication extends MultiDexApplication { ... }
    • O si anula la clase de aplicación pero no es posible cambiar la clase base, puede anular el método attachBaseContext () y llamar a MultiDex.install (this) para habilitar multidex:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
  4. Verifique el error del manifiesto de otros complementos y limpie el proyecto. Y sysc nuevamente.

  5. Si hay algún problema de dependencia en su proyecto, ejecute este comando en la Terminal de Android

    % Gradle clean App."App name"
  6. Copie estas dependencias en su Application Gradle, en dependencias:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
  7. Agregue signConfig en sus proyectos principales Gradle.

    Paso 8

    O configure el modo de firma en modo de depuración manualmente, vaya a Archivo -> Estructura del proyecto -> En Módulos Haga clic en su proyecto y en Tipos de compilación seleccione Depurar -> elija Configuración de firma-> depuración

    ingrese la descripción de la imagen aquí

  8. Ahora sincronice su Gradle y cree el proyecto.


1
¿Qué tan grande es su proyecto que llevó a este error?
Evorlor

1
En realidad, estoy usando la mediación de Google AdMob, por lo que se usa para agregar 6-7 SDK de anuncios, por lo que mi recuento final del método de proyectos fue de aproximadamente 76k.
Rakesh

0

Te recomendaría pasar por este enlace que te ayudará a crear juegos habilitados para multidex directamente a través de la unidad.

https://medium.com/@abhpatidar/solving-unity-dex-issue-538e134c8809

Nota: Esto solo habilitará multidex en la unidad misma (y debería solucionar los problemas de multidex). No solucionará los problemas relacionados con gradle.


3
Actualmente, esta es una respuesta de solo enlace: aunque el enlace responde a la pregunta, la respuesta no. Es posible que desee incluir el núcleo del contenido vinculado aquí (el enlace per se no es malo, solo tiene el enlace que es malo).
Vaillancourt

Estoy de acuerdo contigo, pero los pasos escritos son demasiados. Es por eso que tuve que crear un artículo y compartir el enlace. Preferiría esa manera para tener solo una fuente de verdad en lugar de crear múltiples.
Abhishek Patidar

En comprender, pero no es así como funcionan los sitios de Stack Exchange: las respuestas de solo enlace se eliminan.¤ Si lo desea, puedo convertir esta respuesta en un comentario de la pregunta: mantendrá su referencia visible para los futuros usuarios, y ganamos No tengo un enlace solo respuesta. (¤El problema principal con las respuestas de solo enlace es que si desactiva su sitio (o su ISP se declara en quiebra con todos sus datos), esta respuesta no tendrá ningún valor; es por eso que la respuesta debería responder a la pregunta.)
Vaillancourt

Tener sentido. Convertiré mi respuesta a instrucciones completas.
Abhishek Patidar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.