API 16上的RxJava noClassDefFoundError:rx.plugins.RxJavaPlugins

时间:2016-06-03 16:44:07

标签: java android

我正在使用RxJava和Retofit开发Android应用程序。当我在API 23上测试我的代码时,我没有错误,但是当我在API 15中测试时,我的RxJava似乎无法正常工作,我的应用程序崩溃并出现错误:

FATAL EXCEPTION: main
java.lang.ExceptionInInitializerError
at $Proxy1.createToken(Native Method)
at com.loginsignup.presenter.LoginPresenterImpl.tryToLogin(LoginPresenterImpl.java:39)
at com.loginsignup.view.LoginActivity.tryToLogin(LoginActivity.java:197)
at com.loginsignup.view.LoginActivity.onClick(LoginActivity.java:180)
at android.view.View.performClick(View.java:4084)
at android.view.View$PerformClick.run(View.java:16966)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoClassDefFoundError: rx.plugins.RxJavaPlugins
at rx.Observable.<clinit>(Observable.java:63)
at $Proxy1.createToken(Native Method) 
at com.gooroo.gooroo.loginsignup.presenter.LoginPresenterImpl.tryToLogin(LoginPresenterImpl.java:39) 
at com.gooroo.gooroo.loginsignup.view.LoginActivity.tryToLogin(LoginActivity.java:197) 
at com.gooroo.gooroo.loginsignup.view.LoginActivity.onClick(LoginActivity.java:180) 
at android.view.View.performClick(View.java:4084) 
at android.view.View$PerformClick.run(View.java:16966) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4745) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
at dalvik.system.NativeStart.main(Native Method)

这是我的gradle构建:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.ex"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "0.1 alpha"
        multiDexEnabled true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    dexOptions {
        javaMaxHeapSize "4g"
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
    compile files('libs/sinch-android-rtc-3.9.5.jar')
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
    compile 'com.android.support:support-v4:23.4.0'
    compile 'com.android.support:cardview-v7:23.4.0'
    compile 'com.google.android.gms:play-services-maps:8.4.0'
    compile 'com.google.android.gms:play-services-location:8.4.0'
    compile 'com.google.code.gson:gson:2.6.2'
    compile 'com.google.android.gms:play-services-analytics:8.4.0'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.squareup.okhttp3:okhttp-urlconnection:3.2.0'
    compile 'com.squareup.okhttp3:okhttp:3.2.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
    compile 'com.squareup.retrofit2:retrofit:2.0.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
    compile 'com.github.orhanobut:logger:1.12'
    compile 'com.viewpagerindicator:library:2.4.1@aar'
    compile 'io.reactivex:rxandroid:1.2.0'
    compile 'io.reactivex:rxjava:1.1.5'
    compile 'com.facebook.android:facebook-android-sdk:4.+'
    compile 'com.stripe:stripe-android:+'
    compile 'com.google.android.gms:play-services-gcm:8.4.0'
    compile 'com.timehop.stickyheadersrecyclerview:library:0.4.3@aar'
    compile 'com.amazonaws:aws-android-sdk-core:2.+'
    compile 'com.amazonaws:aws-android-sdk-s3:2.+'
    compile 'com.google.android.gms:play-services-wallet:8.4.0'
    compile 'com.android.support:multidex:1.0.0'
}

apply plugin: 'com.google.gms.google-services'

知道为什么API 23上没有问题,但是当我在API 16上运行它时,当我尝试登录使用RxJava时它会崩溃吗?

2 个答案:

答案 0 :(得分:21)

这里的问题可能是你没有初始化MultiDex Option

针对Android 5.0及更高版本的Multidex支持

  

Android 5.0及更高版本本身使用名为ART的运行时   支持从应用程序APK文件加载多个dex文件。艺术   在扫描的应用程序安装时执行预编译   classes(.. 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.0'
}

在清单中,将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
        ...
        // This will solved the problem
        android:name="YourAppName">
        ...
    </application>
</manifest>

这就是我解决问题的方法,即使Git问题也是如此。

修改

public class YouAppName extends MultiDexApplication {
    ..  ..
}

我希望它会帮助你。

答案 1 :(得分:0)

感谢bikash,他的顶级解决方案确实有效。在我的程序中,我的Application类扩展了另一个***应用程序。我最终通过将我的应用程序类中的attachBaseContext(Context base)函数覆盖到初始MultiDex来解决这个问题。总之,我喜欢这样:

STUVWXY
ABCDEFG
IJKLMNO

您可以从this page

获取更多信息