缘由及作用
App方法爆棚
方法数超过了一个Dex最大方法数65535的上限,可以通过多个 Dex来解决这个问题,因而便有了插件化的概念,将一个App 划分为多个插件(Dex或相关格式)
其他解决方法还包括:删无用代码,用H5代替部分逻辑,买付费版的Proguard作用
a、模块解耦;
b、动态升级;
c、高效并行开发(编译速度更快) ;
d、按需加载,内存占用更低;
e、节省升级流量
原理
插件化的原理实际是 Java ClassLoader 的原理,具体可参考Java ClassLoader基础
但是对比于java还是有区别的:
- Java ClassLoader加载的是class文件到JVM
- 对于Android应用程序,本质上使用的是java开发,使用标准的java编译器编译出Class文件,和普通的java开发不同的地方是把class文件再重新打包成dex类型的文件,这种重新打包会对Class文件内部的各种函数表、变量表等进行优化,最终产生了dex文件。
在Android中可以动态加载,但无法像Java中那样方便动态加载jar
原因:Android的虚拟机(Dalvik VM)是不认识Java打出jar的byte code,需要通过dx工具来优化转换成Dalvik byte code才行。这一点在Android项目打包的apk中可以看出:引入其他Jar的内容都被打包进了classes.dex。
将打包的jar包拷贝到SDK安装目录android-sdk-windows\platform-tools下,执行命令:dx –dex –output=test.jar suishen_exitpage_sdk.jar
Android ClassLoader
- DexClassLoader API地址
用来从.jar和.apk类型的文件内部加载classes.dex文件,通过这种方式可以执行非安装的程序代码,作为程序的一部分进行运行。 - PathClassLoader
只能加载已经安装到Android系统中的apk文件,一般用于系统应用。
DexClassLoader的使用:
调用构造函数,获得classLoader对象
通过classLoader加载相应的类,反射调用方法。
开源项目
- dynamic-load-apk
缺点:遵守一套插件apk的开发规范,开发不便。
DynamicLoadApk 源码解析
git上源码地址 - AndroidDynamicLoader
git上源码地址