【Android 热修复】热修复原理 ( 加载 Dex 文件到内存中 | DexClassLoader | PathClassLoader | 反射 Element[] dexElements )(二)

简介: 【Android 热修复】热修复原理 ( 加载 Dex 文件到内存中 | DexClassLoader | PathClassLoader | 反射 Element[] dexElements )(二)

4、反射获取系统的 Element[] dexElements


获取 DexPathList pathList 对象 : 通过反射获取 BaseDexClassLoader 类 , 然后反射获取 BaseDexClassLoader 中的 private final DexPathList pathList 字段 , 由于是私有成员字段 , 需要设置可访问性 ;


通过系统类加载器 , 获取系统的 PathClassLoader pathClassLoader 对象的 DexPathList pathList 成员 ;



获取 Element[] dexElements 数组 : 通过反射获取 DexPathList 类 , 然后反射获取 获取 DexPathList 类中的 private final Element[] dexElements 成员字段 , 由于是私有成员字段 , 需要设置可访问性 , 最后获取 DexPathList pathList 对象的 Element[] dexElements 成员 ;



代码示例 :


// 加载系统的 Element[] dexElements ---------------------------------------------
// 反射获取 BaseDexClassLoader 类对象
Class systemBaseDexClassLoaderClass =
        Class.forName("dalvik.system.BaseDexClassLoader");
// 反射获取 BaseDexClassLoader 中的 private final DexPathList pathList 字段
Field systemPathListField =
        systemBaseDexClassLoaderClass.getDeclaredField("pathList");
// 由于是私有成员字段 , 需要设置可访问性
systemPathListField.setAccessible(true);
// 获取系统的 PathClassLoader pathClassLoader 对象的
// private final DexPathList pathList 成员
Object systemPathListObject = systemPathListField.get(pathClassLoader);
// 获取 DexPathList 类
Class systemPathListClass = systemPathListObject.getClass();
// 获取 DexPathList 类中的 private final Element[] dexElements 成员字段
Field systemDexElementsField =
        systemPathListClass.getDeclaredField("dexElements");
// 由于是私有成员字段 , 需要设置可访问性
systemDexElementsField.setAccessible(true);
// 获取 DexPathList pathList 对象的 Element[] dexElements 成员
Object systemDexElementsObject =
        systemDexElementsField.get(systemPathListObject);
// 系统的 Element[] dexElements 加载完毕-----------------------------------------



5、反射获取自己加载的 修复包 Dex 的 Element[] dexElements


获取 DexPathList pathList 对象 : 通过反射获取 BaseDexClassLoader 类 , 然后反射获取 BaseDexClassLoader 中的 private final DexPathList pathList 字段 , 由于是私有成员字段 , 需要设置可访问性 ;


通过系统类加载器 , 获取系统的 PathClassLoader pathClassLoader 对象的 DexPathList pathList 成员 ;



获取 Element[] dexElements 数组 : 通过反射获取 DexPathList 类 , 然后反射获取 获取 DexPathList 类中的 private final Element[] dexElements 成员字段 , 由于是私有成员字段 , 需要设置可访问性 , 最后获取 DexPathList pathList 对象的 Element[] dexElements 成员 ;



代码示例 :


// 加载自己的 Element[] dexElements ---------------------------------------------
// 反射获取 BaseDexClassLoader 类对象
Class myBaseDexClassLoaderClass =
        Class.forName("dalvik.system.BaseDexClassLoader");
// 反射获取 BaseDexClassLoader 中的 private final DexPathList pathList 字段
Field myPathListField =
        myBaseDexClassLoaderClass.getDeclaredField("pathList");
// 由于是私有成员字段 , 需要设置可访问性
myPathListField.setAccessible(true);
// 获取系统的 PathClassLoader pathClassLoader 对象的
// private final DexPathList pathList 成员
Object myPathListObject = myPathListField.get(pathClassLoader);
// 获取 DexPathList 类
Class myPathListClass = myPathListObject.getClass();
// 获取 DexPathList 类中的 private final Element[] dexElements 成员字段
Field myDexElementsField =
        myPathListClass.getDeclaredField("dexElements");
// 由于是私有成员字段 , 需要设置可访问性
myDexElementsField.setAccessible(true);
// 获取 DexPathList pathList 对象的 Element[] dexElements 成员
Object myDexElementsObject = myDexElementsField.get(myPathListObject);
// 自己的 Element[] dexElements 加载完毕-----------------------------------------




目录
相关文章
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
1154 55
|
分布式计算 算法 Java
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
483 1
|
Linux Windows
反射内存卡驱动的安装
【8月更文挑战第28天】以下是反射内存卡驱动安装的一般步骤:首先确认内存卡型号及操作系统版本,并从制造商官网下载兼容的驱动程序。安装时,运行安装包,按提示接受许可协议,选择安装路径,连接内存卡,并完成安装,可能需重启计算机。最后,通过设备管理器验证安装是否成功,如遇问题可查阅相关文档或求助技术支持。
408 4
jmap 查看jvm内存大小并进行dump文件内存分析
jmap 查看jvm内存大小并进行dump文件内存分析
1058 3
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
610 0
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
547 0
|
Java 测试技术 Android开发
Android项目架构设计问题之使用反射调用类的私有方法如何解决
Android项目架构设计问题之使用反射调用类的私有方法如何解决
387 0
|
存储 缓存 Java
android 加载图片oom若干方案小结
本文根据网上提供的一些技术方案加上自己实际开发中遇到的情况小结。 众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视手机而定)。一般我们可以通过获取当前线程的可运行内存来判断,比如系统分给当前运行内存只有16M,而你的图片就有16M,这肯定会oom的。 相关知识介绍 1.颜色模型 常见的颜色模型有RGB、YUV、
1711 0
|
Android开发 数据格式 XML
android -- 加载gif 防止oom
项目中涉及到gif图片的展示,原来使用的是gifview,但是当频繁的,加载过大图片的时候会出现OOM的问题,后来去github上面找相关的库: https://github.com/koral--/android-gif-drawable android-gif-drawable是比较好的,并...
1344 0

热门文章

最新文章