android – Twitter Fabric MultiDex导致NoClassDefFoundError

我在我的项目中启用了Multidex支持,它在 Android 5.0及更高版本上运行良好,但是当我开始使用Android 4.3及以下版本开始测试我的应用程序时,它开始为TwitterConfig提供NoClassDefFoundError.

我无法禁用我的Multidex支持.我不知道为什么我会遇到这个问题.试图在网上找到解决方案,但没有帮助.

这是我得到的例外.

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)

这是我的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;
    }
}

这是MyApplication类中的Twitter代码.

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

}

即使我尝试了this解决方案,但没有帮助.

任何提示或参考赞赏.

解决方法

适用于Android 5.0及更高版本的Multidex支持

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.

这意味着您的应用程序可以在API级别21或更高级别上正常运行.

Android 5.0之前的Multidex支持

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.

所以,首先要确保你已经导入了正确的依赖,这似乎你做到了.

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

在清单中,将Multidex支持库中的MultiDexApplication类添加到application元素中.

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

替代方案,如果您的应用程序扩展了Application类,您可以覆盖attachBaseContext()方法调用MultiDex.install(this)来启用multidex.

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

最后,您需要通过添加multiDexEnabled true来更新build.gradle文件,如下所示:

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

我希望它会帮助你.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...