【问题标题】:How to resolve java.util.zip.ZipException?如何解决 java.util.zip.ZipException?
【发布时间】:2014-12-30 09:06:55
【问题描述】:

无论我尝试调试和部署我的 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 支持,因为减少依赖关系不是一种选择

从那以后,我按照这个 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-async-http-1.4.6.jar
  • guice-3.0-no_aop.jar
  • jsr305-1.3.9.jar
  • roboguice-2.0.jar

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

【问题讨论】:

    标签: android gradle android-studio


    【解决方案1】:

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

    我的问题是我使用了两种不同的 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'
    

    【讨论】:

    • 我也面临类似的问题..thanx Dennis
    【解决方案2】:

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

    我也有这个问题,我没有答案。但这是我可以补充的:

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

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

    【讨论】:

    • 您好,感谢您的精确和行动,我希望有一天能找到解决此问题的解决方案。目前我使用了几个“hacks”来不打破这个 Dalvik 的 65k 限制。
    • 引用的错误现在标记为已修复
    【解决方案3】:

    要诊断和修复此问题,请运行以下 gradle 命令:

    ./gradlew clean app:dependencies
    

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

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

    删除重复项。

    【讨论】:

    • 谢谢!感谢您展示如何诊断。是我发现真正知道错误在哪里的唯一方法
    【解决方案4】:

    我最近遇到了这个错误,在 Android Studio 中查看了我的“外部库”后,发现我的一个库包含在两个版本号下。 (在这种情况下,它是线运行时 1.5.1 和 1.5.2)。

    我建议在您的项目视图中查看“外部库”,看看那里是否有任何冗余库。它还包括传递依赖项,因此您可能会在那里找到令您惊讶的东西。

    【讨论】:

    • 我确实检查了好几次问题是否会出现在外部库中,但没有出现任何相关的问题。到目前为止我没有重复。
    • 与此相关,我无意中手动将一个版本的 jar 放在 libs/ 下(具有依赖项 compile fileTree(dir: 'libs', include: '*.jar') ),但后来也使用从 maven 提取的编译行再次引用了该库。解决方法是删除其中一个!
    • Same here... 没有注意到任何双重库,因为没有... 然后我读到 Analytics 现在包含在 Google Play 服务中,并且我的项目中有一个 jar 引用。删除解决了我的问题...
    • qix,如果可以的话,我会为该评论点赞一百万次。你刚刚拯救了我的一天。
    【解决方案5】:

    1.更新谷歌播放服务

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

    【讨论】:

      【解决方案6】:

      就我而言,原因是 Facebook Android SDK。只需排除传递依赖:

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

      在您的情况下,它可能是其他一些依赖项 - 只需将它们一一排序,您就会找到具有传递性 multidex 依赖项的那个。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 遗憾的是,删除该部分不会改变任何东西。我认为需要做的是找到并解决一些冲突的依赖关系。
        • 发生了一些奇怪的事情,因为它试图在 APK 中打包一个它确实不应该的 .class,我不确定这是从哪里来的。它实际上似乎与multi-dex无关。我关于 remove afterEvaluate {} 的评论仍然有效(但出于另一个原因)。
        【解决方案8】:

        当您的某个班级在多个地方时,会发生这种类型的错误,例如重复条目。为了克服这个问题,简单搜索项目中显示重复条目的类。它将向您显示此类存在多个位置的所有路径。在 Windows 中,CNTRL+N 是在文件中搜索的键盘快捷键。简单尝试删除其中一个库或文件,问题就解决了。

        【讨论】:

          【解决方案9】:
          tools:overrideLibrary="com.google.android.gms.location, com.google.android.gms.internal"
          

          为我做了诀窍(我想你应该用你使用的任何谷歌图书馆改变位置)

          【讨论】:

          • 我在哪里做这个?
          • 在 manifest 中,它是 uses-sdk 项目的标签
          • 为什么专门解决java.util.zip.ZipException?并且不应该在 gradle 中指定 minSdkVersion 吗?
          【解决方案10】:

          您正在添加这样的库
          (一种)。 编译文件('libs/YOUR_LIBRARY.jar')
          并且此库包已在您的代码中可用。
          像这样评论它或删除这一行
          //compile files('libs/YOUR_LIBRARY.jar')

          如何知道项目中库的重复副本:
          解压缩您的“YOUR_LIBRARY.jar”并在您的代码中看到相同的类名。

          【讨论】:

            【解决方案11】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-03-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-07
              • 1970-01-01
              • 2017-05-26
              相关资源
              最近更新 更多