Android Studio-예상치 못한 최상위 예외 :


82

도구의 일부로 제공된 새 프로젝트 템플릿을 사용하여 Android Studio에서 새 프로젝트를 빌드했습니다. 모든 코드는 Studio에서 생성되었으며 아직 수정하지 않았습니다.

코드를 실행하려고하는데 앱이 다음 오류로 실패하고 문제가 무엇인지 확실하지 않아 도움을 주시면 감사하겠습니다.

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

build.gradle을 게시하십시오.
Gabriele Mariotti 2014 년

솔루션을 사용해보십시오 , 그것은 나를 위해 일했으며 pyus13이 말한 것을 시도했지만 이것은 효과가있었습니다.
Joshua G

이는 라이브러리에 중복 종속성이있는 경우에도 발생할 수 있습니다.이 문제를 해결하려면 stackoverflow.com/a/30649660/1979347
Rohan Kandwal

나는 gradle 의존성에 의해 new 이전에 추가 된 것을 잊었 기 때문에 동일한 libs를 제거함으로써 동일한 문제를 해결했다
tom

답변:


117

다른 사람들이 여기에서 말한 것처럼 지원 라이브러리 ( com.android.support)가 프로젝트에 두 번 이상 포함됩니다. build.gradle이를 루트 수준에서 추가 하면 지원 라이브러리가 다른 프로젝트 종속성을 통해 내보내지지 않도록 제외됩니다.

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

이와 같은 종속성에 하나 이상의 지원 라이브러리가 포함되어있는 경우 다음 중 하나를 제거 할 수 있습니다.여기에 이미지 설명 입력


1
이것이
바로이

@iTapAndroid : 어떤 build.gradle파일에 추가해야 하나요? 파일 Module또는 Project(이 줄이 있음 classpath 'com.android.tools.build:gradle:0.9.+')? 이 문제를 해결할 수 없다고 말해주세요.
Huy Tower

모듈 gradle 파일에 추가하고 싶습니다. 이것은 모든 종속성을 추가하는 파일입니다.
iTapAndroid 2014

@iTapAndroid 내 이클립스 프로젝트에 build.gradle이 없으면 어떻게해야합니까?
킬 콘솔

4
이것은 나를 위해 작동하지 않습니다. 같은 문제가 있습니다. 언급 된 코드를 추가하면 android.support.v4.app.ActionBarDrawerToggle을 가져올 수 없습니다.
NathofGod

18

여기에 이미지 설명 입력

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

libs 폴더에 support jar가 있으면 충돌이 발생합니다. 프로젝트 libs 폴더에 지원 jar가 있고 'com.android.support:support-v4:13.0.+'컴파일에 모듈 종속성이 추가 된 경우 UNEXPECTED_TOPLEVEL_DEPENDANCY 예외가 발생합니다. 충돌하는 폴더 구조 및 build.gradle


감사합니다. 나를 위해 한 것은 compile fileTree(dir: 'libs', include: ['*.jar'])스크린 샷 의 일부 였습니다 . 모든 개별 종속성을 주석 처리하고 연결하여 내 문제를 해결했습니다.
user1003916 2014-10-14

9

프로젝트에 두 개의 동일한 라이브러리를 포함 할 수 있기 때문입니다. build.gradle 파일을 확인하십시오.

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

컴파일 파일이 포함되어있는 경우 'com.android.support:appcompat-v7:+'compile files('libs/android-support-v4.jar'),이 문제가됩니다. 이 문장 삭제 : compile files ( 'libs / android-support-v4.jar')

이것이 제가이 문제를 해결하는 방법입니다.


8

이 오류는 동일한 라이브러리 / 디렉토리가 build.gradle의 종속성에 두 번 이상 포함 된 경우 발생합니다. 예, 다음과 같은 앱 구조가 있다고 가정 해 보겠습니다.

여기에 이미지 설명 입력

따라서 기본 "앱"이 있고 하위 앱 / 모듈 / 라이브러리가 많이 있습니다. 라이브러리는 1) gene_test_library, 2) genes_nine_old_androids_library, 3) swipe_list_view_library입니다.

제 이름은 Gene입니다. 그래서 이러한 "유전자"라이브러리가 모두 있습니다.

"앱"의 build.gradle 안에 다음이 있습니다.

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')
}

gene_test_library의 build.gradle 안에는 아무것도 없습니다.

dependencies {
}

gene_nine_old_androids_library의 build.gradle 내부에는 다음이 있습니다.

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

swipe_list_view_library의 build.gradle 내부에는 다음이 있습니다.

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

이 코드 줄은 "compile fileTree (dir : 'libs', include : [ '* .jar'])"는 단지 "야,이 모듈 내의 'libs'폴더에서 jar 파일을 찾아보십시오. 모듈의 libs 폴더에 아무것도 없으므로 해당 코드 줄을 무시할 수 있습니다.

따라서 "app"모듈의 build.gradle에서 // compile project ( ': libraries : genes_nine_old_androids_library') 주석을 제거한다고 가정 해 보겠습니다. 그런 다음 "예기치 않은 최상위 예외 :"오류가 발생합니다. 왜 그런 겁니까?

여기에 이미지 설명 입력

"app"에 대한 build.gradle 내부에 // compile project ( ': libraries : genes_nine_old_androids_library')를 작성하는 것은 "genes_nine_old_androids_library"모듈의 빌드 종속성을 가져와 여기에 넣는 것과 같습니다. 따라서 // compile project ( ': libraries : genes_nine_old_androids_library') 문을 주석 해제하면 "app"모듈에 대한 build.gradle은 다음과 같이됩니다.

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')
}

이제 'compile'com.android.support:appcompat-v7:21.0.0 ''이 2x로 표시되는지 확인하세요. 그것이 오류가 발생하는 곳입니다.


3
"이 오류는 동일한 라이브러리 / 디렉토리가 두 번 이상 포함 된 경우 발생합니다." 이것은 내 하루를 구했습니다.
Subin Sebastian

@Gene, in appyou compile project(':libraries:swipe_list_view_library')및 swipe_list_view_library도 appcompat-v7을 포함합니다. 따라서 2 개의 appcompat-v7이 app. 왜 이것이 오류를 던지지 않습니까?
azizbekian

음 .. 나는이 년 전에 썼다. 그것이 던지는 오류는 예상치 못한 최상위 예외라고 생각한다.
유전자

5

이 문제에 대한 두 가지 이유를 찾았습니다.

  1. 때로는 여러 라이브러리가 포함되어 있기 때문입니다. 예를 들어

    'com.nineoldandroids : library : 2.4.0'컴파일

gradle에서 "nineoldandroids"를 사용하는 또 다른 라이브러리를 gradle에 추가하십시오!

  1. 으로 안드로이드 개발자 공식 웹 사이트는 말했다 :

Android 앱을 빌드 한 후이 오류가 발생하면 축하합니다. 코드가 많습니다!

왜?

Dalvik Executable 사양은 Android 프레임 워크 메서드, 라이브러리 메서드 및 자체 코드의 메서드를 포함하여 단일 DEX 파일에서 참조 할 수있는 총 메서드 수를 65,536 개로 제한합니다. 이 한도를 초과하려면 multidex 구성이라고하는 둘 이상의 DEX 파일을 생성하도록 앱 빌드 프로세스를 구성해야합니다.

그럼 어떻게해야합니까?

  • 65K 한계 피하기 -어떻게?

    1. 앱의 직접적 및 전 이적 종속성 검토- 앱에 포함하는 모든 큰 라이브러리 종속성이 애플리케이션에 추가되는 코드 양을 능가하는 방식으로 사용되는지 확인합니다. 일반적인 안티 패턴은 몇 가지 유틸리티 메서드가 유용했기 때문에 매우 큰 라이브러리를 포함하는 것입니다. 앱 코드 종속성을 줄이면 종종 dex 참조 제한을 피하는 데 도움이 될 수 있습니다.
    2. ProGuard로 사용하지 않는 코드 제거-ProGuard 를 실행하도록 앱에 대한 ProGuard 설정을 구성하고 릴리스 빌드에 대해 축소를 활성화했는지 확인합니다. 축소를 활성화하면 사용하지 않는 코드를 APK와 함께 제공하지 않습니다.
  • Gradle로 Multidex 용 앱 구성 -어떻게? 1. Multidex를 사용하도록 Gradle 빌드 구성을 변경합니다.

놓다

multiDexEnabled true

Gradle 빌드 파일의 defaultConfig, buildType 또는 productFlavor 섹션에 있습니다.

2. 매니페스트에서 multidex 지원 라이브러리의 MultiDexApplication 클래스를 애플리케이션 요소에 추가합니다.

<?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>

참고 : 앱에서 Application 클래스를 확장하는 경우 attachBaseContext () 메서드를 재정의하고 MultiDex.install (this)을 호출하여 multidex를 활성화 할 수 있습니다. 자세한 내용은 MultiDexApplication 참조 문서를 참조하십시오.


또한이 코드가 도움이 될 수 있습니다.

dexOptions {
    javaMaxHeapSize "4g"
}

gradle (android {...})을 넣으십시오.


javaMaxHeapSize 를 사용하는 이유는 무엇입니까 ?
IgorGanapolsky

4

안녕하세요, 구문 분석 통합을 시도하는 동안 포함했던 중복 지원 버전 4 파일로 인해 발생한 동일한 문제가 있습니다. libs 디렉토리에서 추가 포함을 삭제했으며 이제 정상적으로 작동합니다!


Maven 저장소를 사용하여 종속성 블록에서 "compile 'com.android.support:appcompat-v7:23.0.1'"및 "compile 'com.android.support:support-v4:23.+'"를 모두 제거해야했습니다.
Mahya

3

이것은 라이브러리가 두 번 컴파일 될 때 발생합니다 (즉, 두 번 추가됨). 지원 라이브러리 또는 다른 것이 될 수 있으며 중요하지 않습니다.
일반적인 경우는 이미 libs/디렉토리 에있는 라이브러리의 컴파일 문을 추가 한 것 입니다. 모든 *.jar파일이 자동으로 컴파일됩니다. 따라서 컴파일 문을 추가하면 오류가 발생합니다. 해당 문을 제거하면이 문제가 해결 될 수 있습니다. 이것이 해당되지 않는 경우 이미 몇 가지 멋진 답변이 있습니다.


3

이것은 가장 멍청한 대답 일 수 있지만 이것은 나를 위해 일했습니다.

  • 프로젝트의 모든 라이브러리를 수동으로 제거하고 추가했습니다. (하나씩) 그리고 짜잔, 작동했습니다.
  • 빌드-> 프로젝트 다시 빌드

참고 : 내 라이브러리는 두 번 컴파일되지 않았습니다.


2

build.gradle에서 지원 라이브러리 종속성을 사용하려면 Support Repository를 다운로드했는지 확인하십시오.

여기에 이미지 설명 입력

이 모든 것이 이미 설치된 경우 사용 가능한 버튼을 사용하여 프로젝트를 gradle과 동기화하십시오.

동기화 버튼


0

제 경우에는 프로젝트 경로의 특수 문자로 인해 TOP LEVEL EXCEPTION이 발생했습니다. 프로젝트를 닫고 "á"를 "a"로 변경 한 다음 프로젝트를 다시 열었습니다. 공장!


0

갑자기 내 프로젝트에 큰 변화가없이 나도이 오류가 발생했습니다.

위의 모든 것은 지원 라이브러리 V4와 V7이 모두 필요했기 때문에 저에게 효과적이지 않았습니다.

결국 2 시간 전에 프로젝트가 문제없이 컴파일 되었기 때문에 Android Studio에 프로젝트를 다시 빌드하라고 간단히 말했고 오류가 사라졌습니다.


0

내 앱에 서명 된 APK를 빌드하려고 할 때 비슷한 문제가 발생했습니다.

이상하게도 릴리스 APK 를 빌드하고 싶을 때만 발생 했으며 디버그 APK에서는 모든 것이 정상적으로 작동했습니다.

마지막으로이 스레드를 살펴보고 build.gradle에서 지원 라이브러리 중복을 확인하고 중복을 제거했지만 이것만으로는 충분하지 않았습니다.

나는 깨끗한 프로젝트를해야했고 마침내 마침내 작동하게되었습니다.


0

문제가 해결되었다는 것을 알고 있지만 이것은 다시 발생할 수 있으며 내 솔루션은 내가 찾은 솔루션과 약간 다릅니다. 제 경우에는 솔루션이 프로젝트에 두 개의 다른 라이브러리를 포함하는 것과 관련이 없었습니다. 아래 코드를 참조하십시오.

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

이 코드는 "예기치 않은 최상위 예외"라는 오류를 제공했습니다. 다음과 같이 변경하는 코드를 수정합니다.

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

Java 버전은 DexMerger어떤 관련이 있습니까?
IgorGanapolsky

0

빌드 gradle에 다음을 추가하여 문제를 해결했습니다.

   defaultConfig {
   multiDexEnabled true


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

또 다른 해결책은 불필요한 라이브러리를 제거하는 것입니다.


multidex를 활성화 한 이유는 무엇입니까?
IgorGanapolsky

1
@IgorGanapolsky는 여러 라이브러리가 포함 된 위와 같은 문제를 해결하기 때문입니다. Android 스튜디오에서 : Dalvik Executable 사양은 단일 DEX 파일 내에서 참조 할 수있는 총 메서드 수를 65,536 개로 제한합니다. 여기에는 Android 프레임 워크 메서드, 라이브러리 메서드 및 자체 코드의 메서드가 포함됩니다. 이 한도를 초과하려면 multidex 구성이라고하는 둘 이상의 DEX 파일을 생성하도록 앱 빌드 프로세스를 구성해야합니다.
Bishnu Dudhraj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.