Android Studio - EXCEPCIÓN INESPERADA DE NIVEL SUPERIOR:

82

He creado un nuevo proyecto en Android Studio utilizando las nuevas plantillas de proyecto proporcionadas como parte de la herramienta. Todo el código ha sido generado por Studio. Aún no he realizado ninguna modificación.

Estoy intentando ejecutar el código, pero la aplicación falla con los siguientes errores, no estoy seguro de cuál es el problema, por lo que se agradece cualquier ayuda.

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/support/v7/app/ActionBar$Callback;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
    at com.android.dx.command.dexer.Main.run(Main.java:230)
    at com.android.dx.command.dexer.Main.main(Main.java:199)
    at com.android.dx.command.Main.main(Main.java:103)

 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\RichardKavanagh\AppData\Local\Android\android-sdk\build-tools\19.0.1\dx.bat --dex --output D:\Android\Projects\MyHealthRecord\app\build\libs\app-debug.dex D:\Android\Projects\MyHealthRecord\app\build\classes\debug D:\Android\Projects\MyHealthRecord\app\build\dependency-cache\debug D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\android-support-v7-appcompat-5a78dab7e2789bbe64f4bc80d106ca75c04dcf6f.jar D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\classes-f9b947272e9f33ba50355b52d82755584f9c0c58.jar D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\support-v4-19.0.0-31a2c13df80d37d62ca50fec3bde6da0ca706223.jar
Error Code:
    2
Output:

    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Landroid/support/v7/app/ActionBar$Callback;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
        at com.android.dx.command.dexer.Main.run(Main.java:230)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)



* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 12.948 secs
Codificador BENBUN
fuente
Publique su build.gradle.
Gabriele Mariotti
Pruebe esta solución , funcionó para mí, probé lo que dijo pyus13 pero funcionó.
Joshua G
Esto también puede suceder cuando tiene dependencias duplicadas en sus bibliotecas, para resolver esto, consulte stackoverflow.com/a/30649660/1979347
Rohan Kandwal
Resolví el mismo problema eliminando las bibliotecas correspondientes, porque olvidamos que se agregaron antes nuevas dependencias de gradle
tom

Respuestas:

117

Como todos los demás dijeron aquí, la biblioteca de soporte ( com.android.support) se incluye más de una vez en su proyecto. Intente agregar esto en su build.gradlenivel de raíz y debería excluir la biblioteca de soporte de ser exportada a través de otras dependencias del proyecto.

configurations {
    all*.exclude group: 'com.android.support', module: 'support-v4'
}

Si tiene más de una biblioteca de soporte incluida en dependencias como esta, es posible que desee eliminar una de ellas:ingrese la descripción de la imagen aquí

iTapAndroid
fuente
1
esto es exactamente lo que solucionó este problema
andreimarinescu
@iTapAndroid: ¿Necesito agregar a qué build.gradlearchivo? archivo en Moduleo Project(tiene esta línea classpath 'com.android.tools.build:gradle:0.9.+')? Por favor dígame, no puedo arreglar esto.
Torre Huy
Querrá agregarlo en el archivo gradle de su módulo. Este sería el archivo donde está agregando todas sus dependencias.
iTapAndroid
@iTapAndroid Si mi proyecto de eclipse no tiene build.gradle, ¿qué puedo hacer para resolver esto?
Kill Console
4
Esto simplemente no funciona para mí, tengo el mismo problema. Cuando agrego el código mencionado, no puedo importar android.support.v4.app.ActionBarDrawerToggle;
NathofGod
18

ingrese la descripción de la imagen aquí

dependencies {
    compile 'com.android.support:support-v4:19.1.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Esto entra en conflicto si tiene el jar de soporte en su carpeta libs. Si tiene el jar de soporte en la carpeta de bibliotecas de su proyecto y tiene la dependencia del módulo agregada para compilar 'com.android.support:support-v4:13.0.+', se lanzará la excepción UNEXPECTED_TOPLEVEL_DEPENDANCY. estructura de carpetas en conflicto y build.gradle

varunarl
fuente
Gran publicación, gracias. Lo que hizo por mí fue la compile fileTree(dir: 'libs', include: ['*.jar'])parte de tu captura de pantalla. Comenté todas las dependencias individuales y lo conecté y solucionó mi problema.
user1003916
9

Porque puede incluir dos bibliotecas iguales en su proyecto. revisa tu archivo build.gradle.

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile files('libs/android-support-v4.jar') 
 }

si su archivo incluye compilar 'com.android.support:appcompat-v7:+'y compile files('libs/android-support-v4.jar'), tendrá estos problemas. elimine esta oración: compile archivos ('libs / android-support-v4.jar')

Así es como soluciono este problema.

buptcoder
fuente
8

El error ocurre cuando tienes la misma biblioteca / directorio incluido más de una vez en las dependencias de build.gradle. Ok, digamos que tiene una estructura de aplicación que se ve así:

ingrese la descripción de la imagen aquí

Entonces tienes la “aplicación” principal y luego tienes un montón de sub-aplicaciones / módulos / bibliotecas. Las bibliotecas son: 1) gene_test_library, 2) genes_nine_old_androids_library y 3) swipe_list_view_library.

Mi nombre es Gene, por eso existen todas estas bibliotecas de "genes".

Dentro de build.gradle para "aplicación", tengo:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:21.0.0'

    compile project(':libraries:gene_test_library')
    //compile project(':libraries:genes_nine_old_androids_library')
    compile project(':libraries:swipe_list_view_library')
}

Dentro de build.gradle para gene_test_library, no tengo nada:

dependencies {
}

Dentro de build.gradle para gene_nine_old_androids_library, tengo:

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

Dentro de build.gradle para swipe_list_view_library, tengo:

dependencies {
    compile 'com.nineoldandroids:library:2.4.0+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.0'
}

Esta línea de código “compilar fileTree (dir: 'libs', incluir: ['* .jar'])” simplemente significa “hey, mira dentro de la carpeta 'libs' dentro de este módulo para ver si hay archivos jar. No tengo nada en la carpeta libs de ninguno de los módulos, por lo que puede ignorar esa línea de código.

Así que digamos que elimino el comentario de // compile project (': libraries: genes_nine_old_androids_library') en build.gradle para el módulo “app”. Entonces obtendría el error "EXCEPCIÓN INESPERADA DE NIVEL SUPERIOR:". ¿Porqué es eso?

ingrese la descripción de la imagen aquí

Bueno, escribir // proyecto de compilación (': libraries: genes_nine_old_androids_library') dentro de build.gradle para "app", es lo mismo que tomar las dependencias de compilación del módulo "genes_nine_old_androids_library" y ponerlo allí. Entonces, al descomentar la declaración // compile project (': libraries: genes_nine_old_androids_library'), el módulo build.gradle para "app" se convierte en:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:21.0.0'

    compile project(':libraries:gene_test_library')
    ***compile fileTree(dir: 'libs', include: ['*.jar'])***
    ***compile 'com.android.support:appcompat-v7:21.0.0'***
    compile project(':libraries:swipe_list_view_library')
}

Observe cómo ahora “compile 'com.android.support:appcompat-v7:21.0.0'” aparece 2x. De ahí es de donde viene el error.

Gene
fuente
3
"El error ocurre cuando tiene la misma biblioteca / directorio incluido más de una vez". Esto me salvó el día.
Subin Sebastian
@Gene, in appyou compile project(':libraries:swipe_list_view_library')y swipe_list_view_library también incluye appcompat-v7. Entonces, terminas compilando 2 appcompat-v7 app. ¿Por qué este no arroja un error?
azizbekian
Um ... escribí esto hace años ... Creo que el error que arroja es una EXCEPCIÓN INESPERADA DE NIVEL SUPERIOR.
Gene
5

Encontré 2 razones para este problema:

  1. A veces es debido a múltiples bibliotecas incluidas. Por ejemplo, agrega

    compilar 'com.nineoldandroids: biblioteca: 2.4.0'

en su gradle y agregue otra biblioteca que también use "nineoldandroids" en su gradle.

  1. Como dice el sitio web oficial de desarrolladores de Android :

Si ha creado una aplicación de Android y ha recibido este error, felicidades, ¡tiene mucho código!

¿Entonces por qué?

La especificación Dalvik Executable limita la cantidad total de métodos a los que se puede hacer referencia dentro de un solo archivo DEX a 65.536, incluidos los métodos del marco de trabajo 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 configuración multidex.

Entonces ¿qué deberías hacer?

  • Evitar el límite de 65K : ¿cómo?

    1. 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 utilice de una manera que supere la cantidad de código que se agrega a la aplicación. Un anti-patrón común es incluir una biblioteca muy grande porque algunos métodos de utilidad fueron útiles. Reducir las dependencias del código de la aplicación a menudo puede ayudarlo a evitar el límite de referencia dex.
    2. Elimine el código no utilizado con ProGuard : configure los ajustes de ProGuard para que su aplicación ejecute ProGuard y asegúrese de tener la reducción habilitada para las versiones de versiones. Habilitar la reducción garantiza que no envíe código sin usar con sus APK.
  • Configurar su aplicación para Multidex con Gradle : ¿cómo? 1.Cambie su configuración de compilación de Gradle para habilitar multidex.

poner

multiDexEnabled true

en las secciones defaultConfig, buildType o productFlavor de tu archivo de compilación de Gradle.

2.En su manifiesto, agregue la clase MultiDexApplication de la biblioteca de soporte multidex al elemento de la 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">
    ...
</application>
</manifest>

Nota: Si su aplicación utiliza la clase Application, puede anular el método attachBaseContext () y llamar a MultiDex.install (this) para habilitar multidex. Para obtener más información, consulte la documentación de referencia de MultiDexApplication.


Además, este código puede ayudarlo a:

dexOptions {
    javaMaxHeapSize "4g"
}

Ponga su gradle (android {...}).

Hamed Ghadirian
fuente
¿Cuál es la razón para usar javaMaxHeapSize ?
IgorGanapolsky
4

Hola a todos, tuve el mismo problema causado por un archivo de soporte de la versión 4 duplicado que había incluido al intentar integrar el análisis. Se eliminó la inclusión adicional del directorio libs y ahora funciona bien.

Doug Ray
fuente
usando el repositorio de Maven, tuve que eliminar tanto "compile 'com.android.support:appcompat-v7:23.0.1'" y "compile 'com.android.support:support-v4:23.+'" del bloque de dependencias.
Mahya
3

Esto sucede cuando una biblioteca se compila dos veces (es decir, se agrega dos veces). Puede ser una biblioteca de soporte o cualquier otra, no importa.
El caso común es que haya agregado una declaración de compilación de una biblioteca que ya está en su libs/directorio. Todos los *.jararchivos se compilan automáticamente. Por lo tanto, agregar una declaración de compilación provoca el error. Eliminar esa declaración podría solucionar este problema. Si esto no es aplicable, entonces ya tenemos algunas respuestas increíbles.

sahil shekhawat
fuente
3

Esta podría ser la respuesta más tonta, pero esto funcionó para mí:

  • Eliminé y agregué todas las bibliotecas en mi proyecto manualmente (una tras otra) Y listo, funcionó.
  • Construir -> Reconstruir proyecto

Nota: Ninguna biblioteca mía se compiló dos veces.

amalBit
fuente
2

Asegúrese de haber descargado Support Repository para usar la dependencia de la biblioteca de soporte en build.gradle.

ingrese la descripción de la imagen aquí

Si todos estos ya están instalados, sincronice su proyecto con gradle una vez usando el botón disponible.

botón de sincronización

pyus13
fuente
0

En mi caso, se lanzó la EXCEPCIÓN DE NIVEL SUPERIOR debido a un carácter especial en la ruta del proyecto. Acabo de cerrar el proyecto, cambió "á" a "a" y volvió a abrir el proyecto. ¡Trabajos!

Eneas Gesing
fuente
0

De repente, sin ningún cambio importante en mi proyecto, yo también recibí este error.

Todo lo anterior no funcionó para mí, ya que necesitaba las bibliotecas de soporte V4 y V7.

Al final, debido a que hace 2 horas el proyecto se compiló sin problemas, simplemente le dije a Android Studio que RECONSTRUYA el proyecto y el error desapareció.

Zvi
fuente
0

Tuve un problema similar cuando intenté crear una aplicación firmada para mi aplicación.

Extraño, sucedió solo cuando quería construir un apk de lanzamiento , mientras que en el apk de depuración todo funcionaba bien.

Finalmente, al mirar este hilo, verifiqué las duplicaciones de la biblioteca de soporte en build.gradle y eliminé las duplicaciones, pero esto no fue suficiente.

Tuve que hacer un proyecto limpio y solo entonces finalmente lo pude hacer funcionar.

Moti Bartov
fuente
0

Sé que el problema fue resuelto, pero esto podría volver a suceder y mi solución fue un poco diferente a las que encontré. En mi caso, la solución no estaba relacionada con incluir dos bibliotecas diferentes en mi proyecto. Ver código a continuación:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Este código estaba dando ese error "Excepción de nivel superior inesperada". Arreglo el código haciendo los siguientes cambios:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
Álisson Morais
fuente
¿Qué tiene que ver la versión de Java con DexMerger ?
IgorGanapolsky
0

Resolví mi problema al agregar estos en build gradle:

   defaultConfig {
   multiDexEnabled true


 dependencies {
 compile 'com.android.support:multidex:1.0.0'

otra solución puede ser eliminar bibliotecas innecesarias

Bishnu Dudhraj
fuente
¿Por qué habilitó multidex?
IgorGanapolsky
1
@IgorGanapolsky es porque para resolver los problemas como el anterior de múltiples bibliotecas incluidas. En Android Studio: la especificación Dalvik Executable limita la cantidad 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 configuración multidex.
Bishnu Dudhraj