我以前见过不同版本的dex错误,但这一个是新的。清洁/重新启动等不会有帮助。库项目似乎完好无损,依赖项似乎正确链接。

Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

or

Cannot merge new index 65950 into a non-jumbo instruction

or

java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

tl;dr:谷歌的官方解决方案终于来了!

http://developer.android.com/tools/building/multidex.html

只有一个小提示,您可能需要这样做,以防止在进行索引时内存不足。

dexOptions {
        javaMaxHeapSize "4g"
}

还有一个超大模式可以以一种不太可靠的方式解决这个问题:

dexOptions {
        jumboMode true
}

更新:如果你的应用程序很胖,你有太多的方法在你的主应用程序,你可能需要重新组织你的应用程序

http://blog.osom.info/2014/12/too-many-methods-in-main-dex.html


当前回答

如前所述,在项目和库中有太多的方法(超过65k)。

预防问题:使用Play Services 6.5+和support-v4 24.2+减少方法的数量

因为谷歌Play服务经常是“浪费”方法的主要嫌疑人之一,它的20k+方法。谷歌播放服务6.5或更高版本,您可以使用一些较小的客户端库在应用程序中包含谷歌播放服务。例如,如果你只需要GCM和map,你可以选择只使用这些依赖项:

dependencies {
    compile 'com.google.android.gms:play-services-base:6.5.+'
    compile 'com.google.android.gms:play-services-maps:6.5.+'
}

子库的完整列表及其职责可以在谷歌官方文档中找到。

更新:从支持库v4 v24.2.0开始,它被分为以下模块:

Support-compat, support-core-utils, support-core-ui, support-media-compat和support-fragment

dependencies {
    compile 'com.android.support:support-fragment:24.2.+'
}

然而,请注意,如果你使用support-fragment,它将依赖于所有其他模块(例如。如果您使用的是android.support.v4.app。片段没有任何好处)

请参阅support-v4 lib的官方发布说明


使MultiDexing

因为棒棒糖(又名构建工具21+)非常容易处理。方法是解决每个dex文件有65k个方法的问题,为你的应用程序创建多个dex文件。将以下内容添加到你的gradle构建文件中(这来自于谷歌官方文档中超过65k个方法的应用程序):

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

第二步是准备你的应用程序类,或者如果你不扩展应用程序,在你的Android Manifest中使用MultiDexApplication:

或者将其添加到Application.java中

@Override
  protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
  }

或者使用mutlidex库中提供的应用程序

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

使用MultiDex防止内存溢出

作为进一步的提示,如果您在构建阶段遇到OutOfMemory异常,您可以使用

android {
    ...
    dexOptions {
        javaMaxHeapSize "4g"
    }
}

这将把堆设置为4gb。

有关dex堆内存问题的更多详细信息,请参阅此问题。


分析问题的根源

为了分析这些方法的来源,gradle插件https://github.com/KeepSafe/dexcount-gradle-plugin可以与gradle提供的依赖树相结合。

.\gradlew app:dependencies

有关android中方法计数的更多信息,请参阅此回答和问题

其他回答

你可以使用Android Studio分析问题(dex文件引用):

Build ->分析APK ..

在结果面板上单击classes.dex文件

你会看到:

你的项目太大了。你的方法太多了。每个应用程序只能有65536个方法。请看这里https://code.google.com/p/android/issues/detail?id=7147#c6

Gradle + proguard解决方案:

afterEvaluate {
  tasks.each {
    if (it.name.startsWith('proguard')) {
        it.getInJarFilters().each { filter ->
            if (filter && filter['filter']) {
                filter['filter'] = filter['filter'] +
                        ',!.readme' +
                        ',!META-INF/LICENSE' +
                        ',!META-INF/LICENSE.txt' +
                        ',!META-INF/NOTICE' +
                        ',!META-INF/NOTICE.txt' +
                        ',!com/google/android/gms/ads/**' +
                        ',!com/google/android/gms/cast/**' +
                        ',!com/google/android/gms/games/**' +
                        ',!com/google/android/gms/drive/**' +
                        ',!com/google/android/gms/wallet/**' +
                        ',!com/google/android/gms/wearable/**' +
                        ',!com/google/android/gms/plus/**' +
                        ',!com/google/android/gms/topmanager/**'
            }
        }
    }
  }
}

我已经分享了一个使用custom_rules.xml构建脚本和几行代码解决这个问题的示例项目。

我在自己的项目中使用了它,它在100多万设备上运行完美无缺(从android-8到最新的android-19)。希望能有所帮助。

https://github.com/mmin18/Dex65536

从Libs文件夹中删除一些jar文件并复制到其他文件夹,然后进入_Project Properties >,选择Java构建路径,选择Libraries,选择添加外部jar,选择已删除的jar到您的项目,单击保存,这将被添加到引用库,而不是Libs文件夹。现在清理并运行项目。你不需要添加任何代码为多dex。这对我来说很有效。