MultiDex开启后RxJava noClassDefFoundError(App for multidex解决方式)

Android开发中65K问题

在项目中Gralde依赖库,方法数量超过65535时候。

通常,需要添加multidex操作,添加代码如下:

android{

   defaultConfig {
    // dex突破65535的限制
        multiDexEnabled true
   }     
}

当添加完该代码后,AndroidStudio再次运行项目,结果在输出台报错:RxJava noClassDefFoundError

设备 红米note1 系统版本 4.4

RxJava noClassDefFoundError

这下就奇怪了,怎么还不行呢。赶紧Google一波,搜索multidex。立马找到Android官网上的Multidex资料


熟读Configure your app for multidex

为项目添加Multidex配置, 取决于项目的minSdkVersion。

  • 当项目minSdkVersion>=21的情况

    只需要在项目Module的build.gradle中 , 添加multiDexEnabled tru代码。

    android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 26
        multiDexEnabled true
    }
    ...
    }
  • 当项目minSdkVersion<=20的情况

    除了,添加以上multiDexEnabled tru的代码外,还需要使用multidex support library

    在项目的Module的build.gralde开启multidex和添加multidex依赖包

    android {
      defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 26
        multiDexEnabled true
      }
      ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }

    接下的步骤,可以根据项目实际情况任选一

    • 情况一: 项目中没有定义Application子类,只需要在AndroidManifest.xml添加:

      
      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.myapp">
               <application
                   android:name="android.support.multidex.MultiDexApplication" >
                ...
               </application>
      </manifest>
    • 情况二:项目中定义Application子类,该子类直接继承 MultiDexApplication 的情况:

      public class MyApplication extends MultiDexApplication { 
          ... 
      }
    • 情况三:项目中定义Application子类,但是不能修改继承父类,即不继承 MultiDexApplication,需要重写attachBaseContext(),且执行MultiDex.install(this)来开启multidex。

      public class MyApplication extends SomeOtherApplication {
        @Override
        protected void attachBaseContext(Context base) {
              super.attachBaseContext(base);
                  MultiDex.install(this);
        }
      }
MultiDex注意点

在MultiDex.install()完成之前,不可以调用反射或者JNI执行MuiltiDex.install()或者其他任何代码。多线程跟踪不会跟随这些调用,会导致ClassNotFoundException或者Dex文件之间的划分坏的类而导致验证异常。


回归正题,熟读完官方的MultiDex的处理方式,查看自己的项目minSdkVersion:

defaultConfig {
        applicationId "com.zhongke.launcher"
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        // dex突破65535的限制
        multiDexEnabled true
}

通过minSdkVersion比较,很容易找到对应的解决方式,以上的处理方式任选其一便可。

资源参考
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值