6

Ich habe Multidex Unterstützung in meinem Projekt und es funktionierte gut auf Android 5.0 und höher, aber wenn ich begann, meine App mit Android 4.3 und darunter zu testen, geben Sie mir NoClassDefFoundError für TwitterConfig.Twitter Fabric + MultiDex verursacht NoClassDefFoundError

Ich kann meine Multidex Unterstützung nicht deaktivieren. Ich verstehe nicht, warum ich dieses Problem bekomme. Versucht, die Lösung im Netz zu finden, hat aber nicht geholfen.

Hier ist eine Ausnahme, die ich bekomme.

java.lang.NoClassDefFoundError: com.twitter.sdk.android.core.TwitterAuthConfig$1 
     at com.twitter.sdk.android.core.TwitterAuthConfig.<clinit>(TwitterAuthConfig.java:39) 
     at MyApplication.onCreate(MyApplication.java:46) 
     at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024) 
     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4702) 
     at android.app.ActivityThread.access$1400(ActivityThread.java:168) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1389) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:5493) 
     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:1209) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025) 
     at dalvik.system.NativeStart.main(Native Method) 

Hier ist meine app.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' 

    repositories { 
    maven { url 'https://maven.fabric.io/public' } 
    mavenCentral() 

    } 

    android { 
    packagingOptions { 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/LICENSE.txt' 
    } 
    compileSdkVersion 22 
    buildToolsVersion "23.0.0 rc3" 

    defaultConfig {    
     minSdkVersion 16 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    dexOptions { 
     javaMaxHeapSize "2g" 
    } 

} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.2.1'  
    compile 'com.android.support:multidex:1.0.1' 
    compile 'com.android.support:design:22.2.1' 
    compile 'com.android.support:recyclerview-v7:22.2.1' 
    compile 'com.android.support:cardview-v7:22.2.1' 
    compile 'com.android.support:support-v4:22.2.1' 
    compile project(':MPChartLib') 
    compile 'com.facebook.android:facebook-android-sdk:4.6.0' 
    compile('com.crashlytics.sdk.android:crashlytics:[email protected]') { 
     transitive = true; 
    } 
    compile('com.twitter.sdk.android:twitter:[email protected]') { 
     transitive = true; 
    } 
} 

Hier mein Twitter-Code in MyApplication Klasse.

@Override 
public void onCreate() { 
    super.onCreate(); 

    //Configure twitter using Twitter key and Secret Key 
    TwitterAuthConfig authConfig = 
      new TwitterAuthConfig(TWITTER_KEY, 
        TWITTER_SECRET); 

    // add functionalities which we are using with Fabric 
    Fabric.with(this, new Crashlytics(), new Twitter(authConfig)); 

    FacebookSdk.sdkInitialize(getApplicationContext()); 
    // Initialize the SDK before executing any other operations, 
    // especially, if you're using Facebook UI elements. 

} 

Auch ich versuchte this Lösung auch, aber nicht geholfen.

Jeder Hinweis oder Referenz geschätzt.

Antwort

14

Multidex Unterstützung für Android 5.0 und höher

Android 5.0 und höher verwendet eine Laufzeit ART genannt, die nativ unterstützt mehr dex-Dateien aus der Anwendung APK-Dateien geladen werden. ART führt vor der Kompilierung zur Anwendungsinstallationszeit durch, die nach Klassen (.. N) .dex-Dateien sucht und sie in eine einzige .oat-Datei für die Ausführung durch das Android-Gerät kompiliert. Weitere Informationen zur Android-Laufzeitumgebung 5.0 finden Sie unter Einführung in ART.

Das bedeutet, dass Ihre App auf API-Ebene 21 oder höher funktioniert.

Multidex Träger vor 5,0

Versionen der Plattform auf Android vor Android 5.0 die Laufzeit Dalvik verwenden für App-Code ausgeführt wird. Standardmäßig beschränkt Dalvik Apps auf eine einzelne classes.dex Bytecode-Datei pro APK. Um diese Einschränkung zu umgehen, können Sie die Multidex-Support-Bibliothek verwenden, die Teil der primären DEX-Datei Ihrer App wird und verwaltet dann Zugriff auf die zusätzlichen DEX-Dateien und den Code enthalten.

Also, zuerst stellen Sie sicher, dass Sie korrekte Abhängigkeit importiert haben, die es scheint, dass Sie es getan haben.

dependencies { 
    compile 'com.android.support:multidex:1.0.1' 
} 

In Ihrem Manifest die MultiDexApplication Klasse aus der multidex Support-Bibliothek zur Anwendung Elemente hinzufügen.

<?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> 

Alternative zu, dass, wenn Ihre App die Application-Klasse erweitert, können Sie die attachBaseContext() Methode überschreiben und MultiDex.install(this) zu ermöglichen nennen.

public void onCreate(Bundle arguments) { 
    MultiDex.install(getTargetContext()); 
    super.onCreate(arguments); 
    ... 
} 

Schließlich müssen Sie Ihre build.gradle Datei wie unten aktualisieren, indem multiDexEnabled true Zugabe:

defaultConfig { 
     applicationId '{Project Name}' 
     minSdkVersion 15 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 

Ich hoffe, es wird Ihnen helfen.

+0

Dank @Bhavesh: Wird diese Lösung versuchen, aber ich habe nicht Sie Hinzufügen MultiDexApplication in Manifest verweisen. Kannst du es bitte etwas ausarbeiten? Danke noch einmal. –

+0

Wenn Ihre Anwendung über eine Klasse verfügt, die die Anwendungsklasse erweitert, können Sie dies einfach ignorieren, indem Sie dies in der Datei menifest einstellen. Nun, wenn Sie keine Anwendung Klasse haben, dann können Sie ihre Unterstützung direkt von Menifest-Datei aktivieren So, seine Art von Zwei alternative Möglichkeiten können Sie die Unterstützung von MultiDex aktivieren –

+1

Shouldnt die MultiDex.install (getTargetContext()); Sei nach dem super() Aufruf onCreate? – Jalpesh

0

Ich habe das Problem gelöst, indem ich die Fabric-Gradle-Plugin-Version manuell auf die niedrigere Version '1.21.6' gesetzt habe. Wahrscheinlich gab es ein Problem mit dem letzten, das in meinem Fall '1.23.0' war. (Fabric plugin version history)

So stelle ich

dependencies { 
     classpath 'io.fabric.tools:gradle:1.21.6' 
    } 

statt

dependencies { 
     classpath 'io.fabric.tools:gradle:1.+' 
    }