参考资料:
Android dex分包方案
Android分包MultiDex原理
《Android开发艺术探索》
博客中间会涉及到dex文件的反编译,参考博文:
dex文件的反编译-dex2jar和jd-gui
1.dex分包的原因
对于功能越来越复杂的app的两大问题
-
问题一:当项目越来越大,方法数超过65536,编译时会出错(为什么是65536,参考下面关于dexopt对方法id检索存储介绍),这个所说的方法数包含用到的框架,依赖的jar包,当然还有我们应用本身的代码中的所有方法。
我们可以写个Demo看看报的具体错误。 那我们写个65536以上个方法,可以用java的IO流向一个txt里写入65537个方法。
public class MethodWriter {
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("demo.txt");
for(int i = 1 ; i <= 65537; i++){
fw.write( "public void me" + i + "(){ }\r\n" );
fw.flush();
}
fw.close();
}
}
然后复制txt文件里的方法到AS工程里即可。注意,将这些方法分别放在几个类下面,保证每个类不要超过65536。我们所说的65536限制是整个项目的限制。下面,我们分两种方案放置这些方法,运行项目,看看AS会有什么结果。
方案一:我们自己应用的方法数超过了65536
我们所说的方法数限制,这个方法数包括了jar包,框架,还有我们自己应用的代码,当我们应用的代码超过65536时,结果如下: