您当前的位置: 首页 >  android

韩曙亮

暂无认证

  • 3浏览

    0关注

    1068博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android 热修复】热修复原理 ( 合并两个 Element[] dexElements | 自定义 Application 加载 Dex 设置 | 源码资源 )

韩曙亮 发布时间:2021-04-14 21:27:02 ,浏览量:3

文章目录
  • 一、合并两个 Element[] dexElements
  • 二、 完整修复包加载工具类
  • 三、 源码资源

一、合并两个 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             
关注
打赏
1663594092
查看更多评论
0.0436s