MultiDex NoClassDefFound错误 [英] MultiDex NoClassDefFound error

查看:604
本文介绍了MultiDex NoClassDefFound错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经将我的应用程序到MultiDex忍受64K DEX限制。现在看起来是这样的:

 公共类应用扩展MultiDexApplication {

私人AppWrapper实例;

@覆盖
保护无效attachBaseContext(上下文基地){
    super.attachBaseContext(基峰);
    MultiDex.install(基峰);
}

@覆盖
公共无效的onCreate(){
    super.onCreate();

    如果(例如== NULL){
        例如=新AppWrapper(本);
    }
}
}
 

我已经将来自应用程序的所有常用的逻辑 AppWidget ,使 MultiDex 的工作。和它的作品确定在其他队友的计算机。但不是我。它不断抛出 java.lang.NoClassDefFoundError的在应用程序中创建:

  I / dalvikvm:未能解决LCOM /休息日/ APP /核心/ AppWrapper;接口8940Lretrofit /的ErrorHandler;
W / dalvikvm:Link类的LCOM /休息日/ APP /核心/ AppWrapper;失败
I / dalvikvm:未能解决LCOM /休息日/ APP /核心/ AppWrapper;接口8940Lretrofit /的ErrorHandler;
W / dalvikvm:Link类的LCOM /休息日/ APP /核心/ AppWrapper;失败
E / dalvikvm:找不到类的com.playday.app.core.AppWrapper,从法com.playday.app.core.App.onCreate引用
W / dalvikvm:VFY:无法解析新的实例7076(LCOM /休息日/ APP /核心/ AppWrapper;)在LCOM /休息日/ APP /核心/应用程序;
D / dalvikvm:VFY:更换运code输入0x22为0x0007
I / dalvikvm:未能解决LCOM /休息日/ APP /核心/ AppWrapper;接口8940Lretrofit /的ErrorHandler;
W / dalvikvm:Link类的LCOM /休息日/ APP /核心/ AppWrapper;失败
D / dalvikvm:DexOpt:无法选择直接调用0xc21b在LCOM /休息日/ APP /核心/应用×09; .onCreate
I / MultiDex:VM与1.6.0版本不支持multidex
I / MultiDex:安装
I / MultiDex:MultiDexExtractor.load(/data/app/com.playdayteam.playday.debug-1.apk,FALSE)
I / MultiDex:检测到的提取必须执行。
I / MultiDex:试图删除旧文件/data/data/com.playdayteam.playday.debug/$c$c_cache/secondary-dexes/com.playdayteam.playday。调试2.apk.classes2.dex大小1484912的
I / MultiDex:删除旧文件/data/data/com.playdayteam.playday.debug/$c$c_cache/secondary-dexes/com.playdayteam.playday.debug-2 .apk.classes2.dex
I / MultiDex:试图删除旧文件/data/data/com.playdayteam.playday.debug/$c$c_cache/secondary-dexes/com.playdayteam.playday。规模540964的debug-2.apk.classes2.zip
I / MultiDex:删除旧文件/data/data/com.playdayteam.playday.debug/$c$c_cache/secondary-dexes/com.playdayteam.playday.debug-2 .apk.classes2.zip
D / dalvikvm:GC_CONCURRENT释放186K,11%免费3245K / 3640K,暂停2MS + 4ms的,总28ms
D / dalvikvm:WAIT_FOR_CONCURRENT_GC受阻5毫秒
D / dalvikvm:GC_CONCURRENT释放156K,8%免费3593K / 3904K,暂停3毫秒+ 2ms的,共有22毫秒
I / MultiDex:提取是需要文件/data/data/com.playdayteam.playday.debug/$c$c_cache/secondary-dexes/com.playdayteam。 playday.debug-1.apk.classes2.zip
I / MultiDex:提取/data/data/com.playdayteam.playday.debug/$c$c_cache/secondary-dexes/com.playdayteam.playday.debug-1 .apk.classes576886388.zip
I / MultiDex:重命名为/data/data/com.playdayteam.playday.debug/$c$c_cache/secondary-dexes/com.playdayteam.playday.debug-1 .apk.classes2.zip
I / MultiDex:提取成功 - 长/data/data/com.playdayteam.playday.debug/$c$c_cache/secondary-dexes/com.playdayteam.playday。 debug-1.apk.classes2.zip:540964
I / MultiDex:加载找到中学1 DEX文件
D / dalvikvm:DexOpt:--- BEGIN融为一体。 playdayteam.playday.debug-1.apk.classes2.zip'(引导= 0)---
D / dalvikvm:DexOpt:--- END融为一体。 playdayteam.playday.debug-1.apk.classes2.zip'(成功)---
D / dalvikvm:DEX preP'/数据/数据​​/ COM .playdayteam.playday.debug / code_cache /次级索引/ com.playdayteam.playday.debug-1.apk.classes2。拉链:解压缩到28ms,改写387ms
I / MultiDex:安装完毕后
I / MultiDex:安装
D / AndroidRuntime:关闭虚拟机
W / dalvikvm:主题ID = 1:螺纹退出与未捕获的异常(组= 0x41c1d930)
E / AndroidRuntime:致命异常:主要
    java.lang.NoClassDefFoundError的:com.playday.app.core.AppWrapper
            在com.playday.app.core.App.onCreate(App.java:22)
            在android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1006)
            在android.app.ActivityThread.handleBindApplication(ActivityThread.java:4457)
            在android.app.ActivityThread.access $ 1300(ActivityThread.java:142)
            在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1332)
            在android.os.Handler.dispatchMessage(Handler.java:99)
            在android.os.Looper.loop(Looper.java:137)
            在android.app.ActivityThread.main(ActivityThread.java:5105)
            在java.lang.reflect.Method.invokeNative(本机方法)
            在java.lang.reflect.Method.invoke(Method.java:511)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            在dalvik.system.NativeStart.main(本机方法)
 

我也有同样的Andr​​oid工作室,摇篮,SDK,JDK版本,同样的code。我甚至试图格式化硬盘并重新安装操作系统,以确保环境是一样的。什么是这个奇怪的问题的原因是什么?

这是我的 build.gradle

 应用插件:com.android.application

库{
    行家{URLhttp://dl.bintray.com/populov/maven'}
    mavenCentral()
    行家{URLhttps://oss.sonatype.org/content/repositories/snapshots/'}
}

安卓{
    compileSdkVersion project.api_level
    buildToolsVersion project.build_tools_version

    defaultConfig {
        的minSdkVersion 14
        targetSdkVersion project.api_level
    }

    sourceSets {
        instrumentTest.setRoot(SRC /测试)
    }

    packagingOptions {
        不包括META-INF / LICENSE.TXT
        不包括META-INF /许可证
        不包括META-INF / NOTICE.txt
        不包括META-INF /注意事项
        不包括META-INF / ASL2.0
        排除的Andr​​oidManifest.xml
    }

    defaultConfig {
        VERSIONNAME0.3.2
        版本code 23
    }

    buildTypes {

        调试{
            调试的真
            applicationIdSuffix的.debug
        }

        测试{
            调试的真
            signingConfig signingConfigs.release
            applicationIdSuffix.beta
        }

        推出 {
            signingConfig signingConfigs.release
            runProguard假
            proguardFile文件(ProGuard的-rules.txt)
            proguardFile getDefaultProguardFile('ProGuard的-的Andr​​oid optimize.txt)
        }
    }

    dexOptions {
        增量假
        preDexLibraries假
    }
}

依赖{
    编译com.android.support:support-v13:$project.support_lib_version
    编译com.android.support:support-v4:$project.support_lib_version
    编译com.android.support:appcompat-v7:$project.support_lib_version
    编译com.google.android.gms:播放服务:6.1.11
    编译(de.keyboardsurfer.android.widget:crouton:1.8.5@aar'){
        排除组:com.google.android',模块:支持-V4
    }
    编译(com.octo.android.robospice:robospice:1.4.14'){
        排除组:公地IO,模块:公共-IO
    }
    编译(com.octo.android.robospice:robospice-改造:1.4.14'){
        排除组:公地IO,模块:公共-IO
    }
    编译com.squareup.retrofit:改造:1.6.1
    编译com.google code.gson:GSON:2.3
    编译com.viewpagerindicator:库:2.4.1@aar
    编译com.squareup.picasso:毕加索:2.3.3
    编译com.squareup.okhttp:okhttp:2.0.0
    编译com.squareup.okhttp:okhttp-的URLConnection:2.0.0

    编译com.etsy.android.grid:图书馆:1.0.5
    编译com.squareup:奥托:1.3.4
    编译com.darwinsys:燕子-date4j:1.5.1
    编译com.github.chrisbanes.photoview:图书馆:1.2.3
    编译me.grantland:autofittextview:0.2.0
    编译it.sephiroth.android.library.horizo​​ntallistview:图书馆:1.2.1
    编译org.ocpsoft prettytime:prettytime:3.2.4.Final
    编译com.google.guava:番石榴:18.0'
    编译com.github.castorflex.smoothprogressbar:图书馆:0.5.2
    编译com.makeramen:roundedimageview:1.3.0
    编译org.lucasr.twowayview:twowayview:0.1.1
    编译com.michaelpardo:activeandroid:3.1.0快照

    编制项目(':库:LoopingViewPager)
    编制项目(':库:PhotoView中-2.2.1)
    编译文件(库/ localytics.jar)
    编译文件(库/ Android的支持 -  multidex.jar)

    编译net.hockeyapp.android:HockeySDK:3.0.2
}

afterEvaluate {
    tasks.matching {
        it.name.startsWith(DEX)
    } {。每个DX  - >
        如果(dx.additionalParameters == NULL){
            dx.additionalParameters = []
        }
        dx.additionalParameters + ='--multi-DEX'//使multidex
        dx.additionalParameters + = - 主-DEX-列表= $ PROJECTDIR / multidex.keep的ToString()
    }
}
 

更新。我的 multidex.keep 文件:

 安卓/支持/ multidex / BuildConfig.class
安卓/支持/ multidex / MultiDex $ V14.class
安卓/支持/ multidex / MultiDex $ V19.class
安卓/支持/ multidex / MultiDex $ V4.class
安卓/支持/ multidex / MultiDex.class
安卓/支持/ multidex / MultiDexApplication.class
安卓/支持/ multidex / MultiDexExtractor $ 1.class
安卓/支持/ multidex / MultiDexExtractor.class
安卓/支持/ multidex / ZipUtil $ CentralDirectory.class
安卓/支持/ multidex / ZipUtil.class
COM /休息日/应用​​程序/模型/通知/ Badge.class
COM /休息日/应用​​/型号/ User.class
COM /休息日/ APP /核心/ AppWrapper.class
COM /休息日/ APP /核心/ App.class
 

解决方案

您的 AppWrapper 的类加载失败,因为 retrofit.ErrorHandler 的接口不包含在主DEX文件。

如何计算把你的主DEX-列表文件中哪些类?
有一个脚本可以生成它。我写了一个博文演示了如何使用它。

更新(2014年10月31日)
摇篮插件v0.14.0现已自动完成。见我的回答这里

I have converted my application into MultiDex to bear with 64k dex limit. Now it looks like this:

public class App extends MultiDexApplication {

private AppWrapper instance;

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(base);
}

@Override
public void onCreate() {
    super.onCreate();

    if (instance == null) {
        instance = new AppWrapper(this);
    }
}
}

I've pulled all the usual logic from App to AppWidget to make MultiDex work. And it works ok on other teammates' computers. But not with me. It keeps throwing java.lang.NoClassDefFoundError on application create:

I/dalvikvm﹕ Failed resolving     Lcom/playday/app/core/AppWrapper; interface 8940 'Lretrofit/ErrorHandler;'
W/dalvikvm﹕ Link of class     'Lcom/playday/app/core/AppWrapper;' failed
I/dalvikvm﹕ Failed resolving     Lcom/playday/app/core/AppWrapper; interface 8940 'Lretrofit/ErrorHandler;'
W/dalvikvm﹕ Link of class     'Lcom/playday/app/core/AppWrapper;' failed
E/dalvikvm﹕ Could not find class     'com.playday.app.core.AppWrapper', referenced from method com.playday.app.core.App.onCreate
W/dalvikvm﹕ VFY: unable to resolve     new-instance 7076 (Lcom/playday/app/core/AppWrapper;) in Lcom/playday/app/core/App;
D/dalvikvm﹕ VFY: replacing opcode     0x22 at 0x0007
I/dalvikvm﹕ Failed resolving     Lcom/playday/app/core/AppWrapper; interface 8940 'Lretrofit/ErrorHandler;'
W/dalvikvm﹕ Link of class     'Lcom/playday/app/core/AppWrapper;' failed
D/dalvikvm﹕ DexOpt: unable to opt     direct call 0xc21b at 0x09 in Lcom/playday/app/core/App;.onCreate
I/MultiDex﹕ VM with version 1.6.0     does not have multidex support
I/MultiDex﹕ install
I/MultiDex﹕ MultiDexExtractor.load(    /data/app/com.playdayteam.playday.debug-1.apk, false)
I/MultiDex﹕ Detected that     extraction must be performed.
I/MultiDex﹕ Trying to delete old     file /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.    debug-2.apk.classes2.dex of size 1484912
I/MultiDex﹕ Deleted old file     /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.debug-2    .apk.classes2.dex
I/MultiDex﹕ Trying to delete old     file /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.    debug-2.apk.classes2.zip of size 540964
I/MultiDex﹕ Deleted old file     /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.debug-2    .apk.classes2.zip
D/dalvikvm﹕ GC_CONCURRENT freed     186K, 11% free 3245K/3640K, paused 2ms+4ms, total 28ms
D/dalvikvm﹕ WAIT_FOR_CONCURRENT_GC     blocked 5ms
D/dalvikvm﹕ GC_CONCURRENT freed     156K, 8% free 3593K/3904K, paused 3ms+2ms, total 22ms
I/MultiDex﹕ Extraction is needed     for file /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.    playday.debug-1.apk.classes2.zip
I/MultiDex﹕ Extracting     /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.debug-1    .apk.classes576886388.zip
I/MultiDex﹕ Renaming to     /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.debug-1    .apk.classes2.zip
I/MultiDex﹕ Extraction success -     length /data/data/com.playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.    debug-1.apk.classes2.zip: 540964
I/MultiDex﹕ load found 1 secondary     dex files
D/dalvikvm﹕ DexOpt: --- BEGIN 'com.    playdayteam.playday.debug-1.apk.classes2.zip' (bootstrap=0) ---
D/dalvikvm﹕ DexOpt: --- END 'com.    playdayteam.playday.debug-1.apk.classes2.zip' (success) ---
D/dalvikvm﹕ DEX prep '/data/data/com    .playdayteam.playday.debug/code_cache/secondary-dexes/com.playdayteam.playday.debug-1.apk.classes2.    zip': unzip in 28ms, rewrite 387ms
I/MultiDex﹕ install done
I/MultiDex﹕ install
D/AndroidRuntime﹕ Shutting down VM
W/dalvikvm﹕ threadid=1: thread     exiting with uncaught exception (group=0x41c1d930)
E/AndroidRuntime﹕ FATAL EXCEPTION:     main
    java.lang.NoClassDefFoundError: com.playday.app.core.AppWrapper
            at com.playday.app.core.App.onCreate(App.java:22)
            at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1006)
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4457)
            at android.app.ActivityThread.access$1300(ActivityThread.java:142)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1332)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5105)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)    

I have the same Android Studio, gradle, sdk, jdk versions, same code. I've even tried to format hard drive and reinstall OS to make sure that environment is the same. What can be the cause of this strange problem?

This is my build.gradle:

apply plugin: 'com.android.application'

repositories {
    maven { url 'http://dl.bintray.com/populov/maven' }
    mavenCentral()
    maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
}

android {
    compileSdkVersion project.api_level
    buildToolsVersion project.build_tools_version

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion project.api_level
    }

    sourceSets {
        instrumentTest.setRoot('src/test')
    }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/ASL2.0'
        exclude 'AndroidManifest.xml'
    }

    defaultConfig {
        versionName "0.3.2"
        versionCode 23
    }

    buildTypes {

        debug {
            debuggable true
            applicationIdSuffix ".debug"
        }

        beta {
            debuggable true
            signingConfig signingConfigs.release
            applicationIdSuffix ".beta"
        }

        release {
            signingConfig signingConfigs.release
            runProguard false
            proguardFile file('proguard-rules.txt')
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
        }
    }

    dexOptions {
        incremental false
        preDexLibraries false
    }
}

dependencies {
    compile "com.android.support:support-v13:$project.support_lib_version"
    compile "com.android.support:support-v4:$project.support_lib_version"
    compile "com.android.support:appcompat-v7:$project.support_lib_version"
    compile 'com.google.android.gms:play-services:6.1.11'
    compile('de.keyboardsurfer.android.widget:crouton:1.8.5@aar') {
        exclude group: 'com.google.android', module: 'support-v4'
    }
    compile('com.octo.android.robospice:robospice:1.4.14'){
        exclude group: 'commons-io', module: 'commons-io'
    }
    compile('com.octo.android.robospice:robospice-retrofit:1.4.14'){
        exclude group: 'commons-io', module: 'commons-io'
    }
    compile 'com.squareup.retrofit:retrofit:1.6.1'
    compile 'com.google.code.gson:gson:2.3'
    compile 'com.viewpagerindicator:library:2.4.1@aar'
    compile 'com.squareup.picasso:picasso:2.3.3'
    compile 'com.squareup.okhttp:okhttp:2.0.0'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'

    compile 'com.etsy.android.grid:library:1.0.5'
    compile 'com.squareup:otto:1.3.4'
    compile 'com.darwinsys:hirondelle-date4j:1.5.1'
    compile 'com.github.chrisbanes.photoview:library:1.2.3'
    compile 'me.grantland:autofittextview:0.2.0'
    compile 'it.sephiroth.android.library.horizontallistview:library:1.2.1'
    compile 'org.ocpsoft.prettytime:prettytime:3.2.4.Final'
    compile 'com.google.guava:guava:18.0'
    compile 'com.github.castorflex.smoothprogressbar:library:0.5.2'
    compile 'com.makeramen:roundedimageview:1.3.0'
    compile 'org.lucasr.twowayview:twowayview:0.1.1'
    compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'

    compile project(':libs:LoopingViewPager')
    compile project(':libs:PhotoView-2.2.1')
    compile files('libs/localytics.jar')
    compile files('libs/android-support-multidex.jar')

    compile 'net.hockeyapp.android:HockeySDK:3.0.2'
}

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()
    }
}

Update. My multidex.keep file:

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
com/playday/app/models/notification/Badge.class
com/playday/app/models/User.class
com/playday/app/core/AppWrapper.class
com/playday/app/core/App.class

解决方案

Your AppWrapper class fails to load because the retrofit.ErrorHandler interface is not included in main dex file.

How do you calculate which classes to put in your main-dex-list file?
There's a script that can generate it for you. I wrote a blogpost that shows how to use it.

Update (10/31/2014):
Gradle plugin v0.14.0 now does it automatically. See my answer here.

这篇关于MultiDex NoClassDefFound错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆