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" 
相關問題