Multidex分包:
一个apk包里面可以包含多个dex.
分包要解决的问题:
android5.0之前使用的dvm虚拟机,dvm虚拟机里以short保存一个dex里面的方法数。在java里面,short类型(16位)的最大值是65535。一旦一个dex里面的方法数超过了65535就会抛出异常。
Java中常用的类加载器:
BootClassLoader
纯C++实现的类加载器,没有对应的Java类,主要加载jre/lib/目录下的核心库
ExtClassLoader
主要加载/jre/lib/ext/目录下的扩展包
AppClassLoader
主要加载CLASSPATH路径下的包
采用父委托加载机制,先交给父类去加载,没找到才子类加载。
为什么采用父委托加载机制?
创建一个jdk目录和名字一样的类,依然加载的是jdk里面的类,能够提高软件系统的安全性。
Android常用的类加载器:
PathClassLoader
加载data/app目录下的apk文件
DexClassLoader
加载路径需要在创建时传入,也就是可以加载任意路径下的apk/dex/jar
核心步骤:将DexClassLoader插入到PathClassLoader和BootClassLoader中间。
Gradle分包
启用分包
defaultConfig {
multiDexEnabled true
}
引入依赖库
compile 'com.android.support:multidex:1.0.1'
在自定义Application中插入MultiDex.install
public class MyApplication extends Application {
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
分包原理:将DexClassLoader的加载路径追加到PathClassLoader的加载路径中
常见问题:OutOfMemoryError
dexOptions {
javaMaxHeapSize "2g"
}
两种分包的比较:
Ant分包:
优:可以指定哪些类放入分Dex
缺:分Dex不能混淆
如果分Dex引用了主Dex中的类此方法失效
Gradle分包
优:使用简单,配置即可
分Dex可以混淆
缺:不能指定哪些类放入分Dex