Как разрешить java.util.zip.ZipException?
Whever Я пытаюсь отлаживать и развертывать приложение для Android (в Android Studio 0.9). Я получаю следующую ошибку:
Execution failed for task ':app:packageAllDebugClassesForMultiDex'.
java.util.zip.ZipException: duplicate entry: android/support/multidex/BuildConfig.class
Чтобы прояснить ситуацию, приведена краткая история моих действий:
- Сегодня утром проект работал нормально
- Добавлены дополнительные классы и методы
- Сломал предел и получил эту ошибку:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
- Решено добавить поддержку multiDex моему проекту, поскольку сокращение зависимостей не было вариантом
С тех пор я продолжаю получать описанную ошибку сразу после добавления multiDex в свой проект, следуя этому сообщению SO Используя Gradle для разделения внешних библиотек в разделенных файлах dex для решения Android Dalvik 64k предел методов.
Вот мой файл build.gradle:
apply plugin: 'com.android.application'
repositories {
jcenter()
}
android {
compileSdkVersion 21
buildToolsVersion '21.1.0'
defaultConfig {
applicationId "com.stackoverflow.application"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
multiDexEnabled = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dexOptions {
preDexLibraries = false
}
}
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--multi-dex'
dx.additionalParameters += "--main-dex-list=$projectDir/<filename>".toString() // enable the main-dex-list
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':viewPagerIndicatorLibrary')
compile 'com.google.android:multidex:0.1'
compile 'com.j256.ormlite:ormlite-android:4.48'
compile 'com.j256.ormlite:ormlite-core:4.48'
compile 'de.greenrobot:eventbus:2.2.1'
compile 'se.emilsjolander:stickylistheaders:2.5.1'
compile 'joda-time:joda-time:2.5'
compile 'com.makeramen:roundedimageview:1.4.0'
compile 'javax.inject:javax.inject:1'
compile 'com.squareup.picasso:picasso:2.3.4'
compile 'com.googlecode.libphonenumber:libphonenumber:6.3.1'
compile('com.google.api-client:google-api-client-gson:1.18.0-rc') {
exclude module: 'httpclient'
}
compile 'com.google.android.gms:play-services:6.1.71'
compile('com.google.api-client:google-api-client:1.17.0-rc') {
exclude(group: 'xpp3', module: 'xpp3')
exclude(group: 'org.apache.httpcomponents', module: 'httpclient')
exclude(group: 'junit', module: 'junit')
exclude(group: 'com.google.android', module: 'android')
}
compile('com.google.api-client:google-api-client-android:1.17.0-rc') {
exclude(group: 'com.google.android.google-play-services', module: 'google-play-services')
}
compile('com.google.http-client:google-http-client-android:1.17.0-rc') {
exclude(group: 'com.google.android', module: 'android')
}
compile 'com.google.guava:guava:18.0'
}
У меня также есть другие зависимости проекта от использования библиотеки viewPagerIndicator, а также нескольких банок в папке /libs:
- Android-асинхронный HTTP-1.4.6.jar
- Guice-3,0-no_aop.jar
- jsr305-1.3.9.jar
- roboguice-2.0.jar
Приветствуются любые советы о том, как я могу решить эту проблему, не удаляя какие-либо из моих необходимых зависимостей!
Ответы
Ответ 1
Изменить: это ошибка, и исправление должно быть выполнено. См. https://code.google.com/p/android/issues/detail?id=81804
У меня тоже есть эта проблема, и у меня нет ответа. Но вот что я могу добавить:
Класс BuildConfig
- это волшебный класс, сгенерированный как часть процесса сборки. По какой-то причине существует версия с таким же полным именем (android.support.multidex.BuildConfig
) как в mutildex-1.0.0
, так и multidex-instrumentation-1.0.0
aars.
Я не верю, что мы сделали что-то не так. Я думаю, что это симптом того, чтобы быть на переднем крае. Я поднял отчет об ошибке.
Ответ 2
Тема немного устарела, но я тоже получил эту ошибку.
Моя проблема заключалась в том, что я использовал два разных
com.google.android.gms: play-services Версии в моем файле gradle.
compile 'com.google.android.gms:play-services-gcm:7.5.0'
compile 'com.google.android.gms:play-services-analytics:7.3.0' // WRONG!
Убедитесь, что вы всегда используете такие же версии, как:
compile 'com.google.android.gms:play-services-gcm:7.5.0'
compile 'com.google.android.gms:play-services-analytics:7.5.0'
Ответ 3
Чтобы диагностировать и устранить эту проблему, запустите эту команду gradle:
./gradlew clean app:dependencies
в этом списке будут указаны все зависимости вашего приложения в дереве. Найдите результаты для дублирующего класса и добавьте
compile('naughty.library') {
exclude group: 'foo', module: 'bar'
}
чтобы удалить дубликат.
Ответ 4
Недавно я получил эту ошибку, и, посмотрев мои "Внешние библиотеки" в студии Android, выяснилось, что одна из моих библиотек была включена под двумя номерами версий. (В этом случае это было время прогона 1.5.1 и 1.5.2).
Я бы рекомендовал заглянуть внутрь "Внешних библиотек" в ваш проект и посмотреть, есть ли там избыточные библиотеки. Он также включает в себя транзитивные зависимости, чтобы вы могли найти что-то там, что вас удивляет.
Ответ 5
1.update google play service
2.Add
compile 'com.google.android.gms:play-services-fitness:8.1.0'
compile 'com.google.android.gms:play-services-wearable:8.1.0'
вместо compile 'com.google.android.gms:play-services:8.1.0'
в файле build.gradle.
3.
defaultConfig {
multiDexEnabled true
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
Ответ 6
В моем случае причиной был Android Android SDK. Просто исключите транзитивную зависимость:
compile('com.facebook.android:facebook-android-sdk:+') {
exclude group: 'com.android.support', module: 'multidex'
}
В вашем случае это может быть какая-то другая зависимость - просто сортируйте их по одному, и вы найдете того, у кого есть транзитивная зависимость multidex
.
Ответ 7
Если вы включите multiDex, вы должны прекратить выполнение логики в afterEvaluate {}
. Поддержка multi-dex позаботится о главном списке dex для вас.
Ответ 8
Этот тип ошибки, такой как повторяющаяся запись, возникает, когда вы используете какой-либо класс более чем в одном месте. Чтобы преодолеть эту проблему, выполните простой поиск в классе, который показывает дубликат записи в проекте. Он покажет вам все пути, в которых этот класс представляет более одного места. В Windows CNTRL + N используется сочетание клавиш для поиска в файлах. Простая попытка удалить один из lib или файла, и проблема решена.
Ответ 9
tools:overrideLibrary="com.google.android.gms.location, com.google.android.gms.internal"
Сделал трюк для меня (я думаю, вы должны изменить местоположение с помощью любой библиотеки Google, которую вы используете)
Ответ 10
Вы добавляете такую библиотеку
(А). компилировать файлы ('libs/YOUR_LIBRARY.jar')
и этот пакет библиотеки уже доступен в вашем коде.
прокомментировать это или удалить эту строку
//компилировать файлы ('libs/YOUR_LIBRARY.jar')
Как узнать дубликат копии библиотеки в вашем проекте:
разархивируйте свой "YOUR_LIBRARY.jar" и увидите одно и то же имя класса в коде.