Twitter Fabric +MultiDex导致NoClassDefFoundError错误

7

我在我的项目中启用了Multidex支持,在Android 5.0及以上版本上运行良好,但是当我开始在Android 4.3及以下版本上测试我的应用时,它会为TwitterConfigNoClassDefFoundError错误。

我不能禁用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.

}

我甚至尝试了这个解决方案,但没有帮助。

如果有任何提示或参考资料,将不胜感激。

2个回答

14

Android 5.0及以上版本的多dex支持

Android 5.0及以上版本使用名为ART的运行时,它原生支持从应用APK文件中加载多个dex文件。在安装应用程序时,ART会执行预编译操作,扫描classes(..N).dex文件并将它们编译成一个.oat文件,供Android设备执行。有关Android 5.0运行时的更多信息,请参见Introducing ART。

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

Android 5.0之前的多dex支持

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

所以,首先确保您已经正确导入了依赖项,看起来您已经做到了。

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

在您的清单文件中,将来自multidex支持库的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>

除此之外,如果您的应用程序扩展了 Application 类,则可以覆盖 attachBaseContext() 方法并调用 MultiDex.install(this) 以启用 multidex

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

最后,您需要更新您的build.gradle文件,添加multiDexEnabled true

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

我希望它能对你有所帮助。


谢谢@Bhavesh:我会尝试这个解决方案,但我不明白您在清单中添加MultiDexApplication的意思。您能否详细说明一下?再次感谢。 - Sandip Armal Patil
当您的应用程序具有扩展Application类的任何类时,您可以简单地忽略在清单文件中设置此项。现在,如果您没有任何Application类,则可以直接从Menifest文件启用其支持。因此,这是两种可选的方式,您可以启用MultiDex的支持。 - Bhavesh Patadiya
1
在onCreate中,MultiDex.install(getTargetContext());应该放在super()调用之后吗? - Jalpesh
@Jalpesh https://developer.android.com/reference/android/support/multidex/MultiDexApplication.html - Paul Freez
有一个多dex的1.0.2版本,但使用它会导致一个问题:“在项目':app'中与依赖项'com.android.support:multidex'冲突。应用程序(1.0.2)和测试应用程序(1.0.1)的已解决版本不同。”我已经在项目中到处搜索“1.0.1”,但找不到它。有什么原因它不能工作吗? - android developer

0

我通过手动将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.+'
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接