15

我目前正在开发使用Android Studio的Android应用程序。目前,该应用程序在棒棒糖设备上完美启动,但由于前棒棒糖设备上的ClassNotFoundException(我已在ICS上测试过,并且失败)而在发布时崩溃。Android:应用程序在运行时加载Lollipop,但不是IceCreamSandwich

缺少的类始终是在运行时从外部库管理程序。

这里的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:[email protected]') { 
     transitive = true; 
    } 
    compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT' 
    compile 'com.github.johnpersano:supertoasts:[email protected]' 
    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:[email protected]' 
    compile 'com.facebook.android:facebook-android-sdk:4.1.0' 
    compile 'com.github.navasmdc:MaterialDesign:[email protected]' 
    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的输出的shunk:

> 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 

目前我出的解决方案了。任何线索,将不胜感激。

谢谢, 关心。

+2

将异常的输出添加到您的问题。 – Breavyn

+1

崩溃几乎肯定是由于在您的应用程序中使用了multidex。无论找到什么类,最有可能在您的应用程序中调用attachBaseContext之前访问并且加载了二级索引。您是否遵循multidex示例并确保它在您的Application类中被初始化? –

+0

发布带有classnotdeffoundexception的logcat –

回答

23

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

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

2)设置你的应用程序作为MultiDexApplication。选择下列选项之一:

这是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类扩展,然后您需要拨打MultiDex.installattachBaseContext(Context base)方法:

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> 

注:如果您使用的是自定义应用程序类(请参阅选项1和选项),application标签的android:name必须已经被设置为您的自定义应用程序类。

3)添加multiDexEnabled true设置你的build.gradle文件:

defaultConfig { 
    // Other settings here 
    multiDexEnabled true 
} 

More information.

+0

如果我不使用应用程序类,该怎么办? –

+0

@HeenaArora应用第三个选项:“如果您没有任何自定义应用程序,并且您不需要任何应用程序,只需将您的应用程序名称(在AndroidManifest.xml中)设置为MultiDexApplication:” – Devrim

22

我忘了在OnCreate()的super调用我的自定义应用程序类的方法后立即加入这行:

MultiDex.install(getBaseContext()); 

感谢凯恩的解决方案!

4

在某些低端设备上添加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); 
    } 
... 
0

您可以在清单文件中的应用标签添加此。

android:name="android.support.multidex.MultiDexApplication" 
相关问题