El número de referencias de métodos en un archivo .dex no puede exceder 64k API 17

154

Estoy creando una aplicación con la Biblioteca SugarORM, pero cuando intento compilar el proyecto para API 17 (no verifiqué otras) muestra un error de compilación.

    Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console

Pero cuando construyo este proyecto para Android v5.0 o superior, funciona bien. Si elimino la dependencia de SugarORM Gradle, funciona bien para ambos dispositivos v4.2.2 y v5.0.

Sandeep Singh Rana
fuente
intente usar proguard este enlace android-arsenal.com/details/1/337 especifica el uso de SugarORM con proguard
Shaan_B
19
Acabo de recibir esto después de actualizar a la API 23. Es simplemente imposible ser productivo con Android. Cada SDK rompe cosas. Cada actualización de AS rompe cosas. Mensajes de error inutilizables. AS roto. Basura, basura, basura.
RunLoop
1
@RunLoop no pierdas la esperanza ... Descubrí que Android es la mejor plataforma jamás desarrollada ... Moch Flexible y potente ... Como te ensuciarás las manos en la codificación ... Estará bien .... Cada mensaje de error es útil. Pero necesito entender los mensajes
Sandeep Singh Rana
2
@Balaj Khan One or more of the answers is exemplary and worthy of an additional bounty.Just to the point and accurate answer., sugiero la respuesta superior (y aceptada).
Jon Goodwin

Respuestas:

331

Tienes demasiados métodos. Solo puede haber 65536 métodos para dex .

Como se sugiere, puede utilizar el soporte multidex .

Simplemente agregue estas líneas en module/build.gradle:

android {

    defaultConfig {
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'  //with support libraries
  //implementation 'androidx.multidex:multidex:2.0.1'  //with androidx libraries
}

También en su Manifestagregar la MultiDexApplicationclase de la biblioteca de soporte multidex al elemento de aplicación

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.multidex.myapplication">
        <application
            ...
            android:name="android.support.multidex.MultiDexApplication">

            <!-- If you are using androidx use android:name="androidx.multidex.MultiDexApplication" -->

            <!--If you are using your own custom Application class then extend -->
            <!--MultiDexApplication and change above line as-->
            <!--android:name=".YourCustomApplicationClass"> -->

            ...
        </application>
    </manifest>

Si está utilizando su propia Applicationclase, cambie la clase principal de Applicationa MultiDexApplication.
Si no puede hacerlo, en su clase de Aplicación anule el attachBaseContextmétodo con:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    MultiDex.install(this);
}

Otra solución es tratar de eliminar el código no utilizado con ProGuard : configure los ajustes de ProGuard para que su aplicación ejecute ProGuard y asegúrese de tener habilitada la reducción para las versiones de lanzamiento.

Gabriele Mariotti
fuente
1
@Override protegido void attachBaseContext (Context newBase) {super.attachBaseContext (newBase); MultiDex.install (esto); } también anular
Sandeep Singh Rana
1
Al hacer clic en MultiDexApplication, veo que el archivo .class descompilado ya realiza exactamente la anulación attachBaseContext () que usted describe. Por lo que no será necesario anular de nuevo supongo ..
Mete
44
¿Qué pasa si no tengo muchos métodos? No tengo tantos métodos en mi aplicación. Creo que ni siquiera alcanza eso.
Neon Warge
66
Solo hice estas dos partes: "multiDexEnabled true" y compilé 'com.android.support:multidex:1.0.0', en mi archivo build.grandle. No tuve que cambiar nada en mi archivo de manifiesto ni hacer las otras cosas que mencionó sobre anular attachBaseContext, etc. ¡Pero su solución me solucionó el problema! Gracias.
Jaime Montoya
2
@NeonWarge Probablemente debido a tus dependencias. Tal vez, ¿ha incluido todos los servicios de Google Play? Marque esta respuesta para detalles
MR5
131

En android / app / build.gradle

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

Ponga esto dentro de su configuración predeterminada:

multiDexEnabled true 

esto funciona para mi

Dharmendra Mishra
fuente
3
Esto es solo para Lollipop o superior, ¿no?
Vic Torious
1
Hace que la compilación sea exitosa, pero la aplicación se bloquea después del lanzamiento.
Vasanth
18

Recibí este mensaje de error porque mientras codificaba la versión de compilación de actualización automática de mi proyecto en mi build.gradlearchivo:

android {
    ...
    buildToolsVersion "23.0.2"
    ...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0' }

Resuélvelo corrigiendo la versión:

android {
        ...
        buildToolsVersion "23.0.2"
        ...
    }

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}
Quan Nguyen
fuente
2
Estoy creando una aplicación simple, que funcionó bien hasta que intenté seguir el tutorial de Google Map Objects. De repente no pude compilar más. Esta solución me lo ha solucionado. ¿Cómo diablos lo resolviste?
maccaroo
44
Este método funcionó afortunadamente porque las nuevas bibliotecas de compilación tienen demasiados métodos (más de 65536) y las bibliotecas antiguas no. Por lo tanto, es solo una solución rápida, tarde o temprano debe solucionarlo agregando soporte multidex como la respuesta aceptada.
Quan Nguyen
15

Esto es lo que funcionó para mí:

Esto sucede porque hay demasiados métodos no utilizados. La mayoría de estos métodos provienen de bibliotecas incluidas en su build.gradle

Use recursos de reducción y reducción para arreglar esto con gradle y limpiar su código al mismo tiempo.

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources true
        }
    }
Thunderstick
fuente
12

Cambiar el nivel de aplicación build.gradle:

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

Funcionó para mí.

shivanand naduvin
fuente
Sí, es un problema antiguo, pero para las últimas versiones de API solo necesitamos la multiDexEnabledopción, sin dependencias ni cambios en el archivo de manifiesto
Hpsaturn
11

Este error también puede ocurrir cuando carga todas las API de servicios de Google Play cuando solo usa algunas.

Según lo declarado por google: "En las versiones de los servicios de Google Play anteriores a la 6.5, tenía que compilar todo el paquete de API en su aplicación. En algunos casos, hacerlo dificultaba mantener la cantidad de métodos en su aplicación (incluyendo API de marco, métodos de biblioteca y su propio código) por debajo del límite de 65,536.

A partir de la versión 6.5, puedes compilar selectivamente las API del servicio Google Play en tu aplicación ".

Por ejemplo, cuando su aplicación necesita play-services-maps, play-services-location. Debe agregar solo las dos apis en su archivo build.gradle en el nivel de la aplicación como se muestra a continuación:

compile 'com.google.android.gms:play-services-maps:10.2.1'
compile 'com.google.android.gms:play-services-location:10.2.1'

En vez de:

compile 'com.google.android.gms:play-services:10.2.1'

Para obtener una documentación completa y una lista de las API de servicios de Google Play, haga clic aquí

James Kuta Simiyu
fuente
9

Cuando las referencias de su aplicación superan los 65.536 métodos, encuentra un error de compilación que indica que su aplicación ha alcanzado el límite de la arquitectura de compilación de Android

Soporte Multidex anterior a Android 5.0

Las versiones de la plataforma anteriores a Android 5.0 (API nivel 21) utilizan el tiempo de ejecución Dalvik para ejecutar el código de la aplicación. De forma predeterminada, Dalvik limita las aplicaciones a un único archivo de código de bytes classes.dex por APK. Para evitar esta limitación, puede agregar la biblioteca de soporte multidex a su proyecto:

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

Soporte Multidex para Android 5.0 y superior

Android 5.0 (API nivel 21) y superior utiliza un tiempo de ejecución llamado ART que admite de forma nativa la carga de múltiples archivos DEX desde archivos APK. Por lo tanto, si su minSdkVersion es 21 o superior, no necesita la biblioteca de soporte multidex .

Evita el límite de 64K

  • Elimine el código no utilizado con ProGuard: habilite la reducción del código

Configurar multidex en la aplicación para

Si su minSdkVersion está configurado en 21 o superior, todo lo que necesita hacer es configurar multiDexEnabled en verdadero en su archivo build.gradle de nivel de módulo

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

si su minSdkVersion está configurada en 20 o menos, entonces debe usar la biblioteca de soporte multidex

android {
defaultConfig {
    ...
    minSdkVersion 15 
    targetSdkVersion 28
    multiDexEnabled true
   }
   ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.3'
}

Anule la clase Aplicación, cámbiela para extender MultiDexApplication (si es posible) de la siguiente manera:

public class MyApplication extends MultiDexApplication { ... }

agregar al archivo de manifiesto

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="MyApplication" >
        ...
    </application>
</manifest>
Basi
fuente
8

He estado enfrentando el mismo problema y para el soporte multidex, debe tener en cuenta la minSdkVersion de su aplicación. Si está utilizando minSdkVersion 21 o superior, simplemente escriba multiDexEnabled true de esta manera

defaultConfig {
    applicationId *******************
    minSdkVersion 21
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

Funciona para mí y si está usando minSdkVersion por debajo de 21 (debajo de lolipop ), entonces tiene que hacer dos cosas más simples

1. Primero agregue esta dependencia

compile 'com.android.support:multidex:1.0.1'

en su build.gradle.

2. Último y segundo, agregue uno en la siguiente línea a su aplicación en manifiesto

android: name = "android.support.multidex.MultiDexApplication"

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:name="android.support.multidex.MultiDexApplication"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Bingo, entonces también funcionará en la versión inferior .. :) Happy coding

Sudhansu
fuente
1

Solo un comentario lateral, antes de agregar soporte para multidex, asegúrese de no agregar dependencias innecesarias.

Por ejemplo, en la guía oficial de análisis de Facebook

Indican claramente que debe agregar la siguiente dependencia:

implementation 'com.facebook.android:facebook-android-sdk:[4,5)'

que en realidad es todo el FacebookSDK, por lo que si necesita, por ejemplo, solo Analytics, debe reemplazarlo por:

implementation 'com.facebook.android:facebook-core:5.+'

Opciones de SDK parcial de Facebook

Gal rom
fuente
Totalmente de acuerdo. En mi caso, por ejemplo, solo necesitaba el botón "iniciar sesión con Facebook" y estaba usando todo el SDK de Facebook. He sustituido con facebook-corey facebook-login, y el error se ha ido.
cleybertandre
0

Para mí, la actualización de Gradle funciona. Busque actualizaciones en el sitio web de Android y luego agréguelas a su build.gradle (Proyecto) de esta manera

 dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-alpha4'   
          ....
    }

luego sincronice el proyecto con el archivo gradle y, a veces, podría suceder debido a java.exe (en mi caso) simplemente fuerce kill java.exe desde el administrador de tareas en Windows y luego vuelva a ejecutar el programa

androidXP
fuente
0

También puedes probar esto:

android{
    .
    .
    // to avoid DexIndexOverflowException
    dexOptions {
       jumboMode true
    }
}

Espero que ayude a alguien. Gracias

Lazycoder_007
fuente
0

** **

Para desarrolladores de juegos de Unity

** **

Si alguien viene aquí porque este error apareció en su proyecto de Unity, vaya a Archivo-> Configuración de compilación -> Configuración del reproductor -> Reproductor. vaya a Configuración de publicación y en la pestaña Generar, active "Plantilla de gradle de iniciador personalizado". se mostrará una ruta debajo de ese texto. ve a la ruta y agrega multiDexEnabled true así:

defaultConfig {
    minSdkVersion **MINSDKVERSION**
    targetSdkVersion **TARGETSDKVERSION**
    applicationId '**APPLICATIONID**'
    ndk {
        abiFilters **ABIFILTERS**
    }
    versionCode **VERSIONCODE**
    versionName '**VERSIONNAME**'
    multiDexEnabled true
}
Tal vez señor
fuente
-1

puedes habilitar "Instant Run" en Android Studio para obtener soporte multidex.

Quang Vĩnh Hà
fuente
-2

Haz esto, funciona:

defaultConfig {
    applicationId "com.example.maps"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}
tejasri
fuente
2
Por favor explique su respuesta. Las respuestas de solo código se desaconsejan en SO. Gracias.
Gennadii Saprykin