Android分包MultiDex源码分析
概述
Android开发者应该都遇到了64K最大方法数限制的问题,针对这个问题,google也推出了multidex分包机制,在生成apk的时候,把整个应用拆成n个dex包(classes.dex、classes2.dex、classes3.dex),每个dex不超过64k个方法。使用multidex,在5.0以前的系统,应用安装时只安装main dex(包含了应用启动需要的必要class),在应用启动之后,需在Application的attachBaseContext中调用MultiDex.install(base)方法,在这时候才加载第二、第三…个dex文件,从而规避了64k问题。
当然,在attachBaseContext方法中直接install启动second dex会有一些问题,比如install方法是一个同步方法,当在主线程中加载的dex太大的时候,耗时会比较长,可能会触发ANR。不过这是另外一个问题了,解决方法可以参考:Android最大方法数和解决方案 http://blog.csdn.net/shensky711/article/details/52329035。
本文主要分析的是MultiDex.install()到底做了什么,如何把secondary dexes中的类动态加载进来。
MultiDex使用到的路径解析
- ApplicationInfo.sourceDir:apk的安装路径,如/data/app/com.hanschen.multidex-1.apk
- Context.getFilesDir():返回
/data/data/<packagename>/files目录,一般通过openFileOutput方法输出文件到该目录 - ApplicationInfo.dataDir: 返回
/data/data/<packagename>目录
源码分析
代码入口
代码入口很简单,简单粗暴,就调用了一个静态方法MultiDex.install(base);,传入一个Context对象
1 |
|