Reputation: 483
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`
}
}
}
}
Upvotes: 4
Views: 2813
Reputation: 462
This happened in one of our Android projects that is multi-dex enabled and that was already properly set up (it calls MultiDex.install after super.attachBaseContext(...) as it is supposed to).
It was tracked down to a private static inner class that we were using to implement the initialization-on-demand holder idiom design pattern (lazy loaded singleton). Apparently that class was not being included in the primary dex file which resulted in the NoClassDefFoundError.
We ended up just making the singleton class an enum.
Upvotes: 3
Reputation: 18523
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.
Upvotes: 3