도구의 일부로 제공된 새 프로젝트 템플릿을 사용하여 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 파일을 확인하십시오.
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로 표시되는지 확인하세요. 그것이 오류가 발생하는 곳입니다.
답변
이 문제에 대한 두 가지 이유를 찾았습니다.
-
때로는 여러 라이브러리가 포함되어 있기 때문입니다. 예를 들어
‘com.nineoldandroids : library : 2.4.0’컴파일
gradle에서 “nineoldandroids”를 사용하는 또 다른 라이브러리를 gradle에 추가하십시오!
- 으로 안드로이드 개발자 공식 웹 사이트는 말했다 :
Android 앱을 빌드 한 후이 오류가 발생하면 축하합니다. 코드가 많습니다!
왜?
Dalvik Executable 사양은 Android 프레임 워크 메서드, 라이브러리 메서드 및 자체 코드의 메서드를 포함하여 단일 DEX 파일에서 참조 할 수있는 총 메서드 수를 65,536 개로 제한합니다. 이 한도를 초과하려면 multidex 구성이라고하는 둘 이상의 DEX 파일을 생성하도록 앱 빌드 프로세스를 구성해야합니다.
그럼 어떻게해야합니까?
-
65K 한계 피하기 -어떻게?
- 앱의 직접적 및 전 이적 종속성 검토- 앱에 포함하는 모든 큰 라이브러리 종속성이 애플리케이션에 추가되는 코드 양을 능가하는 방식으로 사용되는지 확인합니다. 일반적인 안티 패턴은 몇 가지 유틸리티 메서드가 유용했기 때문에 매우 큰 라이브러리를 포함하는 것입니다. 앱 코드 종속성을 줄이면 종종 dex 참조 제한을 피하는 데 도움이 될 수 있습니다.
- 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
파일이 자동으로 컴파일됩니다. 따라서 컴파일 문을 추가하면 오류가 발생합니다. 해당 문을 제거하면이 문제가 해결 될 수 있습니다. 이것이 해당되지 않는 경우 이미 몇 가지 멋진 답변이 있습니다.