15

Aktualnie pracuję nad aplikacją na Androida przy użyciu Android Studio. Obecnie aplikacja działa idealnie na urządzeniach Lollipop, ale zawiesza się przy uruchomieniu z powodu urządzenia ClassNotFoundException na urządzeniach pre-Lollipop (testowałem na ICS i nie udało się).Android: biblioteka ładowania aplikacji w czasie wykonywania na Lollipop, ale nie IceCreamSandwich

Brakująca klasa zawsze pochodzi z zewnętrznych bibliotek w czasie wykonywania.

Oto plik 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' 

} 

Oto Shunk wyjścia 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 

Jestem obecnie z roztworu do teraz. Wszelkie wskazówki na ten temat zostaną docenione.

Dzięki, Pozdrawiam.

+2

Dodaj wyjście wyjątku do pytania. – Breavyn

+1

Katastrofa jest prawie na pewno spowodowana użyciem wielościeżkowej aplikacji. Bez względu na to, która klasa nie zostanie znaleziona, najprawdopodobniej dostęp uzyskuje się przed wywołaniem w aplikacji aplikacji connectBaseContext i załadowaniem drugorzędnych dexes. Czy podążasz za przykładem wielościeżkowym i upewniasz się, że jest on inicjowany w twojej klasie aplikacji? –

+0

Opublikuj logcat za pomocą classnotdeffoundexception –

Odpowiedz

23

1) Dodaj multidex wsparcie dla aplikacji:

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

2) ustawić swoją aplikację jako MultiDexApplication. Wybierz jedną z poniższych opcji:

Jest to kod źródłowy Androida za MultiDexApplication klasy:

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

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

Opcja 1) Można rozszerzyć swoją aplikację niestandardową z MultiDexApplication:

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

Opcja 2) Możesz rozszerzyć niestandardową aplikację z domyślnej klasy Application, następnie musisz zadzwonić pod numer MultiDex.install w attachBaseContext(Context base) metody:

public class MyApplication extends Application { 

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

    // Your application implementation here 
} 

Opcja 3) Jeśli nie mają żadnego zastosowania niestandardowego i nie chcesz w ogóle, po prostu ustawić swoją nazwę aplikacji (w AndroidManifest.xml) do 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> 

Uwaga: Jeśli używasz niestandardowej klasy aplikacji (patrz Opcja 1 i Opcja 2), application tagu android:name musi już być ustawiony na swojej klasie niestandardowych aplikacji.

3) Dodaj multiDexEnabled true ustawienia do pliku build.gradle:

defaultConfig { 
    // Other settings here 
    multiDexEnabled true 
} 

More information.

+0

Co jeśli nie używam klasy aplikacji? –

+0

@HeenaArora stosuje trzecią opcję: "Jeśli nie masz żadnych niestandardowych aplikacji i nie chcesz żadnych, po prostu ustaw nazwę aplikacji (w AndroidManifest.xml) na MultiDexApplication:" – Devrim

22

zapomniałem dodać ten wiersz tuż po super rozmowy w onCreate() metoda mojego niestandardowej klasy aplikacji:

MultiDex.install(getBaseContext()); 

Thanks Kane za rozwiązanie!

4

Na niektórych urządzeniach z niższej półki dodanie MultiDex.install(getBaseContext()); do MyApplication onCreate() nie działa? powodując java.lang.NoClassDefFoundError:

Co zrobił praca została dodając MultiDex.install(getBaseContext()); do MyApplication attachBaseContext(Context base)

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

Możesz dodać ten tag w aplikacji w pliku manifestu.

android:name="android.support.multidex.MultiDexApplication" 
Powiązane problemy