文章目录
Android 插件化系列文章目录
前言
一、合并 “插件包“ 与 “宿主“ 中的 Element[] dexElements
1、获取 “插件包“ 与 “宿主“ 中的 Element[] dexElements 数组长度
2、获取数组元素类型 Element
3、计算合并后的 Element[] dexElements 数组长度
4、创建 Element[] 数组
5、拷贝 Element[] 数组元素
6、完整代码
二、设置 “宿主“ 中的 Element[] dexElements
三、完整代码示例
四、博客资源
前言
在 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “插件包“ 中的 Element[] dexElements ) 博客中介绍了从 " 插件包 " APK 文件中获取 Element[] dexElements 流程 ;
在上一篇博客 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “宿主“ 应用中的 Element[] dexElements ) 介绍了从 " 宿主 " 应用中获取 Element[] dexElements 流程 ;
本篇博客中开始将 " 插件包 " APK 中的 Element[] dexElements 和 “宿主“ 应用中的 Element[] dexElements 合并 ;
一、合并 “插件包“ 与 “宿主“ 中的 Element[] dexElements
将两个 Element[] dexElements 数组合并 , 合并完成后 , 设置到 PathClassLoader 中的 DexPathList pathList 成员的 Element[] dexElements 成员中 ;
1、获取 “插件包“ 与 “宿主“ 中的 Element[] dexElements 数组长度
调用 Java 提供的 Array API 中的 getLength 方法 , 获取数组长度 ;
// 获取 “宿主“ 中的 Element[] dexElements 数组长度 int host_dexElementsLength = Array.getLength(host_dexElementsObject); // 获取 “插件包“ 中的 Element[] dexElements 数组长度 int plugin_dexElementsLength = Array.getLength(plugin_dexElementsObject);
2、获取数组元素类型 Element
获取 Element[] dexElements 数组中的 , 数组元素的 Element 类型 , 获取的是 Element.class ;
// 获取 Element[] dexElements 数组中的 , 数组元素的 Element 类型 // 获取的是 Element.class Class<?> elementClazz = host_dexElementsObject.getClass().getComponentType();
3、计算合并后的 Element[] dexElements 数组长度
// 合并后的 Element[] dexElements 数组长度 int new_dexElementsLength = plugin_dexElementsLength + host_dexElementsLength;
4、创建 Element[] 数组
创建 Element[] 数组 , elementClazz 是 Element.class 数组元素类型 ;
// 创建 Element[] 数组 , elementClazz 是 Element.class 数组元素类型 Object newElementsArray = Array.newInstance(elementClazz, new_dexElementsLength);
5、拷贝 Element[] 数组元素
为新的 Element[] newElementsArray 数组赋值 , 先将 “插件包“ 中的 Element[] dexElements 数组放入到新数组中 , 然后将 “宿主“ 中的 Element[] dexElements 数组放入到新数组中 ;
// 为新的 Element[] newElementsArray 数组赋值 // 先将 “插件包“ 中的 Element[] dexElements 数组放入到新数组中 // 然后将 “宿主“ 中的 Element[] dexElements 数组放入到新数组中 for (int i = 0; i < new_dexElementsLength; i++) { if (i < plugin_dexElementsLength) { // “插件包“ 中的 Element[] dexElements 数组放入到新数组中 Array.set(newElementsArray, i, Array.get(plugin_dexElementsObject, i)); } else { // “宿主“ 中的 Element[] dexElements 数组放入到新数组中 Array.set(newElementsArray, i, Array.get(host_dexElementsObject, i - plugin_dexElementsLength)); } }
6、完整代码
完整代码 :
// 3. 合并 “插件包“ 与 “宿主“ 中的 Element[] dexElements // 将两个 Element[] dexElements 数组合并 , // 合并完成后 , 设置到 PathClassLoader 中的 // DexPathList pathList 成员的 Element[] dexElements 成员中 // 获取 “宿主“ 中的 Element[] dexElements 数组长度 int host_dexElementsLength = Array.getLength(host_dexElementsObject); // 获取 “插件包“ 中的 Element[] dexElements 数组长度 int plugin_dexElementsLength = Array.getLength(plugin_dexElementsObject); // 获取 Element[] dexElements 数组中的 , 数组元素的 Element 类型 // 获取的是 Element.class Class<?> elementClazz = host_dexElementsObject.getClass().getComponentType(); // 合并后的 Element[] dexElements 数组长度 int new_dexElementsLength = plugin_dexElementsLength + host_dexElementsLength; // 创建 Element[] 数组 , elementClazz 是 Element.class 数组元素类型 Object newElementsArray = Array.newInstance(elementClazz, new_dexElementsLength); // 为新的 Element[] newElementsArray 数组赋值 // 先将 “插件包“ 中的 Element[] dexElements 数组放入到新数组中 // 然后将 “宿主“ 中的 Element[] dexElements 数组放入到新数组中 for (int i = 0; i < new_dexElementsLength; i++) { if (i < plugin_dexElementsLength) { // “插件包“ 中的 Element[] dexElements 数组放入到新数组中 Array.set(newElementsArray, i, Array.get(plugin_dexElementsObject, i)); } else { // “宿主“ 中的 Element[] dexElements 数组放入到新数组中 Array.set(newElementsArray, i, Array.get(host_dexElementsObject, i - plugin_dexElementsLength)); } }