- 一、合并两个 Element[] dexElements
- 二、 完整修复包加载工具类
- 三、 源码资源
在 【Android 热修复】热修复原理 ( 加载 Dex 文件到内存中 | DexClassLoader | PathClassLoader | 反射 Element[] dexElements ) 博客中已经将 系统加载的 Dex 文件对应的 Element[] dexElements 通过 PathClassLoader 类加载器获取到了 , 同时修复包对应 Dex 文件 Element[] dexElements 通过 DexClassLoader 类加载器获取到了 ;
下面开始将修复包对应的 Element[] dexElements 合并到系统 PathClassLoader 中的 Element[] dexElements 数组中 ;
在 【Android 热修复】热修复原理 ( 加载 Dex 文件到内存中 | DexClassLoader | PathClassLoader | 反射 Element[] dexElements ) 博客中
将系统 PathClassLoader pathClassLoader 的 DexPathList pathList 对象的 Element[] dexElements 成员systemDexElementsObject
与
自己在程序中的 DexClassLoader dexClassLoader 的 DexPathList pathList 对象的 Element[] dexElements 成员myDexElementsObject
进行融合 , 将 myDexElementsObject 插入到 systemDexElementsObject ;
首先要获取 Dex 数组 , 但是 Element 类型无法引用 , 不是公开的 ;
先获取 Element 类型 , 调用对象的 .getClass().getComponentType()
获取 ;
// 获取 Dex 数组 , Element 类型无法引用 , 不是公开的
// 首先获取 Element 类型
// systemDexElementsObject
Class elementClass = systemDexElementsObject.getClass().getComponentType();
获取两个 Element[] dexElements 数组的成员个数 ;
// 获取两个 Element[] dexElements 数组的成员个数
// 系统中的 PathClassLoader 中的 Element[] dexElements 数组大小
int systemDexCount = Array.getLength(systemDexElementsObject);
// 本应用中的 DexClassLoader 中的 Element[] dexElements 数组大小
int myDexCount = Array.getLength(myDexElementsObject);
使用 Array.newInstance
重新创建一个数组, 数组的长度是两个数组之和 ;
// 重新创建一个数组
// 类型 : Class elementClass
// 长度 : systemDexCount + myDexCount
Object elementArray =
Array.newInstance(elementClass, systemDexCount + myDexCount);
填充创建的数组 , 这里特别注意 , 数组中的元素的顺序很重要 , 一定要先放置修复包中的数组元素 , 然后放置应用自带的 Dex 数组内容 , 这个顺序一定不能乱 ;
// 填充数组内容, 这里特别注意 , 数组中的元素的顺序很重要 ,
// 同样类型的类 , 在多个 Dex 都存在 , 如果在前面的 Dex 中查找到了 , 就不再向后查找了
// 修复包的 Dex 要放在最前面 , 这样才能起到修复作用
// 先放置修复包 Dex
for(int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?