首页 > 其他分享 >基于类加载的dex热修复分析

基于类加载的dex热修复分析

时间:2023-01-03 14:55:28浏览次数:34  
标签:dex Java 修复 classloader var 加载

dex文件的热修复方法有很多,例如通过类加载器或者偏底层的实现通过修改ArtMethod。这里只分析基于类加载器的dex热修复原理,实际dex插件化的原理和热修复的原理也有类似之处。

dex热修复原理

android虚拟机中每一个classloader类加载器都有一个对应的DexPathList类,而DexPathList类有一个对应的Elements数组,Elements数组中保存了此classloader类加载器加载的所有dex文件信息,dex文件信息用一个DexFile类来描述。

DexFile中保存了加载的dex文件信息,其中包含了此dex文件包含的所有类名称,在通过主动调用脱函数抽取类壳的时候就是通过枚举apk中所有的类加载器并通过反射最后得到所有加载dex文件对应的DexFile,通过DexFile进一步获取到所有的类名称通过classloader类加载器调用loadclass主动加载(显式加载)此类从而使被抽取的函数代码进行回填。

function dealwithClassLoader(classloaderobj) {
    if (Java.available) {
        Java.perform(function () {
            try {
                var dexfileclass = Java.use("dalvik.system.DexFile");
                var BaseDexClassLoaderclass = Java.use("dalvik.system.BaseDexClassLoader");
                var DexPathListclass = Java.use("dalvik.system.DexPathList");
                var Elementclass = Java.use("dalvik.system.DexPathList$Element");
                var basedexclassloaderobj = Java.cast(classloaderobj, BaseDexClassLoaderclass);
                var tmpobj = basedexclassloaderobj.pathList.value;
                var pathlistobj = Java.cast(tmpobj, DexPathListclass);
                var dexElementsobj = pathlistobj.dexElements.value;
                if (dexElementsobj != null) {
                    for (var i in dexElementsobj) {
                        var obj = dexElementsobj[i];
                        var elementobj = Java.cast(obj, Elementclass);
                        tmpobj = elementobj.dexFile.value;
                        var dexfileobj = Java.cast(tmpobj, dexfileclass);
                        const enumeratorClassNames = dexfileobj.entries();
                        while (enumeratorClassNames.hasMoreElements()) {
                            var className = enumeratorClassNames.nextElement().toString();
                            if(-1 != className.indexOf("com.reverccqin")){
                                console.log("start loadclass->", className);
                                var loadclass = classloaderobj.loadClass(className);
                                console.log("after loadclass->", loadclass);
                            }
                        }
                    }
                }
            } catch (e) {
                console.log(e)
            }
        });
    }
}

对于基于类加载器的dex热修复而言,其通过动态下发更新的dex文件并通过自定义的类加载器加载此dex文件。然后通过反射获取到默认classloader和自定义classloader中待更新dex文件对应的Element,将默认classloader的Element替换位自定义classloader的Element即可实现热修复。

这样的之后显式/隐式加载类的行为都会从热修复后的Element中得到对应的类信息并进行调用执行,热修复实现了不必要更新应用程序在程序运行时修改程序执行逻辑。

标签:dex,Java,修复,classloader,var,加载
From: https://www.cnblogs.com/revercc/p/17022213.html

相关文章

  • 第十九章《类的加载与反射》第4节:注解
    ​在8.10小节曾经简单的介绍过注解,但当时只是简单的介绍了3个注解的作用,本小节将详细讲解注解的相关知识。注解始于JDK1.5,在Java语言中以Annotation接口表示注解。注解其实......
  • 第十九章《类的加载与反射》第3节:反射
    ​JAVA的反射机制是指在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对......
  • 第十九章《类的加载与反射》第1节:类的加载、连接和初始化
    ​在6.1小节中曾经讲过:创建对象前会完成类加载的操作。实际上,如果在程序中使用new关键字来创建一个对象,虚拟机会在创建对象之前需要完成一系列准备工作,类的加载只是这些工作......
  • devexpress控件教程 能加载任何控件的下拉菜单
    DevExpress控件很强大,今天开始写一些关于这个控件的博客,希望能对小伙伴们有所帮助。今天的内容是打造一个万能的下拉菜单控件。一般来说,ComboBoxEdit控件已经够用了,加载编......
  • 加载白屏指南
    据说jsdeliver国内被污染,导致页面难以加载,“阅读全文”后文字图片都显示不出来。我发现这个问题只在PC端出现,不影响手机端浏览,PC端不管换什么浏览器结果都打不开,目前没找到......
  • webpack4.15.1 学习笔记(七) — 懒加载(Lazy Loading)
    懒加载或者按需加载,是一种很好的优化网页或应用的方式。实际上是先把代码在一些逻辑断点处分离开,然后在一些代码块中完成某些操作后,立即引用或引用另外一些新的代码块。这......
  • 03.基础框架场景和资源加载模块
    ​​​https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadSceneAsync.html​​usingSystem.Collections;usingSystem.Collections.Generic;usi......
  • [WARNING] Resolved [org.springframework.web.HttpMediaTypeNotSupportedException:
    这是json转对象失败的报错 这是web层的代码   这是报错      解决方法: 第一步:请求body选raw,并选择application/json类型   第......
  • AI修复照片
    一、前言最近闲来无事,翻了翻以前的老照片,看着多年前的老照片,感慨万千,仿佛又回到了以前的青春岁月。只可惜青春易逝,无法重来。意气风发,头角峥嵘的画面只能永远地留存在相......
  • JVM(三)类加载与字节码技术
    一、类文件结构首先获得.class字节码文件方法:在文本文档里写入java代码(文件名与类名一致),将文件类型改为.javajava终端中,执行javacX:...\XXX.java以下是字节码文......