Android 热更新实现原理及代码分析
来源:互联网 发布:linux 还原系统时间 编辑:程序博客网 时间:2024/06/05 23:07
最近Android社区的氛围很不错嘛,连续放出一系列的Android动态加载插件和热更新库,这篇文章就来介绍一下Android中实现热更新的原理。
ClassLoader
我们知道Java在运行时加载对应的类是通过ClassLoader来实现的,ClassLoader本身是一个抽象来,Android中使用PathClassLoader类作为Android的默认的类加载器,
PathClassLoader其实实现的就是简单的从文件系统中加载类文件。PathClassLoade本身继承自BaseDexClassLoader,BaseDexClassLoader重写了findClass方法,
该方法是ClassLoader的核心
看源码可知,BaseDexClassLoader将findClass方法委托给了pathList对象的findClass方法,pathList对象是在BaseDexClassLoader的构造函数中new出来的,它的类型是DexPathList。看下DexPathList.findClass源码是如何做的:
直接就是遍历dexElements列表,然后通过调用element.dexFile对象上的loadClassBinaryName方法来加载类,如果返回值不是null,就表示加载类成功,会将这个Class对象返回。而dexElements对象是在DexPathList类的构造函数中完成初始化的。
makeDexElements所做的事情就是遍历我们传递来的dexPath,然后一次加载每个dex文件。
上面分析了Android中的类的加载的流程,可以看出来DexPathList对象中的dexElements列表是类加载的一个核心,一个类如果能被成功加载,那么它的dex一定
会出现在dexElements所对应的dex文件中,并且dexElements中出现的顺序也很重要,在dexElements前面出现的dex会被优先加载,一旦Class被加载成功,
就会立即返回,也就是说,我们的如果想做hotpatch,一定要保证我们的hotpacth dex文件出现在dexElements列表的前面。
要实现热更新,就需要我们在运行时去更改PathClassLoader.pathList.dexElements,由于这些属性都是private的,因此需要通过反射来修改。另外,构造我们自己的dex文件
所对应的dexElements数组的时候,我们也可以采取一个比较取巧的方式,就是通过构造一个DexClassLoader对象来加载我们的dex文件,并且调用一次dexClassLoader.loadClass(dummyClassName);
方法,这样,dexClassLoader.pathList.dexElements中,就会包含我们的dex,通过把dexClassLoader.pathList.dexElements插入到系统默认的classLoader.pathList.dexElements列表前面,就可以让系统优先加载我们的dex中的类,从而可以实现热更新了。下面展示一部分代码
- Android 热更新实现原理及代码分析
- Android 热更新实现原理及代码分析
- android热更新实现原理及代码分析
- Android热更新实现原理
- Android热更新实现原理
- Android热更新实现原理
- Android热更新实现原理
- cocos2d热更新代码分析
- Android热更新原理记录
- android原生热修复流程和原理分析实现
- android APK更新原理以及代码实现
- Lua热更新原理及示例
- [Unity 热更新]tolua原理及实践
- Android快速实现热更新
- Android快速实现热更新
- android 热更新的实现
- Android快速实现热更新
- Android热更新实现方式
- shell函数【参数传递及输入输出】&内置函数
- Leetcode 5 - Longest Palindromic Substring
- NSFileManager (文件管理器 读、写操作)
- Android中通知的提示音、震动和LED灯效果小例子
- Android版添加phonegap--百度云插件教程
- Android 热更新实现原理及代码分析
- shell的内置命令
- <context:property-placeholder/>作用
- 动态生成带logo的二维码
- Objective-c语言_延展
- video classroom number
- 穷孩子没有春天?——寒门子弟为何离一线高校越来越远
- cacti的目录迁移发现的问题
- IDEA中设置热部署