Error: no se pueden ajustar las clases solicitadas en un único archivo dex. Intente proporcionar una lista main-dex. # métodos: 72477> 65536

310

Quiero agregar servicios de ubicación fusionados pero me muestra algún error. Ayuadame.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.1"
    defaultConfig {
        applicationId "com.example.adil.bloodbankapplication"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:26.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.google.firebase:firebase-auth:11.8.0'
    compile 'com.google.firebase:firebase-database:11.8.0'
    compile 'com.android.support:support-v4:26.1.0'
    compile 'junit:junit:4.12'
    compile 'com.android.support:design:26.1.0'
    compile 'com.github.joielechong:countrycodepicker:2.1.5'
    compile 'com.jaredrummler:material-spinner:1.2.4'
    compile 'hanks.xyz:htextview-library:0.1.5'
    compile 'com.firebaseui:firebase-ui-database:1.2.0'
    compile 'com.google.android.gms:play-services:11.8.0'
}


apply plugin: 'com.google.gms.google-services'
Muhammad Adil Sattar
fuente

Respuestas:

386

Ninguna de las respuestas que te dieron fue exhaustiva. El problema radica en el Multidex. Debe agregar la biblioteca en la aplicación gradle:

implementation 'com.android.support:multidex:1.0.3'

Después, agregue la configuración predeterminada de la aplicación gradle:

multiDexEnabled true

Su aplicación debe ser del tipo Multidex. Debe escribirla en el manifiesto:

android:name=".MyApplication"

"MyApplication" debe ser la clase Multidex o debe extenderla.

AlexPad
fuente
55
Entonces MyApplication extends android.support.multidex.MultiDexApplication?
prohibición de geoingeniería
2
He probado esta solución, pero termino con este nuevo problema: stackoverflow.com/questions/49518115/…
ban-geoengineering
22
Aquí está la página oficial de documentación de Android que proporciona más explicaciones sobre por qué sucede esto y cómo hacer una mejor versión de lanzamiento apk: developer.android.com/studio/build/multidex
Vrakfall
2
no es un buen método para resolver el problema, es mejor eliminar el código y las bibliotecas no utilizados, refactorizar el código del proyecto
usuario25
55
no tener métodos 80000 sería una buena solución si las bibliotecas de Google no tuvieran métodos 80000 (la razón por la cual agregaron Multidex fue porque su propia biblioteca de servicios que querían que todos usaran tenía decenas de miles de métodos).
Lassi Kinnunen
195

Solucioné mi problema con la solución a continuación:

En el archivo de compilación de Gradle, agregue dependencia:

implementación 'com.android.support:multidex:1.0.3'

Y luego, en la sección "defaultConfig", agregue:

multiDexEnabled true

Bofeng
fuente
8
Trabajó para mi. Instrucciones detalladas sobre la configuración aquí: developer.android.com/studio/build/multidex#mdex-gradle
Alex Burdusel
No es necesario habilitar el soporte multidex en la mayoría de las aplicaciones. Debería considerar eliminar las bibliotecas no utilizadas, consulte mi respuesta a continuación.
MG Developer
106

modificar su aplicación o módulo build.gradle

android {
    defaultConfig {
        ...
        minSdkVersion 21 <----- *here
        targetSdkVersion 26
        multiDexEnabled true <------ *here
    }
    ...
}

De acuerdo con la documentación oficial

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 cargar múltiples archivos DEX desde archivos APK. ART realiza la precompilación en el momento de la instalación de la aplicación, que busca archivos classN.dex y los compila en un único archivo .oat para su ejecución por el dispositivo Android. Por lo tanto, si su minSdkVersion es 21 o superior, no necesita la biblioteca de soporte multidex.

Para obtener más información sobre el tiempo de ejecución de Android 5.0, lea ART y Dalvik.

https://developer.android.com/studio/build/multidex

wdanxna
fuente
59

Qué son los archivos dex: 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.

Motivo de esta excepción: la especificación DEX limita el número total de métodos a los que se puede hacer referencia dentro de un solo archivo DEX a 65.536 (límite de referencia de 64K), incluidos los métodos de marco de Android, los métodos de biblioteca y los métodos en su propio código.

Paso 01. Agregue la siguiente dependencia de la siguiente manera

Para usuarios no Androidx,

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}
defaultConfig {
    minSdkVersion 16
    targetSdkVersion 28
    multiDexEnabled true  //ADD THIS LINE
}

Para usuarios de Androidx,

dependencies {
  implementation 'androidx.multidex:multidex:2.0.1'
}
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  //ADD THIS LINE
    }

Paso 02:

Después de agregar esos proyectos de sincronización y antes de ejecutar el proyecto, asegúrese de crear un proyecto antes de la ejecución. de lo contrario, obtendrá una excepción.

gsm
fuente
53

Puedes seguir esto .

Las versiones de la plataforma anteriores a Android 5.0 (API nivel 21) usan 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'
}

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, como se muestra aquí:

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}
rize
fuente
34

cuando usas dependencias, ¡así tus métodos aumentaron! Google tiene una solución para eso. que se llama Multidex!

NOTA: asegúrese de que el SDK mínimo sea superior a 14.

en su build.gradle:

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



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

PARA USO DE AndroidX:

 def multidex_version = "2.0.1"
 implementation 'androidx.multidex:multidex:$multidex_version'

Para obtener más información, vaya al enlace original:

https://developer.android.com/studio/build/multidex

sana ebadi
fuente
Gran solución! solucionó mi problema
Vaibhav Herugu
29

Hola problema está aquí eliminarlo

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

¿por qué?

Nota: No use el objetivo combinado de servicios de juego. Trae docenas de bibliotecas, hinchando su aplicación. En su lugar, especifique solo las API de servicios de Google Play específicas que utiliza su aplicación.

Y usa lo que necesitas. https://developers.google.com/android/guides/setup

Me gusta para el servicio de localización

com.google.android.gms:play-services-location:11.8.0

Para mensajería en la nube

com.google.android.gms:play-services-gcm:11.8.0
Pankaj Kant Patel
fuente
Sí, ahora tengo un problema, mi botón de ejecución se ha deshabilitado.
Muhammad Adil Sattar
27

Si está creando DEBUG APK , simplemente agregue:

debug {
            multiDexEnabled true
        }

dentro buildTypes

y si está compilando RELEASE APK , agregue el multiDexEnabled truebloque de lanzamiento como-

release {
                ...
                multiDexEnabled true
                ...
        }
Raj Yadav
fuente
25

Para proyectos de aleteo también puede resolver este problema

abra su \ android \ app \ build.gradle

deberías tener lo siguiente:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

Si su minSdkVersion está configurado en 21 o superior, todo lo que necesita hacer es configurar multiDexEnabled en verdadero en la configuración predeterminada. Me gusta esto

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true 

    }

}

si su minSdkVersion está configurado en 20 o menos, agregue multiDexEnabled verdadero a la configuración predeterminada

Y definir la implementación

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

Al final deberías tener:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  // added this
    }

}

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

Para obtener más información, lea esto: https://developer.android.com/studio/build/multidex

Richardd
fuente
1
jajajaja ¡Estoy feliz de que te haya ayudado!
Richardd
18

Solo haz lo siguiente:

build.gradle

(module:app)


android {
            ....
      defaultConfig {
              multiDexEnabled true // enable mun
      }
}

Y agregue la dependencia a continuación en su build.gradlearchivo de nivel de aplicación

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
} 
Saif Khan
fuente
13
multiDexEnabled true

Intente agregar esto en la configuración predeterminada de su aplicación {}. Esto me ayuda a resolver el problema

usuario2173696
fuente
12

En el archivo de compilación de Gradle, agregue dependencia:

implementation 'com.android.support:multidex:1.0.2'

o

implementation 'com.android.support:multidex:1.0.3'

o

implementation 'com.android.support:multidex:2.0.0'

Y luego, en la sección "defaultConfig", agregue:

multiDexEnabled true

Bajo targetSdkVersion

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

Ahora si encuentras este error

Error: Error al resolver: archivo abierto de instrumentación multidex

Necesitas cambiar tu gradle a 3.0.1

        classpath 'com.android.tools.build:gradle:3.0.1'

Y ponga el siguiente código en el archivo gradle-wrapper.properties

distributionUrl = https: //services.gradle.org/distributions/gradle-4.1-all.zip

Finalmente

agregue la aplicación de clase en el proyecto y preséntela en el AndroidManifest que se extiende desde MultiDexApplication

public class App extends MultiDexApplication {

@Override
public void onCreate( ) {
    super.onCreate( );
}

}

Ejecute el proyecto primero para crear un error, luego limpie el proyecto

Finalmente, relanza el proyecto y disfrútalo

younes
fuente
Todavía tengo "Error al resolver: instrumentación
multidex
11

Si está utilizando minifyEnabled con Proguard, es probable que no necesite habilitar multi-dex. Estoy de acuerdo con MG Developer en que debes intentar evitar multi-dex si es posible. Mi solución fue habilitar multi-dex solo para compilaciones de depuración. minifyEnabled resuelve el problema de las versiones de lanzamiento

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        // getting error: Cannot fit requested classes in a single dex file.  # methods: 65537 > 65536
        // https://developer.android.com/studio/build/multidex
        // minifyEnabled true (used with release) will fix this by getting rid of unused method calls, but this will hide debugging info on crash
        multiDexEnabled true
    }
}
Ernie Thomason
fuente
¿Cuáles son algunos de los inconvenientes de usar multidex si es necesario?
isJulian00
1
Muy buena pregunta, a la que realmente no tengo respuesta. Lea lo siguiente si no lo ha hecho: en developer.android.com/studio/build/multidex#mdex-gradle Parece que para API> = 21, no hay muchos problemas. Para <21, parece que Android tiene que hacer un juego de pies elegante que podría tener problemas. Dado que muchas personas necesitan activar esto, supongo que Android lo hizo funcionar bien, por lo que no me preocuparía demasiado. Simplemente me gusta ser conservador cuando sea posible.
Ernie Thomason
10

No tengo idea de por qué, tal vez sea porque me desarrollo en Kotlin, pero para solucionar este error finalmente tengo que crear una clase que se extienda MultiDexApplicationasí:

class MyApplication : MultiDexApplication() {
}

y en mi Manifest.xmltengo que configurar

<application
        ...
        android:name=".MyApplication">

para no confundir a nadie, yo también hago:

multiDexEnabled true
implementation 'com.android.support:multidex:1.0.3'

para androidx, esto también funciona para mí:

implementation 'androidx.multidex:multidex:2.0.0'

...

<application android:name="android.support.multidex.MultiDexApplication">

no funciona para mi

Boe-Dev
fuente
recuerde hacer un proyecto limpio y reconstruir después de establecer multiDexEnabled verdadero. Esto me lo arregló.
pseudozach
cambiar el atributo de nombre de la aplicación en el manifiesto tampoco funcionó para mí, pero habilitar multiDex en el archivo de compilación gradle y agregar la implementación sí funcionó. Parece que es opcional cambiar la etiqueta de nombre del manifiesto ahora?
Cody
9

Tienes demasiados métodos para contar. El archivo dex de Android tiene un límite de 65536 métodos que puede tener.

Para empezar, si no necesita todos los servicios de Google Play API y solo la ubicación, reemplace

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

con

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

Puede consultar esta página para ver formas de evitarla o, si es necesario, permitir más: https://developer.android.com/studio/build/multidex.html

Raz
fuente
Sí, pero no es ese problema real. Creo que estoy agregando las mismas dependencias. Uno para Firebase y otro para ubicación Verifique debajo de dos líneas.
Muhammad Adil Sattar
6

Todo lo que tenía que hacer era establecer la Versión mínima del SDK en 21 en Archivo> Estructura del proyecto> Aplicación> Sabores

Will Buffington
fuente
6

agrega tu archivo android / app / build.gradle

 defaultConfig {
        applicationId "com.ubicacion"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        multiDexEnabled true // ✔
        missingDimensionStrategy 'react-native-camera', 'general'
    }
Un alemán
fuente
5

He encontrado este error dos veces y la solución para esto es; Verifique el archivo gradle de su aplicación para ver su SDk de destino, si tiene 20 o más, simplemente agregue una línea a sudefaultconfig { multiDexEnabled true }

De lo contrario, si su targetSDK es inferior a 20, agregue la línea a su configuración predeterminada y también agregue una dependencia

implementation 'com.android.support:multidex:1.0.3'.

Mira este enlace para más información.

https://developer.android.com/studio/build/multidex#mdex-gradle

Mpwanyi Samuel
fuente
5

El uso de soporte multidex debería ser el último recurso. De forma predeterminada, Gradle Build recopilará una tonelada de dependencias transitivas para su APK. Como se recomienda en Google Developers Docs , primero intente eliminar las dependencias innecesarias de su proyecto.

Usando la línea de comando, navegue a Android Projects Root. Puede obtener el árbol de dependencia de compilación de la siguiente manera.

gradlew app:dependencies --configuration debugCompileClasspath

Puedes obtener la lista completa del árbol de dependencias

gradlew app:dependencies

ingrese la descripción de la imagen aquí

Luego, elimine las dependencias innecesarias o transitivas de su aplicación build.gradle. Como ejemplo, si su aplicación usa una dependencia llamada 'com.google.api-client', puede excluir las bibliotecas / módulos que no necesita.

implementation ('com.google.api-client:google-api-client-android:1.28.0'){
   exclude group: 'org.apache.httpcomponents'
   exclude group: 'com.google.guava'
   exclude group: 'com.fasterxml.jackson.core'
   }

Luego, en Android Studio, seleccione Crear> Analizar APK ... Seleccione el archivo APK de liberación / depuración para ver el contenido. Esto le dará los métodos y referencias que se cuentan a continuación.

Analizar APK

Desarrollador MG
fuente
1
¿Cuáles son algunos de los inconvenientes de usar multidex si tenemos que hacerlo
esJulian00
2

En construcción: aplicación

apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.proyecto.marketdillo"
    minSdkVersion 14
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
implementation 'com.google.firebase:firebase-core:16.0.7'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-v4:28.0.0-rc02'
implementation 'com.android.support:design:28.0.0-rc02'
implementation 'com.google.firebase:firebase-auth:16.1.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.firebase:firebase-firestore:17.1.5'
implementation 'com.android.support:multidex:1.0.3'
}
apply plugin: 'com.google.gms.google-services'
Sebastián Giraldo
fuente
1
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.dev.khamsat"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "2.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
Mohamed Slimane
fuente
Esto fue suficiente para mí también.
nyxee
1

El error es causado por la cantidad de dependencias de clase que tiene en el archivo Gradle de su aplicación. Si las clases superan los 72.400, es posible que desee utilizar multidex como solución para manejar mejor la indexación de archivos. Obtenga más información desde aquí: https://developer.android.com/studio/build/multidex

Mpwanyi Samuel
fuente