如何解决java.util.zip.ZipException?

时间:2014-11-03 16:44:19

标签: android gradle android-studio

当我尝试调试和部署我的Android应用程序时(在Android Studio 0.9中)我收到以下错误:

Execution failed for task ':app:packageAllDebugClassesForMultiDex'.
java.util.zip.ZipException: duplicate entry: android/support/multidex/BuildConfig.class

这里要说清楚的是我的行动的简要历史:

  1. 今天早上项目工作正常
  2. 添加了一些其他类和方法
  3. 打破限制并收到此错误:Unable to execute dex: method ID not in [0, 0xffff]: 65536
  4. 决定为我的项目添加multiDex支持,因为减少依赖项不是一个选项
  5. 从那时起,我通过关注此SO帖子Using Gradle to split external libraries in separated dex files to solve Android Dalvik 64k methods limit,在将multiDex添加到我的项目后,一直收到描述的错误。

    这是我的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文件夹中的几个jar:

    • Android的异步-HTTP-1.4.6.jar
    • 吉斯-3.0-no_aop.jar
    • jsr305-1.3.9.jar
    • roboguice-2.0.jar

    欢迎任何有关如何在不删除任何所需依赖项的情况下解决此问题的建议!

11 个答案:

答案 0 :(得分:32)

线程有点旧,但我也遇到了这个错误。

我的问题是我用过两种不同的东西 com.google.android.gms:我的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'

答案 1 :(得分:13)

编辑:这是一个错误,需要修复。请参阅https://code.google.com/p/android/issues/detail?id=81804

我也有这个问题,但我没有答案。但这是我可以添加的内容:

BuildConfig是作为构建过程的一部分生成的魔术类。出于某种原因,android.support.multidex.BuildConfigmutildex-1.0.0 aars中存在具有相同完全限定名称(multidex-instrumentation-1.0.0)的版本。

我不相信我们做错了什么。我认为这是一个处于最前沿的症状。我提出了a bug report

答案 2 :(得分:12)

要诊断并解决此问题,请运行此gradle命令:

./gradlew clean app:dependencies

这将在树中列出您应用中的所有依赖项。搜索有问题的重复类的结果并添加

compile('naughty.library') {
    exclude group: 'foo', module: 'bar'
}

删除副本。

答案 3 :(得分:6)

我最近遇到了这个错误,看了我的&#34;外部图书馆&#34;在Android工作室中,我发现其中一个库包含在两个版本号下。 (在这种情况下,它是wire-runtime 1.5.1和1.5.2)。

我建议的内容是&#34;外部图书馆&#34;在项目视图中,查看是否有任何冗余库。它还包含传递依赖关系,因此您可能会发现令您惊讶的内容。

答案 4 :(得分:3)

1.update google play service

2.加

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

答案 5 :(得分:1)

在我的情况下,原因是Facebook Android SDK。只需排除传递依赖:

compile('com.facebook.android:facebook-android-sdk:+') {
    exclude group: 'com.android.support', module: 'multidex'
}

在你的情况下,它可能是一些其他的依赖 - 只需逐个排序,你就会发现那个具有传递multidex依赖的人。

答案 6 :(得分:0)

如果启用multiDex,则应停止在afterEvaluate {}中执行逻辑。多语言支持将为您处理主要的dex列表。

答案 7 :(得分:0)

当某个类位于多个位置时,会发生类似重复输入的错误。要解决此问题,只需搜索显示项目中重复条目的类。它将显示此类出现多个地方的所有路径。在Windows中CNTRL + N是用于在文件中搜索的键盘快捷键。简单的尝试删除其中一个lib或文件,问题就解决了。

答案 8 :(得分:0)

tools:overrideLibrary="com.google.android.gms.location, com.google.android.gms.internal"

我的诀窍(我猜你应该用你使用的谷歌库改变位置)

答案 9 :(得分:0)

你正在添加这样的图书馆 (一个)。 编译文件(&#39; libs / YOUR_LIBRARY.jar&#39;)
并且您的代码中已经提供了此库包。
评论它或删除此行
//编译文件(&#39; libs / YOUR_LIBRARY.jar&#39;)

如何知道项目中库的重复副本:
解压你的&#34; YOUR_LIBRARY.jar&#34;并在代码中看到相同的类名。

答案 10 :(得分:-1)

转到File/Invalidate Chaches/Restart,您的问题就解决了