Android Multidex分包

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

Ant实现分包

核心步骤:将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

猜你喜欢

转载自blog.csdn.net/zhouxinxin250/article/details/79792770