multiDex:分包
开发的APP功能越来越多,引入的库也越来越多,很容易达到“界限”65536,因为Android中一个Dex文件最多存储65536个方法(short类型的范围)。这时候就要开启“分包”multiDex。
1、Android 5.0之后分包
Android 5.0也就是API 21之后ART虚拟机支持MultiDex。直接在build.gradle文件中直接配置multiDexEnabled true,开启分包。
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 29
multiDexEnabled true
}
...
}2、Android 1.6~5.0分包
系统只加载一个主dex,其它的dex采用MultiDex手段来加载。MultiDex支持安卓1.6 到 5.0之间的版本,低于1.6就不支持没办法了。
2.1、配置依赖
除了在build.gradle文件中添加配置:multiDexEnabled true
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 23
multiDexEnabled true
}
...
}还需要引入support依赖:MultiDex
dependencies {
...
implementation 'com.android.support:multidex:1.0.3'
}2.2、使用MultiDex
APP自定义Application继承MultiDexApplication
public class MyApplication extends MultiDexApplication {
}或者不继承,在Application的attachBaseContext(Context base)中开启分包
public class MyApplication{
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}MultiDexApplication也是在attachBaseContext(Context base)方法中去加载安装分包
public class MultiDexApplication extends Application {
public MultiDexApplication() {
}
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}2.3、MultiDex部分源码
看看MultiDex的install()方法
public static void install(Context context) {
Log.i("MultiDex", "Installing application");
if (IS_VM_MULTIDEX_CAPABLE) {
Log.i("MultiDex", "VM具有Multidex支持,MultiDex支持库已禁用.");
} else if (VERSION.SDK_INT < 4) {
throw new RuntimeException("MultiDex installation failed. SDK " + VERSION.SDK_INT
+ " is unsupported. Min SDK version is " + 4 + ".");
} else {
try {
ApplicationInfo applicationInfo = getApplicationInfo(context);
if (applicationInfo == null) {
Log.i("MultiDex", "No ApplicationInfo available,
i.e. running on a test Context: MultiDex support library is disabled.");
return;
}
doInstallation(context, new File(applicationInfo.sourceDir),
new File(applicationInfo.dataDir), "secondary-dexes", "", true);
} catch (Exception var2) {
Log.e("MultiDex", "MultiDex installation failure", var2);
throw new RuntimeException("MultiDex installation failed (" + var2.getMessage() + ").");
}
Log.i("MultiDex", "install done");
}
}可以看见MultiDex对当前系统版本进程了判断:
①如果系统版本大于android 5.0 ART虚拟机 天然支持MultiDex
②系统版本低于android 1.6 抛出异常
③doInstallation MultiDex 处理
参考博客:

