Android:应用程序在Lollipop运行时加载库,但不是IceCreamSandwich

我目前正在使用Android Studio开发Android应用程序。 目前,该应用程序正在棒棒糖设备上完美启动,但由于前棒棒糖设备上的ClassNotFoundException (我已经在ICS上testing过,它失败)在启动时崩溃。

缺失的类总是在运行时从外部的库。

这是gradle文件:

  buildscript { repositories { maven { url 'https://maven.fabric.io/public' } } dependencies { classpath 'io.fabric.tools:gradle:1.+' } } apply plugin: 'com.android.application' apply plugin: 'io.fabric' android { compileSdkVersion 23 buildToolsVersion '23.0.0' defaultConfig { applicationId 'com.kappsports.kapp10' minSdkVersion 18 targetSdkVersion 23 versionCode 1 versionName '1.0.0' multiDexEnabled true } buildTypes { release { minifyEnabled false shrinkResources true } } lintOptions { abortOnError false } dexOptions { incremental true javaMaxHeapSize '4g' } } repositories { mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } maven { url 'https://maven.fabric.io/public' } jcenter() } dependencies { compile fileTree(dir: 'libs', exclude: 'android-support-v4.jar', include: '*.jar') compile('com.crashlytics.sdk.android:crashlytics:2.5.1@aar') { transitive = true; } compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT' compile 'com.github.johnpersano:supertoasts:1.3.4@aar' compile 'com.google.code.gson:gson:2.3' compile 'com.squareup:otto:1.3.5' compile 'com.makeramen:roundedimageview:1.3.0' compile 'com.jakewharton:butterknife:6.0.0' compile 'com.malinskiy:superrecyclerview:1.0.0' compile 'com.android.support:multidex:1.0.1' compile 'com.jpardogo.materialtabstrip:library:1.0.9' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3' compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'org.buraktamturk:loadingview:1.0.0@aar' compile 'com.facebook.android:facebook-android-sdk:4.1.0' compile 'com.github.navasmdc:MaterialDesign:1.5@aar' compile 'net.danlew:android.joda:2.8.2' //noinspection GradleCompatible compile 'com.android.support:appcompat-v7:22.2.1' compile 'com.google.android.gms:play-services:7.5.0' //noinspection GradleCompatible compile 'com.android.support:recyclerview-v7:22.2.1' } 

这是一个logcat输出的一大块:

 > 09-06 23:25:58.414 27436-27436/? W/dalvikvm﹕ Link of class > 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414 > 27436-27436/? E/dalvikvm﹕ Could not find class > 'io.fabric.sdk.android.InitializationTask', referenced from method > io.fabric.sdk.android.Kit.<init> 09-06 23:25:58.414 27436-27436/? > W/dalvikvm﹕ VFY: unable to resolve new-instance 8228 > (Lio/fabric/sdk/android/InitializationTask;) in > Lio/fabric/sdk/android/Kit; 09-06 23:25:58.414 27436-27436/? > D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x0003 09-06 23:25:58.414 > 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of > Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 > 27436-27436/? W/dalvikvm﹕ Link of class > 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414 > 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of > Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 > 27436-27436/? W/dalvikvm﹕ Link of class > 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414 > 27436-27436/? I/dalvikvm﹕ Could not find method > io.fabric.sdk.android.InitializationTask.getDependencies, referenced > from method io.fabric.sdk.android.Kit.getDependencies 09-06 > 23:25:58.414 27436-27436/? W/dalvikvm﹕ VFY: unable to resolve virtual > method 57413: > Lio/fabric/sdk/android/InitializationTask;.getDependencies > ()Ljava/util/Collection; 09-06 23:25:58.414 27436-27436/? D/dalvikvm﹕ > VFY: replacing opcode 0x6e at 0x0002 09-06 23:25:58.414 27436-27436/? > W/dalvikvm﹕ VFY: unable to find class referenced in signature > (Lio/fabric/sdk/android/services/common/IdManager;) 09-06 23:25:58.414 > 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of > Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 > 27436-27436/? W/dalvikvm﹕ Link of class > 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414 > 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of > Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 > 27436-27436/? W/dalvikvm﹕ Link of class > 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414 > 27436-27436/? I/dalvikvm﹕ Could not find method > io.fabric.sdk.android.InitializationTask.executeOnExecutor, referenced > from method io.fabric.sdk.android.Kit.initialize 09-06 23:25:58.414 > 27436-27436/? W/dalvikvm﹕ VFY: unable to resolve virtual method 57412: > Lio/fabric/sdk/android/InitializationTask;.executeOnExecutor > (Ljava/util/concurrent/ExecutorService;[Ljava/lang/Object;)V 09-06 > 23:25:58.414 27436-27436/? D/dalvikvm﹕ VFY: replacing opcode 0x6e at > 0x0011 09-06 23:25:58.414 27436-27436/? W/dalvikvm﹕ VFY: unable to > find class referenced in signature > (Lio/fabric/sdk/android/services/common/IdManager;) 09-06 23:25:58.419 > 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of > Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.419 > 27436-27436/? W/dalvikvm﹕ Link of class > 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.419 > 27436-27436/? D/dalvikvm﹕ DexOpt: unable to opt direct call 0xe03e at > 0x05 in Lio/fabric/sdk/android/Kit;.<init> 09-06 23:25:58.419 > 27436-27436/? D/AndroidRuntime﹕ Shutting down VM 09-06 23:25:58.419 > 27436-27436/? W/dalvikvm﹕ threadid=1: thread exiting with uncaught > exception (group=0x41bfb700) 09-06 23:25:58.419 27436-27436/? > E/AndroidRuntime﹕ FATAL EXCEPTION: main > java.lang.NoClassDefFoundError: io.fabric.sdk.android.services.common.ExecutorUtils > at com.crashlytics.android.core.CrashlyticsCore.<init>(CrashlyticsCore.java:205) > at com.crashlytics.android.core.CrashlyticsCore$Builder.build(CrashlyticsCore.java:189) > at com.kappsports.kapp10.Kapp10Application.onCreate(Kapp10Application.java:53) > at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024) > at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4684) > at android.app.ActivityThread.access$1400(ActivityThread.java:159) > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376) > at android.os.Handler.dispatchMessage(Handler.java:99) > at android.os.Looper.loop(Looper.java:176) > at android.app.ActivityThread.main(ActivityThread.java:5419) > at java.lang.reflect.Method.invokeNative(Native Method) > at java.lang.reflect.Method.invoke(Method.java:525) > at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) > at dalvik.system.NativeStart.main(Native Method) 09-06 23:25:58.424 2346-2891/? I/ActivityManager﹕ Notify an > ApplicationCrash 

现在我目前已经解决不了。 任何线索,将不胜感激。

感谢和问候。

Solutions Collecting From Web of "Android:应用程序在Lollipop运行时加载库,但不是IceCreamSandwich"

1)将multidex支持添加到您的应用程序:

 compile 'com.android.support:multidex:1.0.1' 

2)将您的应用程序设置为MultiDexApplication 。 select下列选项之一:

这是Android的MultiDexApplication类的源代码:

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

选项1)您可以从MultiDexApplication扩展您的自定义应用程序:

 public class MyApplication extends MultiDexApplication { // Your application implementation here } 

选项2)您可以从默认Application类扩展自定义应用Application ,然后您需要在attachBaseContext(Context base)方法中调用MultiDex.install

 public class MyApplication extends Application { protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } // Your application implementation here } 

选项3)如果您没有任何自定义应用程序,并且您不需要,只需将您的应用程序名称(在AndroidManifest.xml中)设置为MultiDexApplication:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.multidex.myapplication"> <application ... android:name="android.support.multidex.MultiDexApplication"> ... </application> </manifest> 

注意:如果您正在使用自定义应用程序类(请参阅Option1和Option2),则application标记的android:name必须已经设置为您的自定义应用程序类。

3)multiDexEnabled true设置添加到您的build.gradle文件中:

 defaultConfig { // Other settings here multiDexEnabled true } 

更多信息。

我忘了在我的自定义应用程序类的onCreate()方法的超级调用后面添加这行:

  MultiDex.install(getBaseContext()); 

感谢凯恩的解决scheme!

在一些低端设备上添加MultiDex.install(getBaseContext()); 到MyApplication的onCreate()没有工作? 导致java.lang.NoClassDefFoundError

什么工作是添加MultiDex.install(getBaseContext()); 到MyApplication attachBaseContext(Context base)

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

您可以将其添加到清单文件的应用程序标记中。

 android:name="android.support.multidex.MultiDexApplication"