多索引后的NoClassDefFoundError

时间:2014-11-22 09:59:25

标签: android multidex android-multidex

我在获得65k方法限制后实现了多索引。实现多索引后,我可以运行应用程序。但是现在我从外部jar中使用的类之一得到错误NoClasDefFoundError。

这是我的gradle文件 -

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`
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

我能够通过确保MultiDex.install行在调用super.attachBaseContext之后来解决这个问题。如果你在super.attach之前调用install,显然它没有正确注册。 但是,它可能是更改应用程序类以扩展MultiDexApplication而不是Application的更好的替代方法。

注意:在扩展MultiDexApplication之后,NO LONGER需要覆盖attachBaseContext并调用MultiDex.install(this)。如果你看一下MultiDexApplication(here)的源代码,你会发现这个类的全部目的是为你调用install。

Google的官方指示(posted here)指向MultiDexApplication(posted here)的文档,该页面包含多个选项以解决此问题的说明,但我错过了第一次通过,所以我和#39;我相信其他人也一样。