浅谈Android的multidex加载

来源:互联网 发布:sql alter table 编辑:程序博客网 时间:2024/06/05 19:32

          做安卓app开发的童鞋多数我想都碰到过65535这个最大方法数的问题,如果时间回退到几年前,我想自己一定是一脸懵逼,不过好在google爸爸给我们提供了一个从打包  到加载的完整解决方案multidex,刚接触时并没有深入进行过原理了解,最近空闲时完整的看来一边源码  和朋友们浅谈一下自己的理解与感受  如果有理解不妥的地方  请童鞋们多多指正。

         要说multidex的原理,我们必须重classloader说起,当然一看到这个类做java开发的或许都很熟悉,它的具体作用我就不详细介绍了,只大概讲解一下我的理解,当然我不讲双亲委派模式,我们都知道android运行app都是依赖虚拟机的,当然不论是dalvik还是art,都是用来解析执行指令的,在这我们从第一步解析谈起,我们开发编译出来的可安装文件apk里面的dex就是我们app的指令代码,这个dex文件class类代码在运行时会被虚拟机解析映射成c++层class结构,这个结构也不复杂,有兴趣的童鞋可以自行阅读art的源码,我们都知道java有类路径的概念,在开发时需要引入类的全路径或者用全路径反射,这个路径标识类的位置,这个位置又和class形成唯一映射的关系,这个映射关系需要来维护和查找,这个查找维护java层的类就是classloaer,当然虚拟机的c++层也有一个classloader类,但这个类只负责维护classtable,具体负责dex中的class解析和类路径维护的是classloadercontextt类,有兴趣的童鞋请自行阅读c++源码。

        说完classloader,我们回到正题,google解决65535的方法其实大家都知道,就是分dex,简单点就是有很多dex,其中有一个主dex虚拟机自行负责加载映射,其余dex需要手动加载映射,这时候就用到了classloader,它可以查找class,当然也可以加载class,multidex在进行分包的时候,会在apk中形成例如

classes.dex、classes2.dex、classes3.dex的形式,在装载的时候会先把这些除主dex以外的dex文件解压到cache中,然后利用dexclassloader的pathList对象进行装载,multidex中的代码进行装载代码是通过反射的pathList这个字段的对象类DexPathList进行的,有兴趣的童鞋可以自己下载源码进行阅读,这里我就讲解到这,如有理解不妥  请多多指正