目录
一.动态加载技术介绍
在程序运行的时候,加载一些程序自身不存在的可执行文件并运行这些文件里的代码逻辑。动态加载具有一下几个特点:
- 应用在运行的时候加载一些本地不存在的可执行文件实现一些特定的功能;
- 这些可执行文件是可以替换的;
- 更换静态资源不属于动态加载,如换启动图,换主题或者用服务器开关控制广告的隐藏实现等;
- Android中动态加载的核心思想是动态调用外部的dex文件。
二.动态加载技术的类型
在Android项目中,动态加载技术按照加载的可执行文件可以分为两种。
1.动态加载so库
Android的NDK中其实就是使用了动态加载.so库并通过JNI调用其封装的方法。后者一般是由C/C++编译而成,运行在Native层效率比在虚拟机执行的java代码高很多,所以Android经常加载动态.so库来完成一些对性能要求比较高的工作,如T9搜索,Bitmap的解码,图片的高斯模糊等。
2.动态加载dex/jar/apk文件
Android项目中,所有的java代码都会被编译成dex文件,Android应用运行时,就是通过执行dex文件里的业务逻辑来工作的。使用动态加载技术可以在Android应用运行是加载外部的dex文件,通过网络下载新的dex文件并替换原有的dex文件就可以达到不安装新的APK文件就升级应用的目的。
三.类加载器的概念
类加载器(Class Loader)是Java中一个很重要的概念,类加载器负责加载java类的字节码到Java虚拟机中。在Android中的类加载器有DexClassLoader和PathClassLoader。它们的区别是:
- DexClassLoader:可以加载jar/apk/dex,可以从SD卡中加载未安装的apk;
- PathClassLoader:只能加载已经安装的apk文件。
四.动态加载的原理
无论哪种动态加载其基本原理就是在程序运行时加载一些外部的可执行文件,然后调用这些文件的某个方法执行业务逻辑。对于这些外部的可执行文件,在Android应用调用前都要先把它们拷贝到data/packagename/内部存储文件路径,使用类加载器加载相应的文件通过反射获取内部资源,以供宿主APP的使用,动态加载的大致过程就是:
- 把可执行文件(.so/dex/jar/apk)拷贝到应用APP内部存储;
- 加载可执行文件;
- 调用具体的方法执行业务;
五.动态加载的实现方式
1.简单动态加载模式
通过JDK的编译命令javac把jiava代码编译成.class文件,再使用jar命令把.class文件封装成.jar文件。最后使用Android SDK的DX工具把.jar文件优化成.dex文件。
通过DexClassLoade