Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Twitter Fabric +MultiDex causes NoClassDefFoundError

I have enable Multidex support in my project and it was working fine on Android 5.0 and above, But when I started testing my app with Android 4.3 and below it start giving me NoClassDefFoundError for TwitterConfig.

I can't disable my Multidex support. I am not getting why I am getting this issue. Tried to find out solution on net but didn't help.

Here is Exception which I am getting.

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)

Here is my 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:2.5.2@aar') {
        transitive = true;
    }
    compile('com.twitter.sdk.android:twitter:1.8.0@aar') {
        transitive = true;
    }
}

Here is my Twitter Code in MyApplication class.

@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.

}

Even i tried this solution too but didn't help.

Any hint or reference appreciated.

like image 621
Sandip Armal Patil Avatar asked Oct 01 '15 06:10

Sandip Armal Patil


1 Answers

Multidex support for Android 5.0 and higher

Android 5.0 and higher uses a runtime called ART which natively supports loading multiple dex files from application APK files. ART performs pre-compilation at application install time which scans for classes(..N).dex files and compiles them into a single .oat file for execution by the Android device. For more information on the Android 5.0 runtime, see Introducing ART.

That means your app would working fine on API level 21 or above.

Multidex support prior to Android 5.0

Versions of the platform prior to Android 5.0 use the Dalvik runtime for executing app code. By default, Dalvik limits apps to a single classes.dex bytecode file per APK. In order to get around this limitation, you can use the multidex support library, which becomes part of the primary DEX file of your app and then manages access to the additional DEX files and the code they contain.

So, Firstly making sure you have imported correct dependency, which It seems you did it.

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

In your manifest add the MultiDexApplication class from the multidex support library to the application element.

<?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 to that, If your app extends the Application class, you can override the attachBaseContext() method and call MultiDex.install(this) to enable multidex.

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

Finally, you will need to update your build.gradle file as below by adding multiDexEnabled true :

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

I hope it will help you out.

like image 109
Bhavesh Patadiya Avatar answered Oct 16 '22 05:10

Bhavesh Patadiya