15

Ich entwickle derzeit eine Android-App mit Android Studio. Derzeit startet die App perfekt auf Lollipop-Geräten, stürzt aber beim Start aufgrund eines ClassNotFoundException auf Pre-Lollipop-Geräten (ich habe auf ICS getestet und es scheitern).Android: App lädt Bibliothek zur Laufzeit auf Lollipop, aber nicht IceCreamsandwich

Die fehlende Klasse stammt immer aus einer externen Bibliothek zur Laufzeit.

Hier ist die gradle Datei:

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' 

} 

Hier ist ein shunk von logcat Ausgabe:

> 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 

ich derzeit für jetzt aus der Lösung bin. Jeder Hinweis darauf würde geschätzt werden.

Danke, Grüße.

+2

Fügen Sie die Ausgabe der Ausnahme zu Ihrer Frage hinzu. – Breavyn

+1

Der Absturz ist fast sicher durch die Verwendung von Multidex in Ihrer Anwendung. Auf welche Klasse auch immer nicht gefunden wird, es wird höchstwahrscheinlich darauf zugegriffen, bevor attachBaseContext in Ihrer Anwendung aufgerufen wurde und die sekundären Dexes geladen wurden. Haben Sie das multidex-Beispiel verfolgt und sichergestellt, dass es in Ihrer Application-Klasse initialisiert wird? –

+0

Veröffentlichen Sie die Logcat mit der Classnotdeffoundexception –

Antwort

23

1) hinzufügen multidex Unterstützung für Ihre App: als

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

2) Stellen Sie Ihre Anwendung MultiDexApplication. Wählen Sie eine der folgenden Optionen:

Dies ist der Quellcode von MultiDexApplication Klasse android:

public class MultiDexApplication extends Application { 
    public MultiDexApplication() { 
    } 

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

Option 1) Sie können Ihre individuelle Anwendung von MultiDexApplication erweitern:

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

Option 2) Sie können Ihre benutzerdefinierte Anwendung von der Standardklasse Application erweitern, dann müssen Sieanrufenbei attachBaseContext(Context base) Methode:

public class MyApplication extends Application { 

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

    // Your application implementation here 
} 

Option 3) Wenn Sie keine benutzerdefinierte Anwendung haben und Sie jede nicht wollen, setzen Sie einfach Ihre Anwendungsnamen (bei AndroidManifest.xml) zu 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> 

Hinweis: Wenn Sie eine benutzerdefinierte Anwendungsklasse verwenden (siehe Option1 und Option2), application -Tags android:name muss bereits auf Ihre individuelle Anwendungsklasse eingestellt werden.

3)multiDexEnabled true Einstellung Ihrer build.gradle Datei hinzufügen:

defaultConfig { 
    // Other settings here 
    multiDexEnabled true 
} 

More information.

+0

Was ist, wenn ich nicht Anwendung Klasse verwende? –

+0

@HeenaArora wenden Sie die 3. Option an: "Wenn Sie keine benutzerdefinierte Anwendung haben und keine möchten, legen Sie einfach Ihren Anwendungsnamen (unter AndroidManifest.xml) auf MultiDexApplication fest:" – Devrim

22

Ich habe vergessen, diese Zeile direkt nach dem Super-Aufruf in der onCreate() -Methode meiner benutzerdefinierten Anwendung Klasse hinzuzufügen:

für die Lösung
MultiDex.install(getBaseContext()); 

Dank Kane!

4

Auf einigen Low-End-Geräten hat das Hinzufügen von MultiDex.install(getBaseContext()); zu MyApplication onCreate() nicht funktioniert? java.lang.NoClassDefFoundError verursacht:

Was Arbeit tat MultiDex.install(getBaseContext()); wurde das Hinzufügen MyApplication attachBaseContext(Context base)

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

Sie diese in Anwendungs ​​Tag der Manifest-Datei hinzufügen können.

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