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比较,很容易找到对应的解决方式,以上的处理方式任选其一便可。
资源参考:
rxjava-noclassdeffounderror : https://stackoverflow.com/questions/37619596/rxjava-noclassdeffounderror-rx-plugins-rxjavaplugins-on-api-16。
Configure Apps with Over 64K Methods:https://developer.android.google.cn/studio/build/multidex.html