Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NoClassDefFoundError after multidexing

I implemented multidexing after getting 65k method limit. After implementing multidexing I am able to run application. But now i am getting the error NoClasDefFoundError for one of the class I used from external jar.

Here is my gradle file--

dependencies {
    compile project(':pull-to-refresh')
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':gson-2.2.2')
    compile files('libs/android-support-multidex.jar')
    compile 'com.android.support:appcompat-v7:21.0.0'
    compile 'com.google.android.gms:play-services:6.1.71'
    compile 'com.android.support:support-v4:21.0.0'
}


android {
    compileSdkVersion 21
    buildToolsVersion '21.1.1'

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
    dexOptions {
        preDexLibraries = false
    }
    afterEvaluate {
        tasks.matching {
            it.name.startsWith('dex')
        }.each { dx ->
            if (dx.additionalParameters == null) {
                dx.additionalParameters = ['--multi-dex']
            } else {
                dx.additionalParameters += '--multi-dex'`enter code here`
            }
        }
    }
}
like image 376
androido Avatar asked Oct 17 '25 03:10

androido


1 Answers

I was able to fix this by making sure that the MultiDex.install line is AFTER the call to super.attachBaseContext. If you call install before super.attach, apparently it doesn't register correctly. However, it's probably a better alternative to simply change your application class to extend MultiDexApplication instead of Application.

Note: after you extend MultiDexApplication, you NO LONGER need to override attachBaseContext and call MultiDex.install(this). If you look at the source code of MultiDexApplication (here) you will see that the entire purpose of this class is to call install for you.

The official instructions from Google (posted here) point you to the documentation for MultiDexApplication (posted here) and that page contains instructions with multiple options to solve this but I missed that the first time through so I'm sure many others will as well.

like image 128
kdenney Avatar answered Oct 18 '25 20:10

kdenney