DexIndexOverflowException issue after updating to latest appcompat and support library

43,658

Solution 1

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

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:

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

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

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

Follow this guide to workaround 65K limit.

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

Share:
43,658
KVISH
Author by

KVISH

Updated on September 23, 2020

Comments

  • KVISH
    KVISH almost 4 years

    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)
    
  • KVISH
    KVISH over 9 years
    multi-dex was the reason for that.
  • Elhanan Mishraky
    Elhanan Mishraky over 9 years
    Add multiDexEnabled true to the defaultConfig of your build.gradle file
  • benchuk
    benchuk almost 9 years
    Perfect! @georgehardcore
  • Nageswara Rao.CH
    Nageswara Rao.CH over 8 years
    @georgehardcore: i used second point, in my android eclipse project.but still it is showing same error.
  • georgehardcore
    georgehardcore over 8 years
    try to split google-play-services library if you are uisng it. For example, if you use analytics and gcm just plug them as separate modules with base module like: compile 'com.google.android.gms:play-services-base:8.1.0' compile 'com.google.android.gms:play-services-analytics:8.1.0' compile 'com.google.android.gms:play-services-gcm:8.1.0'
  • Ashokchakravarthi Nagarajan
    Ashokchakravarthi Nagarajan over 8 years
    I don't use build gradle file to build my app. Anyway to overcome this issue.?
  • Vu Nguyen
    Vu Nguyen over 8 years
    @georgehardcore not sure if step #2 would be needed, 'cos it didn't help me on my application. So I skip it and the rest of the steps worked great!
  • Amt87
    Amt87 about 8 years
    For me it worked but without changing Application class to MultiDexApplication in the manifest nor MyApplication class
  • Earl Allen
    Earl Allen almost 8 years
    Disregard my comment - subsequent rebuilds generated the same original error even when I manually deleted the build folder.
  • Abhijit Gujar
    Abhijit Gujar over 7 years
    interestingly only adding gradle config worked for me. Was the manifest config optional ?
  • The Unknown Dev
    The Unknown Dev over 7 years
    I had to use the AndroidManifest.xml change in @georgehardcore's answer to get this to work.
  • josh527
    josh527 over 7 years
    @KimberlyW you may have just forgotten the forward slash to close the meta data element. Called a self-closing tag. w3schools.com/xml/xml_elements.asp
  • Eric
    Eric over 7 years
    i had to change the tag in the android manifest file to <meta-data android:name="android.support.multidex.MultiDexApplication" android:value="true"/> to get it to work for me. I'm using a multi-module project....if i didnt i'd get this error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
  • Weverton Peron
    Weverton Peron over 6 years
    Thanks, it was very important and help me a lot.
  • Placeable
    Placeable almost 6 years
    You dont have to do anything to your Manifest. Gradle is enough.