首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Android加载之PathClassLoader和DexClassLoader

---- 一篇文章 自定义ClassLoader和双亲委派机制 讲述了 JVM 中的的加载机制,Android 也是 JVM 虚拟机那么它的加载机制是什么呢,我们来探究一下(PS:文章源码为 Android5.1...而 Java 虚拟机是加载 class 文件,也可以一段二进制流通过 defineClass 方法生产 Class 进行加载(PS: 自定义ClassLoader和双亲委派机制 文章后面的自定义加载器就是通过这种方式实现的...dex Android 中的加载和 class jvm 中的相同都是基于双亲委派模型,都是调用ClassLoader 的 loadClass 方法加载。...= new ArrayList(); //自己的成员变量DexPathList中寻找,找不到抛异常 Class c = pathList.findClass...失败时,引发IOException。

2.3K10

Android动态加载入坑指南

,但是我们可以加载动态加载外部的dex文件来达到动态加载的目的。...因为加载器是通过包名和名(或者说的全限定名),所以由于委派式加载机制的存在,全限定名相同的不会在有 祖先—子孙 关系的加载器分别加载一次,不管这两个的实现是否一样。...不同的加载器加载的一定是不同的,即使它们的全限定名一样。如果全限定名一样,那么根据一条,这两个加载器一定没有 祖先-子孙 的关系。...这样来看,可以通过自定义加载器使得相同全限定名但实现不同的存在于同一 JVM 中,也就是说,加载器相当于给包名之上又加了个命名空间。...DexPathList public DexPathList(ClassLoader definingContext, String dexPath, String librarySearchPath

2.1K113

Android热修复原理解析

因为PathClassLoaderDalvik虚拟机中只能用来加载已安装apk的,而DexClassLoaderDalvik和ART虚拟机中都能加载未安装apk或者dex中的,所以热修复使用DexClassLoader...> loadClass(String name, boolean resolve) throws ClassNotFoundException { // 首先,从缓存中查找是否已经加载...= null) { // 缓存找不到,就委托给父加载器进行加载 c = parent.loadClass(name, false...,和的查找过程,我们可以发现最终是通过遍历 DexPathList的 dexElements数组进行的查找加载,当找到就返回; dexElements数组的每个元素都代表着一个dex文件,所以为了让补丁包中要替换的抢先于有... patch.dex上传到七牛云的对象存储服务器。 patch.dex七牛对象存储服务器的外链:http://pm3fh7vxn.bkt.clouddn.com/patch.dex ?

70330

【Android 逆向】Dalvik 函数抽取加壳 ③ ( 加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName函数 )

文章目录 前言 一、DexPathList.java#findClass 加载函数源码分析 二、DexFile.java#loadClassBinaryName 函数源码分析 前言 一篇博客 【Android..., BaseDexClassLoader 中的 findClass 方法中 , 主要调用 DexPathList pathList 成员的 findClass 函数查找 ; 一、DexPathList.java...这门课原则与我们的课相似 * {@link java.util.zip.ZipFile}。它主要由装入器使用。 * * 注意,我们不直接打开并读取这里的DEX文件。...* * 如果类 * 找不到,因为每个 * 我们查看的第一个DEX文件中找不到的时间。...* * @param name * 名,看起来应该像“java/lang/String” * * @param装载机 * 尝试加载加载器(大多数情况下 * 方法的调用方

25220

【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 构造函数分析 | makeDexElements 函数分析 )

文章目录 前言 一、DexPathList 构造函数分析 二、DexPathList.makeDexElements 函数分析 三、Element 分析 前言 ---- 一篇博客 【Android...逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 加载器构造函数分析 | DexPathList 引入 ) 中 , 分析了 DexClassLoader 构造函数的调用流程..., 构造函数中执行的核心操作就是 BaseDexClassLoader 的构造函数中 初始化了 DexPathList 实例对象 ; 本篇博客中重点分析 DexPathList ; 一、DexPathList...构造函数分析 ---- DexPathList 构造函数中 , 主要是调用了 makeDexElements() 方法 , 该方法返回 Element[] 数组元素 , 赋值给 private final...三、Element 分析 ---- Element DexPathList 的内部类 , 其第一个成员变量就是 private final File file , 这个就是 dex 文件 ;

22520

手动实现Android热修复

我们BaseDexClassLoader中实例化DexPathList需要用到 findClass方法, BaseDexClassLoader的findClass中, 本质调用了DexpathList...其他的方法姑且不用关心. 1->构造函数 public DexPathList(ClassLoader definingContext, String dexPath, String libraryPath...的构造函数中已经初始化了dexElements,所以这个方法就很好理解了,只是对Element数组进行遍历,一旦找到名与name相同的时,就直接返回这个class,找不到则返回null。...的方法是遍历数组 , 那么热修复的原理, 就是改好bug的dex文件放进集合的头部, 这样遍历时会首先遍历修复好的dex并找到修复好的 ....恩 , 接下来我们要修复bug,并且修复好的包放进sd卡里面,这样Splash开始时就会自动遍历到dex。

69650

浅谈Android热修复的前因后果与实现原理。

ClassLoader 加载自己的class文件 加载过程如下: 过程: 加载-连接(验证-准备-解析)-初始化 加载 的信息(字节码)从文件中获取并载入到JVM的内存中 连接 验证...:检查读入的结构是否符合JVM规范 准备:分配一个结构来存储的信息 解析:的常量池中的所有引用改变成直接引用 初始化 执行静态初始化程序,把静态变量初始化成指定的值 其中用到的三个主要机制...中,我们发现最终加载的是由 DexPathList 来进行的,所以我们进入了 DexPathList 这个中,我们可以发现 初始化的时候,有一个关键方法需要我们注意 makeDexElements...而最开始调用的 DexPathList中的findClass() 反而是由Element 调用的 findClass方法,而Emement的findClass方法中实际又是 DexFile 调用的 loadClassBinaryName...最后我们再用一张图来总结一下Android 中加载的过程。 了解完上面的知识之后,我们来总结一下,Android中热修复的原理?

93320

Android So动态加载 优雅实现与原理分析

,最后复制到 apk 安装目录下; System.load(String pathName) :参数为 so 库磁盘中完整的路径,可以加载自定义外部 so 库文件; 使用第三方库ReLinker,有so...比如x86库服务器下发,动态加载,瘦身效果非常可观。但是采取常规load方式,改动有点大,底层jar包,第三库不好改加载路径。...应用启动的时,一次注入本地so路径path,待程序使用过程中so准备后安全加载。(原因后面分析,我们先看下实践) 一. 下载So文件到sdk卡 二. copy So文件到app缓存空间 三....我们进入Runtime的loadLibrary0()方法看看。...directory : getLibPaths()) { // getLibPaths()代码最下方 String candidate = directory + filename;

1.8K20

浅谈Android热更新的前因后果

ClassLoader 加载自己的class文件 加载过程如下: 过程:加载-连接(验证-准备-解析)-初始化 加载 的信息(字节码)从文件中获取并载入到JVM的内存中 连接 验证:检查读入的结构是否符合...JVM规范 准备:分配一个结构来存储的信息 解析:的常量池中的所有引用改变成直接引用 初始化 执行静态初始化程序,把静态变量初始化成指定的值 其中用到的三个主要机制: 双亲委托机制 全盘负责机制...中,我们发现最终加载的是由 DexPathList 来进行的,所以我们进入了 DexPathList 这个中,我们可以发现 初始化的时候,有一个关键方法需要我们注意 makeDexElements...而最开始调用的 DexPathList中的findClass() 反而是由Element 调用的 findClass方法,而Emement的findClass方法中实际又是 DexFile 调用的 loadClassBinaryName...最后我们再用一张图来总结一下Android 中加载的过程。 ? 了解完上面的知识之后,我们来总结一下,Android中热修复的原理?

1.6K40

热修复

3、系统加载器 SystemClassLoader 它负责加载系统路径java -classpath或-D java.class.path 指定路径下的库,也就是我们经常用到的classpath...parent:父加载器 DexClassLoader PathClassLoader DexPathList BaseDexClassLoader 总体来说,DexPathList的构造函数是一个个的程序文件...DexPathList的findClass()方法很简单,就只是对Element数组进行遍历,一旦找到名与name相同的时,就直接返回这个class,找不到则返回null。...的分析,我们知道,安卓的加载器加载一个时会先从自身DexPathList对象中的Element数组中获取(Element[] dexElements)到对应的,之后再加载。...找到错误的之后,错误的打包程dex文件,将其放在dexElements中的最前方。

88920

Android So动态加载 优雅实现与原理分析

apk 安装目录下; System.load(String pathName) :参数为 so 库磁盘中完整的路径,可以加载自定义外部 so 库文件; 使用第三方库ReLinker,有so加载成功、...比如x86库服务器下发,动态加载,瘦身效果非常可观。但是采取常规load方式,改动有点大,底层jar包,第三库不好改加载路径。...应用启动的时,一次注入本地so路径path,待程序使用过程中so准备后安全加载。(原因后面分析,我们先看下实践) 一. 下载So文件到sdk卡 二. copy So文件到app缓存空间 三....我们进入Runtime的loadLibrary0()方法看看。...directory : getLibPaths()) { // getLibPaths()代码最下方 String candidate = directory + filename;

5.6K64
领券