Android 插件化
前言
Android的可执行文件是 dex文件,运行在 Dalvik/ART虚拟机上,在apk文件中会有一个或多个 dex文件,而我们写的所有的代码都会被编译到这些 dex文件中,Android运行的时候就是通过执行这些 dex文件来完成应用功能的。
什么是插件化?
插件化顾名思义,更多是想把需要实现的模块或功能当做一个独立的提取出来,减少宿主的规模,当需要使用到相应的功能时再去加载相应的模块,通常是apk或者dex文件,插件可以提供一种动态扩展的能力,让app在运行时候可以加载原本不属于该应用的功能,可以做到动态更新和替换
例如:
比如输入法的截图功能,刚刚安装好的输入法是没有截图功能的,当你在第一次使用的时候,输入法会从服务器中下载并安装截图软件,然后就可以执行截图功能;
插件化的基础
插件化的基础是动态加载,动态加载的核心是:动态调用外部的 dex文件,有一种极端情况就是:Android Apk自身带有的 dex文件只是一个程序的入口,所有的功能可以直接从服务器中下载 最新的 dex文件来完成;
Android动态加载的类型
1>:动态加载 so库;
2>:动态加载 dex/jar/apk;
Android动态加载的流程
动态加载流程如下:
1>:把可执行的文件,如dex、含有dex文件的jar、apk,拷贝到应用私有目录下,防止被篡改,
2>:加载可执行的文件;
3>:调用其对应方法,执行逻辑即可;
类加载器
android中的类加载器和java中的不同,dex文件是Android对与Class文件做的优化,以便于提高手机的性能。可以想象dex为class文件的一个压缩文件。dex在Android中的加载和class在jvm中的相同都是基于双亲委派模型,都是调用ClassLoader的loadClass方法加载类
android中有两种类加载器
- DexClassLoader:可以加载jar/apk/dex,可以加载sd卡中未安装的apk;
2 .PathClassLoader:只能加载系统中已经安装过的 apk;
PathClassLoader和DexClassLoader都是继承与BaseDexClassLoader,BaseDexClassLoader继承与ClassLoader
第三方动态加载框架
1>:Small;
2>:DL动态加载框架;
3>:360的RePlugin;
4>:360的DroidPlugin;