【问题标题】:DexException: Multiple dex filesDexException:多个 dex 文件
【发布时间】:2015-02-05 02:28:44
【问题描述】:

好的,所以目前我正在制作一个使用 Google Sheets API 版本 3.0Drive API Client Library for Java的 Android 应用程序>,我需要该应用程序从用户驱动器帐户中读取电子表格并对其进行编辑。根据文档,我在我的 /lib 文件夹(Android Studio 1.1)中包含了以下 jar。
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:6.5.87' compile files('libs/google-api-client-1.19.1.jar') compile files('libs/google-api-client-android-1.19.1.jar') compile files('libs/google-api-services-drive-v2-rev158-1.19.1.jar') compile files('libs/google-http-client-1.19.0.jar') compile files('libs/google-http-client-android-1.19.0.jar') compile files('libs/google-http-client-gson-1.19.0.jar') compile files('libs/google-oauth-client-1.19.0.jar') compile files('libs/gson-2.1.jar') compile files('libs/jackson-core-2.1.3.jar') compile files('libs/jackson-core-asl-1.9.11.jar') compile files('libs/jsr305-1.3.9.jar') compile files('libs/protobuf-java-2.4.1.jar') compile files('libs/mail.jar') compile files('libs/jsr305.jar') compile files('libs/guava-11.0.2.jar') compile files('libs/gdata-spreadsheet-meta-3.0.jar') compile files('libs/gdata-spreadsheet-3.0.jar') compile files('libs/gdata-docs-meta-3.0.jar') compile files('libs/gdata-docs-3.0.jar') compile files('libs/gdata-core-1.0.jar') compile files('libs/gdata-client-meta-1.0.jar') compile files('libs/gdata-client-1.0.jar') compile files('libs/additionnal.jar') compile files('libs/activation.jar') }

当我输入我的代码时,一切正常,一切都被适当地导入但是当我运行时我的应用程序得到了这个结果。

`What went wrong:
Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\Ricardo\AppData\Local\Android\sdk\build-tools\21.1.2\dx.bat --dex --output C:\Users\Ricardo\Google Drive\Development\Android\Updated\Private\Google_Fiasco\MyApplication\app\build\intermediates\dex\debug --input-list=C:\Users\Ricardo\Google Drive\Development\Android\Updated\Private\Google_Fiasco\MyApplication\app\build\intermediates\tmp\dex\debug\inputList.txt
Error Code:
    2
Output:

    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Ljavax/annotation/CheckForNull;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)
        at com.android.dx.command.dexer.Main.run(Main.java:246)
        at com.android.dx.command.dexer.Main.main(Main.java:215)
        at com.android.dx.command.Main.main(Main.java:106)
e`<br>

现在有几点需要注意,当我创建两个单独的项目时,一个实现电子表格 API,另一个实现 Drive API,没有错误发生。只有当我在同一个项目中实现两个 API 时才会发生错误,即结合两个库中的 jar。在修补罐子后,我发现只有在包含 jsr305.jarjsr305-1.3.9.jar 时才会发生错误。查看这两个罐子,我发现它们都有CheckForNull.java 文件,错误消息Multiple dex files define Ljavax/annotation/CheckForNull 中引用的文件。
所以我的问题是:我该如何解决这个错误?我想我必须在我的依赖项中排除它?精确的说明将不胜感激,也许还可以解释解决方案的作用。还有最后一件事简单地将 jar 文件放入我的 /lib 文件夹和将其添加到 build.gradle 中的依赖项之间有什么区别?它似乎没有任何影响。 删除任一 jsr.jat 文件的结果如下:
UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502) at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277) at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491) at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168) at com.android.dx.merge.DexMerger.merge(DexMerger.java:189) at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303) at com.android.dx.command.dexer.Main.run(Main.java:246) at com.android.dx.command.dexer.Main.main(Main.java:215) at com.android.dx.command.Main.main(Main.java:106)

【问题讨论】:

  • 你真的需要两个jsr jars 吗?它们不是同一个库,只是版本不同吗?
  • 我只是在关注文档,无论如何,当我删除 jar.jar 时,我会得到一个不同的错误,因为电子表格 API 似乎需要那个 jar。
  • 删除其中一个副本,而不是两个。
  • 我在我的编辑中发布了删除任何一个 jar 文件的结果
  • @LiquidInk 此错误是由于您的项目中引用了太多方法引起的。 You can read more here。通常这意味着您需要删除未使用的库或即使在调试版本中使用 proguard 以减少引用的方法数量。您也可以使用文章中提到的多 dex 方法,但这会使您的项目更加复杂。

标签: android android-studio google-drive-api android-gradle-plugin dex


【解决方案1】:

只需清理项目并重新构建...当我在错误文本中看到“dex”一词时,我就知道我的代码与错误无关

【讨论】:

    【解决方案2】:

    此错误是由于您的项目中引用了太多方法。 You can read more here.

    通常这意味着您需要删除未使用的库或使用proguard,即使在调试版本中也可以减少引用的方法数量。您也可以使用本文中提到的多 dex 方法,但这会使您的项目更加复杂。

    【讨论】:

      【解决方案3】:

      我有react-native 项目与应用程序的build.gradle

      def enableProguardInReleaseBuilds = false
      
      ...
      
      buildTypes {
          release {
              minifyEnabled enableProguardInReleaseBuilds
              proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
          }
      }
      

      enableProguardInReleaseBuilds 设置为true 对我有用:

      def enableProguardInReleaseBuilds = true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        相关资源
        最近更新 更多