Twitter Fabric + MultiDex导致NoClassDefFoundError

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

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

这是我得到的例外。

 java.lang.NoClassDefFoundError: com.twitter.sdk.android.core.TwitterAuthConfig$1 at com.twitter.sdk.android.core.TwitterAuthConfig.(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. } 

即使我也试过这个解决方案,但没有帮助。

任何提示或参考赞赏。

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

Android 5.0及更高版本使用称为ART的运行时,它本身支持从应用程序APK文件加载多个dex文件。 ART在应用程序安装时执行预编译,扫描类(.. N).dex文件并将它们编译为单个.oat文件,以供Android设备执行。 有关Android 5.0运行时的更多信息,请参阅ART简介。

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

Android 5.0之前的Multidex支持

Android 5.0之前的平台版本使用Dalvik运行时来执行应用程序代码。 默认情况下,Dalvik将应用程序限制为每个APK的单个classes.dex字节码文件。 为了解决这个限制,您可以使用multidex支持库,它将成为应用程序主要DEX文件的一部分,然后管理对其他DEX文件及其包含的代码的访问。

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

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

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

 < ?xml version="1.0" encoding="utf-8"?>   ...   

替代方案,如果您的应用程序扩展了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 } 

我希望它会帮助你。

我通过手动设置fabric gradle插件版本来降低版本’1.21.6’来解决这个问题。 可能最新的一个有问题,在我的情况下是’1.23.0’。 ( Fabric插件版本历史 )

所以我订了

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

代替

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