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

도구의 일부로 제공된 새 프로젝트 템플릿을 사용하여 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



답변

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

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

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


답변

여기에 이미지 설명 입력

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


답변

프로젝트에 두 개의 동일한 라이브러리를 포함 할 수 있기 때문입니다. 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’)

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


답변

이 오류는 동일한 라이브러리 / 디렉토리가 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로 표시되는지 확인하세요. 그것이 오류가 발생하는 곳입니다.


답변

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

  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 {…})을 넣으십시오.


답변

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


답변

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