首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【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装载机 * 尝试加载加载器(大多数情况下 * 方法的调用方

25620
您找到你想要的搜索结果了吗?
是的
没有找到

热修复

双亲委派:所谓的双亲委派,则是先让父加载器试图加载该Class,只有加载器无法加载该类尝试从自己的路径中加载该类。...通俗的讲,就是某个特定的加载器接到加载的请求,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成加载任务,就成功返回;只有父加载器无法完成此加载任务,才自己去加载。 缓存机制。...是Zygote进程的入口方法中创建的,PathClassLoader则是Zygote进程创建SystemServer进程创建的。...的构造函数,其实DexPathList的findClass()方法很简单,就只是对Element数组进行遍历,一旦找到名与name相同的,就直接返回这个class,找不到则返回null。...的分析,我们知道,安卓的加载器加载一个时会先从自身DexPathList对象中的Element数组中获取(Element[] dexElements)到对应的,之后再加载。

89420

【Android 逆向】Dalvik 函数抽取加壳 ② ( 加载流程分析 | ClassLoader#loadClass 分析 | BaseDexClassLoader#findClass 分析 )

则自己开始加载 // 如果自己加载不了 , 则继续委托给子节点执行加载 if (clazz == null) { clazz = findClass(className); } 实际加载的方法是...{ /** * 加载具有指定名称的,可以选择 * 装载。...这 * 参数Android参考实现中被忽略; * 未解析。 * @ClassNotFoundException * 如果找不到该类。 */ protected Class<?...); DexPathList pathList 成员 BaseDexClassLoader 构造函数 , 即实例化时 , public BaseDexClassLoader(String dexPath...* * @param dexPath 包含和 * 资源,由{@code File.pathSeparator}分隔,其中 * Android的默认值为{@code”:“} * @param

22330

关于Android中自定义ClassLoader耗时问题的追查

因为双亲委托机制,所以宿主中所有的加载都会走到 DelegateClassLoader.findClass 中,但是 DelegateClassLoader 中因为不存在宿主,所以必然找不到,因此一个宿主的加载会多调用了一次无用的... JVM 中,第一次加载,肯定之前是没有加载过的,因此 findLoadedClass 应该是返回 null 的,而 BootClassLoader 中只有系统,因此宿主的加载应该是调用了 PathClassLoader...中加载的(app image的作用是记录已经编译好的“热代码”,并且启动一次性把它们加载到缓存,参考Tinker博客)。...ART 对 class 加载做的一个优化,但是 Dalvik 中是没有这段逻辑的,可以参考/dalvik/native/javalangVMClassLoader.cpp。...结论 Android ART 中默认的 ClassLoader 机制, ClassLoader#findLoadedClass 就把 JVM 中的 findLoadedClass 和 findClass

1.5K10

手动实现Android热修复

我们BaseDexClassLoader中实例化DexPathList需要用到 findClass方法, BaseDexClassLoader的findClass中, 本质调用了DexpathList...的构造函数中已经初始化了dexElements,所以这个方法就很好理解了,只是对Element数组进行遍历,一旦找到名与name相同的,就直接返回这个class,找不到则返回null。...2.热修复的实现方法 加载class会使用BaseDexClassLoader,加载,会遍历文件下的element,并从element中获取dex文件 方案 ,class文件dex里面 , 找到dex...恩 , 接下来我们要修复bug,并且将修复好的包放进sd卡里面,这样Splash开始就会自动遍历到dex。...因为dex中的class文件是包名.名的形式 , 所以我们在做dex文件, 也要讲相对应的包名加上 . 这里反编译一个demo作为例子: ?

70350

Android插件化学习之路(二)之ClassLoader完全解析

ClassLoader加载过,那么以后整个系统的生命周期内,这个永远不会被重新加载。...DexClassLoader与PathClassLoader 平时开发的时候,使用DexClassLoader就够用了,但是我们不妨挖一下这两者具体细节的区别。...} } return null; } 这里遍历了之前所有的DexFile实例,其实也就是遍历了所有加载过的dex文件,再调用loadClassBinaryName方法一个个尝试能不能加载想要的...** Android程序比起使用动态加载麻烦在哪里 ** 通过上面的分析,我们知道使用ClassLoader动态加载一个外部的是非常容易的事情,所以很容易就能实现动态加载新的可执行代码的功能,但是比起一般的...如果是运行时动态加载进来的新,那里面用到R.id的地方将会抛出找不到资源或者用错资源的异常,因为新的资源ID根本和现有的Resource实例中保存的资源ID对不上;

54030

Android热修复原理解析

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

71130

【Android 逆向】Dalvik 函数抽取加壳 ④ ( 加载流程分析 | native 函数查询 | dalvik_system_DexFile.cpp#defineClassNative函数)

defineClassNative 函数 二、dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineClassNative 函数分析 前言 一篇博客...【Android 逆向】Dalvik 函数抽取加壳 ( 加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )...这大致相当于defineClass() * 常规VM中——装入器调用它以导致 * 创建特定。不同之处在于,搜索和 * 字节的读取是VM中完成的。...* * 名是一个“二进制名称”,例如“java.lang.String”。 * * 如果找不到,则返回空指针,无异常。 * 在其他失败引发异常。...异常,请扼杀它,因为 * 较高方法中的contract表示,如果 * 找不到该类。

35910

货拉拉 Android 动态资源管理系统原理与实践(下)

一步中,我们已经将so文件从系统apk构建流程中删除,并且拷贝到了指定目录下。那么现在我们应该做什么呢? 将so文件打包成.zip压缩包。 生成该资源对应的实体DynamicPkgInfo。...保证第三方sdk缺少so文件,不崩溃 很多三方sdk都要求应用启动,进行初始化,一个使用so库的的典型代码如下: public class ThirdLib{ //静态方法加载so库 static...so库异常,将该库的名称保存下来,我们的so包被正常下发加载后,再次调用本方法,将so库load到系统中。...将so包路径加入DexPathList的数组头部。 遍历等待加载so列表,尝试加载所有so文件,并将成功加载的so文件,移除该列表。 将资源id和本地路径加入缓存,防止so被重复加载。...其他方法调用到我们的SoloadUtil,我们判断我们的加载系统是否初始化完成 已完成,则调用Relinkder库尝试加载so文件,未完成则将该so库加入待加载队列中。

1K31

面试官:今日头条启动很快,你觉得可能是做了哪些优化?

二、启动优化 直奔主题,常见的启动优化方式大概有这些: 闪屏页优化 MultipDex优化(本文重点) 第三方库懒加载 WebView优化 线程优化 系统调用优化 2.1 闪屏页优化 消除启动的白屏/...需要注意的是闪屏页的Activity,包括闪屏页中引用到的其它必须在主dex中,不然MultiDex.install之前加载这些不在主dex中的会报错Class Not Found。.../launchtest/SplashActivity.class 已有项目中用这种方式,一顿操作猛如虎之后,编译运行在4.4的机器,启动闪屏页,加载完准备进入主页直接崩掉了。...**第三方库中的ContentProvider必须指定在主dex中,否则也会找不到,为什么?...所以这种方案的缺点很明显: MultiDex加载逻辑放在闪屏页的话,闪屏页中引用到的都要配置主dex。

1K30

Android动态加载入坑指南

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

2.1K113

Android中的热修复

Android中的加载是通过DexClassLoader,DexClassLoader中使用DexpathList将所有的dex文件加载到dexElements数组中,进行.class加载的时候,...如上图,我们将一个修复后的Class文件HotFixTest文件打包成一个patch.dex文件,App启动的时候,动态的将其加载到dexElements的最开始位置,这样App加载的时候就会优先的加载这个热修复的...Tinker会创建一个TinkerClassLoader加载器,在这个加载器中尝试加载class(loadClass),要是TinkerClassLoader加载不到class文件,会将加载任务提交到...Android加载的时候,会遍历pathList对象的dexElements数组,该数据中是apk下所有dex文件的信息,开始加载class文件的时候,会遍历dexElements数组,查看class...Android10禁止了dex文件的动态加载,所以无法对基准版本和patch文件的dex进行合并优化,从而无法实现替换的功能,Tinker针对Android10,通过反射机制PackageManagerService

1.9K10

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

DexPathList 中通过 File 生成 DexFile 的源码 , makeDexElements 中调用了 loadDexFile 方法 , loadDexFile 又有调用了 DexFile.loadDexFile...这门课原则与我们的课相似 * {@link java.util.zip.ZipFile}。它主要由装入器使用。 * * 注意,我们不直接打开并读取这里的DEX文件。...这门课原则与我们的课相似 * {@link java.util.zip.ZipFile}。它主要由装入器使用。 * * 注意,我们不直接打开并读取这里的DEX文件。...这门课原则与我们的课相似 * {@link java.util.zip.ZipFile}。它主要由装入器使用。 * * 注意,我们不直接打开并读取这里的DEX文件。... * 失败,将引发IOException。

38530

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

文章目录 一、DexClassLoader 加载器构造函数分析 二、DexPathList 引入 一、DexClassLoader 加载器构造函数分析 ---- DexClassLoader 是加载..., 都定义 BaseDexClassLoader.java 代码中 ; DexClassLoader 的构造函数 , 调用了 BaseDexClassLoader 的构造函数 ; public class...} } 源码路径 : /libcore/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java 查询 ClassLoader 源码..., 源码路径中检索出两个 ClassLoader , 分别是 Dalvik 下的 ClassLoader : /libcore/libdvm/src/main/java/java/lang/ClassLoader.java..., 因此分析的是 /libcore/libdvm/src/main/java/java/lang/ClassLoader.java 源码 ; BaseDexClassLoader 中调用的 ClassLoader

30560

Tinker原理

Dalvik虚拟机中,总是在运行时通过JIT(Just-In—Time)把字节码文件编译成机器码文件再执行,这样跑起来程序就很慢,所在ART,改为AOT(Ahead-Of—Time)提前编译,即在安装应用或...但是AOT有个缺点就是每次执行的时间都太长了,并且占用的ROM空间又很大,所以Android NGoogle做了混合编译同时支持JIT和AOT。...混合编译的作用简单来说,应用运行时分析运行过的代码以及“热代码”,并将配置存储下来。设备空闲与充电,ART仅仅编译这份配置中的“热代码”。...app image中已经存在的会被插入到ClassLoader的ClassTable,再次加载,直接从ClassTable中取而不会走DefineClass。...也就是说Adex.loader配置中的,补丁后,A依然oldDex1中,而A的直接引用B却出现在了newDex1中,并且之前A已经被打上了preverify标志,所在A再去newDex1中加载

53310
领券