Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MultiDexApplication not recognized

Trying to use MultiDexApplication in my app, but the class is not recognized when I try to extend my application activity with it.

Here is my build.gradle file:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion '21.0.1'
    defaultConfig {
        applicationId 'com.myapp'
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 115
        versionName '4.8'
    }

    buildTypes {
        debug {
            debuggable true
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            debuggable false
            runProguard true
            zipAlign true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }

    lintOptions {
        checkReleaseBuilds false
    }
}

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

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

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

    compile 'com.nineoldandroids:library:2.4.0'
    compile 'com.viewpagerindicator:library:2.4.1@aar'
    compile project(':facebook')
}

You can see that I'm compiling on 21, using the latest build tools, and the latest google play services and support library.

Has anyone gotten this to work?

like image 423
JMRboosties Avatar asked Oct 24 '14 23:10

JMRboosties


People also ask

What is MultiDexApplication Android?

In Android, the compilers convert your source code into DEX files. This DEX file contains the compiled code used to run the app. But there is a limitation with the DEX file. The DEX file limits the total number of methods that can be referenced within a single DEX file to 64K i.e. 65,536 methods.

How do I disable multidex?

Show activity on this post. You can disable multidex only if your project doesn't exceed either 65k methods limitation or 65k fields limitation. People seems to be unaware about the 65k fields limitation. You can hit the fields limitation if you're using huge total of resources like drawable, string id, etc.


3 Answers

MultiDexApplication class is not part of appcompat-v7 library. It is being shipped in a separate jar (called android-support-multidex).

Find the android-support-multidex.jar under /sdk/extras/android/support/multidex/library/libs (available from revision 21 of support library) and copy it to your project's libs folder.

Update (11/5/2014):
The jar is now available in central repository:

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

For more info, see here.

Update (27/9/2021):
Jetpack (AndroidX) users should add this as a dependency:

dependencies {
  ...
  implementation 'androidx.multidex:multidex:2.0.1'
}
like image 135
Alex Lipov Avatar answered Oct 24 '22 10:10

Alex Lipov


Although this question is quite old, I got this error in a multi-module setup when trying to build the different modules together as one APK for API < 21. I already refactored to AndroidX, but the multidex docs don't mention AndroidX yet.

If you are using AndroidX, make sure to replace the old multidex dependency

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

with the new one

implementation 'androidx.multidex:multidex:2.0.0'
like image 33
jossiwolf Avatar answered Oct 24 '22 12:10

jossiwolf


I have followed THIS blog post according to which MultiDexApplication should be included in r21 of support library.

My IDE had trouble resolving it also.

I made it work for now with the help of MULTIDEX github project by adding (you can see more details on the project's page):

android {
    dexOptions {
        preDexLibraries = false
    }
}

repositories {
  jcenter()
}

dependencies {
  compile 'com.google.android:multidex:0.1'
}

afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = []
        }
        dx.additionalParameters += '--multi-dex' // enable multidex

        dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
    }
}

and adding $project_dir/multidex.keep file with following contents:

android/support/multidex/BuildConfig.class
android/support/multidex/MultiDex$V14.class
android/support/multidex/MultiDex$V19.class
android/support/multidex/MultiDex$V4.class
android/support/multidex/MultiDex.class
android/support/multidex/MultiDexApplication.class
android/support/multidex/MultiDexExtractor$1.class
android/support/multidex/MultiDexExtractor.class
android/support/multidex/ZipUtil$CentralDirectory.class
android/support/multidex/ZipUtil.class

The github project page mentions also some consideration for the contents of your implementation of MultiDexApplication class:

  • The static fields in your application class will be loaded before the MultiDex#installbe called! So the suggestion is to avoid static fields with types that can be placed out of main classes.dex file.
  • The methods of your application class may not have access to other classes that are loaded after your application class. As workarround for this, you can create another class (any class, in the example above, I use Runnable) and execute the method content inside it.
like image 2
gswierczynski Avatar answered Oct 24 '22 10:10

gswierczynski