gradle配置:
android {
...
defaultConfig {
...
//支持multidex
multiDexEnabled true
}
...
// 保证其他的lib没有被preDex
dexOptions {
preDexLibraries = false
}
}
dependencies {
...
//支持multidex
implementation 'com.android.support:multidex:1.0.3'
}
代码配置:
第一种,Application直接继承MultiDexApplication(针对没有Application父类的)
public class GlobalApplication extends MultiDexApplication {
...
}
第二种,重写attachBaseContext(针对已有Application父类的)
public class MyApplication extends GlobalApplication {
...
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
//支持multidex
MultiDex.install(this);
}
}
使用MultiDex的最低版本要求是:
compileSdkVersion 21
buildToolsVersion "21.1.0"
可能遇到的问题:NoClassDefFoundError
有些类没有直接引用而并没有打包到dex当中导致classes not found出错,这是在开启multiDex时,多个dex文件中的类是被gradle脚本分配的,而且app在启动时,首先加载的是MainDex。
Android SDK Build Tools 21.1 或者更高版本中的 Gradle Android 插件有对 multidex 的支持。这个插件使用 Proguard 来分析你的项目并在
[buildDir]/intermediates/multi-dex/[buildType]/maindexlist.txt
文件中生成一个 app 启动 classes 的列表。但是这个列表并不是100%准确,可能会丢失一些app启动所需的 classes 。
有时候我们需要设定某些类被放到MainDex中避免NoClassDefFoundError错误, 在build.gradle中开启multiDex,并指定配置文件:
android {
...
defaultConfig {
...
//支持multidex
multiDexEnabled true
multiDexKeepProguard file('multiDexKeep.pro') // keep specific classes using proguard syntax
multiDexKeepFile file('multiDexKeep.txt') // keep specific classes
}
}
注意multiDexKeep.pro和multiDexKeep.txt文件需要自己创建,放在项目的app文件夹下
配置multiDexKeep.pro文件(语法和proguard-rules.pro一样,作用也是混淆相关)
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
配置multiDexKeep.txt文件,指定类即可,这个是保留在MainDex里的类
android/support/design/widget/BaseTransientBottomBar$Behavior.class
android/support/v7/widget/RecyclerView$6.class
android/support/v4/app/FrameMetricsAggregator$MetricType.class
com/transitionseverywhere/Slide$GravityFlag.class
android/support/v7/view/menu/CascadingMenuPopup$3.class
android/support/annotation/VisibleForTesting.class
android/support/v4/media/session/MediaSessionCompatApi21.class
android/support/v4/view/ViewCompat$ViewCompatApi26Impl.class
android/support/v4/view/ViewCompat$ScrollAxis.class
android/support/v4/view/ViewCompat$ViewCompatApi19Impl.class
com/bumptech/glide/annotation/GlideType.class
还有一种方法是将multiDexKeep.txt放到项目的根目录下,在根目录的gradle中添加配置:
// 保证multidex-keep文件中指定的文件都加载到Main Dex中
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--multi-dex'
dx.additionalParameters += "--main-dex-list=$projectDir/multidex-keep.txt".toString()
}
}