Как разрешить 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" и увидите одно и то же имя класса в коде.