Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多索引NoClassDefFound错误_Java_Android - Fatal编程技术网

Java 多索引NoClassDefFound错误

Java 多索引NoClassDefFound错误,java,android,Java,Android,我已将我的应用程序转换为多索引,以承受64k索引限制。现在看起来是这样的: public class App extends MultiDexApplication { private AppWrapper instance; @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(base); } @Override

我已将我的应用程序转换为多索引,以承受64k索引限制。现在看起来是这样的:

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);
    }
}
}
我将所有常用的逻辑从App拉到
AppWidget
,以使
MultiDex
工作。在其他队友的电脑上也能正常工作。但对我来说不是。它在创建应用程序时不断抛出
java.lang.NoClassDefFoundError

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)    
我有相同的Android Studio,gradle,sdk,jdk版本,相同的代码。我甚至尝试格式化硬盘并重新安装操作系统,以确保环境相同。这个奇怪问题的原因是什么

这是我的
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()
    }
}
更新。我的
multidex.keep
文件:

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
您的AppWrapper类无法加载,因为主dex文件中不包含Reformation.ErrorHandler接口

如何计算将哪些类放入主索引列表文件中?
有一种方法可以为您生成它。我写了一篇文章,展示了如何使用它

更新(2014年10月31日)
Gradle插件v0.14.0现在可以自动完成。看看我的答案

更新(2017年4月24日)

解释了如果不能自动选择所有正确的类,如何使用gradle选项选择特定类。

我终于解决了这个问题!原因不在
onCreate()
方法中。logcat的这句话引起了我的注意:

I/dalvikvm﹕ Failed resolving     Lcom/playday/app/core/AppWrapper; interface 8940 'Lretrofit/ErrorHandler;'
W/dalvikvm﹕ Link of class     'Lcom/playday/app/core/AppWrapper;' failed
该行在所有MultiDex日志之前激发。问题的根源是改型
ErrorHandler
接口,该接口由
AppWrapper
实现

正如@AlexLipov在回答中所说,Dalvik无法找到
ErrorHandler
类,无法加载
AppWrapper


无论如何,解决方案不是通过
AppWrapper
直接实现
ErrorHandler
,而是将其拉入私有变量。

如果要扩展MultiDex应用程序,则不需要进行已经发生的MultiDex.install(context)调用(请参阅源代码链接)。如果需要使用attachBaseContext,请确保调用super.attachBaseContext(上下文)

我们刚刚更新了developers.android.com,介绍了如何使用支持库和android gradle插件,包括快速开发构建周期的开发优化


如果有人因为在棒棒糖前的设备上找不到他们的应用程序类而来到这里,但应用程序在棒棒糖上运行良好,那么这似乎是Jack和Multidex的一个已知问题

参考:


参考:

我也遇到了这种问题。我的解决方案是: 在我的build.gradle文件中,依赖项中有多个
compile'com.android.support:multidex:1.0.0'
。比如:

dependencies {    
compile 'com.android.support:multidex:1.0.0'
compile 'com.android.support:multidex:1.0.0'
// other dependencies ........
}
只需输入一个编译“com.android.support:multidex:1.0.0”,如:

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

NoClassDefFound可用于任何未加载到API早于Lollipop且启用了multidex的设备上的任意类。如果您正确设置了ProGuard,那么您就可以轻松地使用它,而不必承担多索引开销,从而使您的应用程序在发布版本中启动缓慢,尤其是在旧设备上。然而,当您在调试模式下开发应用程序时,您不希望ProGuard减慢您的速度。如果尝试在禁用ProGuard的情况下启动调试生成,您将开始出现生成错误,如
com.android.dex.DexIndexOverflowException:无法将新索引72118合并到非巨型指令中

因此,您真正想要的是仅在发布版本上启用ProGuard和禁用multidex,而在禁用ProGuard和启用multidex的情况下,调试版本应该相反。当然,您还必须挑剔,使用较少的依赖项,因为您的发布版本将受到64K限制

这需要将build.gradle设置为具有
buildTypes
configs,并仅为调试而编译multidex支持库依赖项

应用程序子类还必须设置为派生自不同的子类,具体取决于您是否处于multidex模式。这可以使用gradlemanifest合并原则来实现,方法是为调试构建定义覆盖清单,然后以不同的方式指定应用程序类

以下是相关的应用程序模块build.gradle:

android {
...
    buildTypes {
        debug {
            minifyEnabled false //Disabled Proguard
            multiDexEnabled true // Enabling multi-dex support.
        }
        release {
            minifyEnabled true //Enabled Proguard
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            multiDexEnabled false // Disable multi-dex support.
        }
    }
    dependencies {
        debugCompile 'com.android.support:multidex:1.0.1' //debugCompile makes it included only for debug builds
        ...
    }
}
如果不使用应用程序子类,则只需指定应用程序子类的名称
android.support.multidex.MultiDexApplication
,如中所述,但您只希望在调试构建时这样做

为此,必须在调试和发布变体文件夹层次结构中指定覆盖文件,如下所示:

src
    - main
        - AndroidManifest.xml
        - java/com/yourcompany/MyApplication.java (extends from BaseApplication)
    - release
        - java/com/yourcompany/BaseApplication.java (extends from Application)
    - debug
        - AndroidManifest.xml
        - java/com/yourcompany/BaseApplication.java (extends from MultiDexApplication)
是的,您可以在主模块文件夹旁边创建
debug
release
文件夹。在中添加以下文件:

debug/AndroidManifest.xml debug/java/com/yourcompany/BaseApplication.java main/java/com/yourcompany/MyApplication.java
通过这种方式,您可以在基类不同的情况下将应用程序的功能添加到
MyApplication.java

如果一切正常,但出现此错误

尝试禁用即时跑步


当我禁用它时,所有的类都被正确加载。

我尝试了很多解决方案,但没有人为我工作。最后,我发现:

    public class MyApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

这是解决我问题的唯一办法。可能有人遇到了同样的问题,这可能会有所帮助:)

在gradle中添加以下依赖项

implementation 'com.android.support:multidex:1.0.3'
在app-levelbuild.gradle中,添加如下参数

 defaultConfig {
     multiDexEnabled = true
 }
在应用程序类中,在下面的行中添加

MultiDex.install(this);

谢谢,我试试你的剧本。但是AppWrapper已经在主索引列表文件中(我将其添加到问题中)。不过,它似乎被忽略了。您的AppWrapper实现了Reformation.ErrorHandler接口,该接口也应该放在主索引中。Dalvik无法解析接口,因此无法加载AppWrapper类。@AlexLipov是的,就是这样,我绊倒了
    public class MyApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
implementation 'com.android.support:multidex:1.0.3'
 defaultConfig {
     multiDexEnabled = true
 }
MultiDex.install(this);