RxJava noClassDefFoundError:API 16上的rx.plugins.RxJavaPlugins [英] RxJava noClassDefFoundError: rx.plugins.RxJavaPlugins on API 16

查看:66
本文介绍了RxJava noClassDefFoundError:API 16上的rx.plugins.RxJavaPlugins的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am developing an Android application using RxJava and Retofit. When I test my code on API 23 I get no errors however when I test in API 15, my RxJava doesnt appear to work properly and my app crashes with error:

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版本:

Here is my gradle build:

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登录时会崩溃吗?

Any idea why there is no issue on API 23, but when I run it on API 16 it crashes when I try to login which uses RxJava?

推荐答案

这里的问题可能是您尚未初始化MultiDex Option

The problem here is may be you have not initialized 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 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. This is the reason why your app is working fine on API level 21.

Android 5.0之前的Multidex支持

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

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.0'
}

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

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
        ...
        // This will solved the problem
        android:name="YourAppName">
        ...
    </application>
</manifest>

这是我解决问题的方式,即使与此同时存在封闭的Git问题.

编辑

public class YouAppName extends MultiDexApplication {
    ..  ..
}

我希望它能对您有所帮助.

I hope it will help you out.

这篇关于RxJava noClassDefFoundError:API 16上的rx.plugins.RxJavaPlugins的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆