DexIndexOverflowException issue after updating to latest appcompat and support library

AndroidGradleAndroid 5.0-LollipopAndroid Support-Librarybuild.gradle

Android Problem Overview


I'm using the below settings through 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

I also have the following settings in my gradle file:

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'

I always get the error UNEXPECTED TOP LEVEL EXCEPTION.
But when I make the 21.0.0 to 20.0.0 it works fine...but i'm not able to access any of the Android API 21 options. Is there something i'm doing wrong here? How do I get it to compile without this exception? I do not have the support jars anywhere else outside of other grade projects (facebook etc.).

Here is the full stack trace:

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)

Android Solutions


Solution 1 - Android

This message sounds like your project is too large.

You have too many methods. There can only be 65536 methods for dex.

Since the gradle plugin 0.14.0 and the Build Tools 21.1.0 you can use the multidex support.

Just add these lines in the build.gradle:

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

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

Also in your Manifest add the MultiDexApplication class from the multidex support library to the application element

<?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>

If you are using a own Application class, change the parent class from Application to MultiDexApplication.

Solution 2 - Android

  1. add dependency to application build.gradle file

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

  2. If you do not override the Application class, edit your manifest file to set android:name in the tag as follows:

    http://schemas.android.com/apk/res/android" package="com.example.myapp"> ... If you do override the Application class, change it to extend MultiDexApplication (if possible) as follows:

    public class MyApplication extends MultiDexApplication { ... }

Or if you do override the Application class but it's not possible to change the base class, then you can instead override the attachBaseContext() method and call MultiDex.install(this) to enable multidex:

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

3) Add multidex support to defaultConfig at build.gradle

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

Solution 3 - Android

Before messing around with MultiDex

It either solution is too big (use MultiDex) or you compile and include in your project some not needed stuff. I got this issue on my tiny project. Here is what I did to fix it:

I removed this from build.gradle:

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

And I manually removed my build folder from application root. Problem fixed.

Solution 4 - Android

Follow [this][1] guide to workaround 65K limit.

I solved this issue in gradle by setting multiDexEnabled true and extending my application with class MyApp extends MultiDexApplication

[1]: https://developer.android.com/tools/building/multidex.html "this"

Solution 5 - Android

I simply commented out the compile filetree(include: ['*.jar'], dir: 'libs') in the build.gradle file (as suggested above) and rebuilt the project. Compiled without any errors. I did not need to move any folders.

Solution 6 - Android

First make sure that minification is enabled in app/build.cradle:

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

If this does not solve the issue, enable multidex build for your app.

Solution 7 - Android

I faced this issue when i had compiled the entire package of Google Play Services APIs into my app. I solved the issue by using selective API.

For example, to include only the Google Fit and Android Wear APIs, replace the following line in your build.gradle file:

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

with these lines:

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

Issue is explained in following link.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKVISHView Question on Stackoverflow
Solution 1 - AndroidGabriele MariottiView Answer on Stackoverflow
Solution 2 - AndroidgeorgehardcoreView Answer on Stackoverflow
Solution 3 - AndroidAndreiView Answer on Stackoverflow
Solution 4 - AndroidIñaquiView Answer on Stackoverflow
Solution 5 - AndroidEarl AllenView Answer on Stackoverflow
Solution 6 - AndroidatomsymbolView Answer on Stackoverflow
Solution 7 - AndroidGaurav GuptaView Answer on Stackoverflow