【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 加载完毕-----------------------------------------




目录
相关文章
|
21天前
|
缓存 Java 数据库
Android的ANR原理
【10月更文挑战第18天】了解 ANR 的原理对于开发高质量的 Android 应用至关重要。通过合理的设计和优化,可以有效避免 ANR 的发生,提升应用的性能和用户体验。
48 8
|
1月前
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
35 3
|
2月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
45 2
|
1月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
46 0
|
1月前
|
Java 调度 Android开发
Android面试题之Kotlin中async 和 await实现并发的原理和面试总结
本文首发于公众号“AntDream”,详细解析了Kotlin协程中`async`与`await`的原理及其非阻塞特性,并提供了相关面试题及答案。协程作为轻量级线程,由Kotlin运行时库管理,`async`用于启动协程并返回`Deferred`对象,`await`则用于等待该对象完成并获取结果。文章还探讨了协程与传统线程的区别,并展示了如何取消协程任务及正确释放资源。
24 0
|
1月前
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
43 0
|
2月前
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
31 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
370 0
|
22天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
45 1
|
27天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。