更新到最新的应用程序和支持库后发生 DexIndexOverflow 异常

我通过 gradle使用以下设置:

compileSdkVersion 21
ANDROID_BUILD_MIN_SDK_VERSION=14
ANDROID_BUILD_TARGET_SDK_VERSION=21
ANDROID_BUILD_TOOLS_VERSION=21.0.2
ANDROID_BUILD_SDK_VERSION=21

我还有以下设置在我的年级文件:

compile 'com.android.support:support-annotations:21.0.0'
compile 'com.android.support:appcompat-v7:21.0.0'
compile 'com.android.support:support-v4:21.0.0'

我总是得到错误 UNEXPECTED TOP LEVEL EXCEPTION
但是当我把 21.0.0设置成 20.0.0时,它工作得很好... 但是我不能访问任何 Android API 21的选项。我做错什么了吗?如何在没有这个异常的情况下编译它?我没有其他任何地方的支持罐除了其他等级的项目(facebook 等)。

下面是完整的堆栈跟踪:

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:283)
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:302)
at com.android.dx.command.dexer.Main.run(Main.java:245)
at com.android.dx.command.dexer.Main.main(Main.java:214)
at com.android.dx.command.Main.main(Main.java:106)
43716 次浏览

这个消息听起来像你的项目太大。

你的方法太多了,只能有 65536法

由于 gradle 插件0.14.0和 Build Tools 21.1.0,你可以使用 多指标支持

只需在 build.gradle中添加以下几行:

android {


defaultConfig {
...


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


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

另外,在 Manifest中,将 multidex 支持库中的 MultiDexApplication类添加到 application 元素中

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

如果您使用自己的 Application类,请将父类从 Application更改为 MultiDexApplication

遵循 这个指南来解决65K 的限制。

通过设置 multiDexEnabled true并使用 class MyApp extends MultiDexApplication扩展我的应用程序,我在 gradle 中解决了这个问题

1)向应用程序 build.gradle 文件添加依赖项

compile 'com.android.support:multidex:1.0.2'

2)如果您没有覆盖 Application 类,编辑您的清单文件以在标记中设置 android: name,如下所示:

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

如果重写 Application 类,则将其更改为扩展 MultiDexApplication (如果可能) ,如下所示:

public class MyApplication extends MultiDexApplication { ... }

或者,如果您确实重写了 Application 类,但是不可能更改基类,那么您可以重写 attachBaseContext ()方法并调用 MultiDex.install (this)来启用 multidex:

public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}

3)添加 multidex 支持到 build.gradle 的 defaultConfig

defaultConfig {
...
minSdkVersion 16
targetSdkVersion 26
...
// Enabling multidex support.
multiDexEnabled true
}
...

然后再去玩儿多功能手机

要么解决方案太大(使用 MultiDex) ,要么编译并在项目中包含一些不需要的东西。我的小项目出了点问题。以下是我为了解决这个问题所做的努力:

我从 build.gradle中删除了这个:

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}

并且我手动从应用程序根目录中删除了我的构建文件夹。问题已经解决。

我只是注释掉了编译 filetree(include: ['*.jar'], dir: 'libs')build.gradle文件中(如上所示)并重新构建项目。编译时没有任何错误。我不需要移动任何文件夹。

首先确保在 app/build.cradle中启用了缩小:

buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
debug {
signingConfig signingConfigs.config
}
}

如果这不能解决问题,启用 多指数构建为您的应用程序。

当我将整个 Google Play Services API 包编译到我的应用程序中时,我遇到了这个问题。我通过使用选择性 API 解决了这个问题。

例如,要只包含 Google Fit 和 Android Wear API,请替换 build.gradle 文件中的下面一行:

compile 'com.google.android.gms:play-services:11.0.2'

用这些句子:

compile 'com.google.android.gms:play-services-fitness:11.0.2'
compile 'com.google.android.gms:play-services-wearable:11.0.2'

问题在下面的 链接中解释。